Instead of downloading files, if there is no other default action, we should just open the details tab. Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>pull/50669/head
parent
24f2e93393
commit
dbc5c10bc4
@ -0,0 +1,180 @@ |
||||
/*! |
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors |
||||
* SPDX-License-Identifier: AGPL-3.0-or-later |
||||
*/ |
||||
|
||||
import type { User } from '@nextcloud/cypress' |
||||
import { join } from 'path' |
||||
import { getRowForFileId } from './FilesUtils.ts' |
||||
|
||||
/** |
||||
* Check that the sidebar is opened for a specific file |
||||
* @param name The name of the file |
||||
*/ |
||||
function sidebarIsOpen(name: string): void { |
||||
cy.get('[data-cy-sidebar]') |
||||
.should('be.visible') |
||||
.findByRole('heading', { name }) |
||||
.should('be.visible') |
||||
} |
||||
|
||||
/** |
||||
* Skip a test without viewer installed |
||||
*/ |
||||
function skipIfViewerDisabled(this: Mocha.Context): void { |
||||
cy.runOccCommand('app:list --enabled --output json') |
||||
.then((exec) => exec.stdout) |
||||
.then((output) => JSON.parse(output)) |
||||
.then((obj) => 'viewer' in obj.enabled) |
||||
.then((enabled) => { |
||||
if (!enabled) { |
||||
this.skip() |
||||
} |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* Check a file was not downloaded |
||||
* @param filename The expected filename |
||||
*/ |
||||
function fileNotDownloaded(filename: string): void { |
||||
const downloadsFolder = Cypress.config('downloadsFolder') |
||||
cy.readFile(join(downloadsFolder, filename)).should('not.exist') |
||||
} |
||||
|
||||
describe('Check router query flags:', function() { |
||||
let user: User |
||||
let imageId: number |
||||
let archiveId: number |
||||
let folderId: number |
||||
|
||||
before(() => { |
||||
cy.createRandomUser().then(($user) => { |
||||
user = $user |
||||
cy.uploadFile(user, 'image.jpg') |
||||
.then((response) => { imageId = Number.parseInt(response.headers['oc-fileid']) }) |
||||
cy.mkdir(user, '/folder') |
||||
.then((response) => { folderId = Number.parseInt(response.headers['oc-fileid']) }) |
||||
cy.uploadContent(user, new Blob([]), 'application/zstd', '/archive.zst') |
||||
.then((response) => { archiveId = Number.parseInt(response.headers['oc-fileid']) }) |
||||
cy.login(user) |
||||
}) |
||||
}) |
||||
|
||||
describe('"opendetails"', () => { |
||||
it('open details for known file type', () => { |
||||
cy.visit(`/apps/files/files/${imageId}?opendetails`) |
||||
|
||||
// see sidebar
|
||||
sidebarIsOpen('image.jpg') |
||||
|
||||
// but no viewer
|
||||
cy.findByRole('dialog', { name: 'image.jpg' }) |
||||
.should('not.exist') |
||||
|
||||
// and no download
|
||||
fileNotDownloaded('image.jpg') |
||||
}) |
||||
|
||||
it('open details for unknown file type', () => { |
||||
cy.visit(`/apps/files/files/${archiveId}?opendetails`) |
||||
|
||||
// see sidebar
|
||||
sidebarIsOpen('archive.zst') |
||||
|
||||
// but no viewer
|
||||
cy.findByRole('dialog', { name: 'archive.zst' }) |
||||
.should('not.exist') |
||||
|
||||
// and no download
|
||||
fileNotDownloaded('archive.zst') |
||||
}) |
||||
|
||||
it('open details for folder', () => { |
||||
cy.visit(`/apps/files/files/${folderId}?opendetails`) |
||||
|
||||
// see sidebar
|
||||
sidebarIsOpen('folder') |
||||
|
||||
// but no viewer
|
||||
cy.findByRole('dialog', { name: 'folder' }) |
||||
.should('not.exist') |
||||
|
||||
// and no download
|
||||
fileNotDownloaded('folder') |
||||
}) |
||||
}) |
||||
|
||||
describe('"openfile"', function() { |
||||
/** Check the viewer is open and shows the image */ |
||||
function viewerShowsImage(): void { |
||||
cy.findByRole('dialog', { name: 'image.jpg' }) |
||||
.should('be.visible') |
||||
.find(`img[src*="fileId=${imageId}"]`) |
||||
.should('be.visible') |
||||
} |
||||
|
||||
it('opens files with default action', function() { |
||||
skipIfViewerDisabled.call(this) |
||||
|
||||
cy.visit(`/apps/files/files/${imageId}?openfile`) |
||||
viewerShowsImage() |
||||
}) |
||||
|
||||
it('opens files with default action using explicit query state', function() { |
||||
skipIfViewerDisabled.call(this) |
||||
|
||||
cy.visit(`/apps/files/files/${imageId}?openfile=true`) |
||||
viewerShowsImage() |
||||
}) |
||||
|
||||
it('does not open files with default action when using explicitly query value `false`', function() { |
||||
skipIfViewerDisabled.call(this) |
||||
|
||||
cy.visit(`/apps/files/files/${imageId}?openfile=false`) |
||||
getRowForFileId(imageId) |
||||
.should('be.visible') |
||||
.and('have.class', 'files-list__row--active') |
||||
|
||||
cy.findByRole('dialog', { name: 'image.jpg' }) |
||||
.should('not.exist') |
||||
}) |
||||
|
||||
it('does not open folders but shows details', () => { |
||||
cy.visit(`/apps/files/files/${folderId}?openfile`) |
||||
|
||||
// See the URL was replaced
|
||||
cy.url() |
||||
.should('match', /[?&]opendetails(&|=|$)/) |
||||
.and('not.match', /openfile/) |
||||
|
||||
// See the sidebar is correctly opened
|
||||
cy.get('[data-cy-sidebar]') |
||||
.should('be.visible') |
||||
.findByRole('heading', { name: 'folder' }) |
||||
.should('be.visible') |
||||
|
||||
// see the folder was not changed
|
||||
getRowForFileId(imageId).should('exist') |
||||
}) |
||||
|
||||
it('does not open unknown file types but shows details', () => { |
||||
cy.visit(`/apps/files/files/${archiveId}?openfile`) |
||||
|
||||
// See the URL was replaced
|
||||
cy.url() |
||||
.should('match', /[?&]opendetails(&|=|$)/) |
||||
.and('not.match', /openfile/) |
||||
|
||||
// See the sidebar is correctly opened
|
||||
cy.get('[data-cy-sidebar]') |
||||
.should('be.visible') |
||||
.findByRole('heading', { name: 'archive.zst' }) |
||||
.should('be.visible') |
||||
|
||||
// See no file was downloaded
|
||||
const downloadsFolder = Cypress.config('downloadsFolder') |
||||
cy.readFile(join(downloadsFolder, 'archive.zst')).should('not.exist') |
||||
}) |
||||
}) |
||||
}) |
Loading…
Reference in new issue