Merge pull request #43473 from nextcloud/backport/43353/stable28

This commit is contained in:
John Molakvoæ 2024-02-09 14:16:00 +01:00 committed by GitHub
commit ad46f5841f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 121 additions and 35 deletions

View file

@ -0,0 +1,32 @@
/**
* @copyright Copyright (c) 2024 Ferdinand Thiessen <opensource@fthiessen.de>
*
* @author Ferdinand Thiessen <opensource@fthiessen.de>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export const getRowForFile = (filename: string) => cy.get(`[data-cy-files-list-row-name="${CSS.escape(filename)}"]`)
export const getActionsForFile = (filename: string) => getRowForFile(filename).find('[data-cy-files-list-row-actions]')
export const getActionButtonForFile = (filename: string) => getActionsForFile(filename).find('button[aria-label="Actions"]')
export const triggerActionForFile = (filename: string, actionId: string) => {
getActionButtonForFile(filename).click()
cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`).should('exist').click()
}

View file

@ -0,0 +1,68 @@
/**
* @copyright Copyright (c) 2024 Ferdinand Thiessen <opensource@fthiessen.de>
*
* @author Ferdinand Thiessen <opensource@fthiessen.de>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import { getRowForFile, triggerActionForFile } from './FilesUtils.ts'
/**
* This is a regression test for https://github.com/nextcloud/server/issues/43331
* Where files with XML entities in their names were wrongly displayed and could no longer be renamed / deleted etc.
*/
describe('Files: Can handle XML entities in file names', { testIsolation: false }, () => {
before(() => {
cy.createRandomUser().then((user) => {
cy.uploadContent(user, new Blob(), 'text/plain', '/and.txt')
cy.login(user)
cy.visit('/apps/files/')
})
})
it('Can reanme to a file name containing XML entities', () => {
cy.intercept('MOVE', /\/remote.php\/dav\/files\//).as('renameFile')
triggerActionForFile('and.txt', 'rename')
getRowForFile('and.txt')
.find('form[aria-label="Rename file"] input')
.type('{selectAll}&amp;.txt{enter}')
cy.wait('@renameFile')
getRowForFile('&amp;.txt').should('be.visible')
})
it('After a reload the filename is preserved', () => {
cy.reload()
getRowForFile('&amp;.txt').should('be.visible')
getRowForFile('&.txt').should('not.exist')
})
it('Can delete the file', () => {
cy.intercept('DELETE', /\/remote.php\/dav\/files\//).as('deleteFile')
triggerActionForFile('&amp;.txt', 'delete')
cy.wait('@deleteFile')
cy.contains('.toast-success', /Delete .* successfull/)
.should('be.visible')
getRowForFile('&amp;.txt').should('not.exist')
cy.reload()
getRowForFile('&amp;.txt').should('not.exist')
getRowForFile('&.txt').should('not.exist')
})
})

View file

@ -20,13 +20,7 @@
*
*/
const getRowForFile = (filename: string) => cy.get(`[data-cy-files-list-row-name="${filename}"]`)
const getActionsForFile = (filename: string) => getRowForFile(filename).find('[data-cy-files-list-row-actions]')
const getActionButtonForFile = (filename: string) => getActionsForFile(filename).find('button[aria-label="Actions"]')
const triggerActionForFile = (filename: string, actionId: string) => {
getActionButtonForFile(filename).click()
cy.get(`[data-cy-files-list-row-action="${actionId}"] > button`).should('exist').click()
}
import { getRowForFile, triggerActionForFile } from './FilesUtils.ts'
describe('Files: Move or copy files', { testIsolation: true }, () => {
let currentUser

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,3 @@
/*! https://mths.be/base64 v1.0.0 by @mathias | MIT license */
/*! https://mths.be/he v1.2.0 by @mathias | MIT license */
/**
* @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
*

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,3 @@
/*! https://mths.be/base64 v1.0.0 by @mathias | MIT license */
/*! https://mths.be/he v1.2.0 by @mathias | MIT license */
/**
* @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>
*

File diff suppressed because one or more lines are too long

4
dist/core-common.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
dist/files-init.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

8
package-lock.json generated
View file

@ -89,7 +89,7 @@
"vuedraggable": "^2.24.3",
"vuex": "^3.6.2",
"vuex-router-sync": "^5.0.0",
"webdav": "^5.3.1",
"webdav": "^5.3.2",
"xml2js": "^0.6.2"
},
"devDependencies": {
@ -26495,9 +26495,9 @@
}
},
"node_modules/webdav": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/webdav/-/webdav-5.3.1.tgz",
"integrity": "sha512-wzZdTHtMuSIXqHGBznc8FM2L94Mc/17Tbn9ppoMybRO0bjWOSIeScdVXWX5qqHsg00EjfiOcwMqGFx6ghIhccQ==",
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/webdav/-/webdav-5.3.2.tgz",
"integrity": "sha512-wfUh68rccDcH1A9W5gdcAflBm0EOeXrX3LwKbdDLWR0SDFE5QTPfLXPkDit+zGC0tRihCD9qzPfIVEUFoc7MwA==",
"dependencies": {
"@buttercup/fetch": "^0.1.1",
"base-64": "^1.0.0",

View file

@ -116,7 +116,7 @@
"vuedraggable": "^2.24.3",
"vuex": "^3.6.2",
"vuex-router-sync": "^5.0.0",
"webdav": "^5.3.1",
"webdav": "^5.3.2",
"xml2js": "^0.6.2"
},
"devDependencies": {