mirror of
https://github.com/nextcloud/server.git
synced 2026-04-20 22:00:39 -04:00
chore: Update @nextcloud/cypress to v1.0.0-beta.11
Signed-off-by: Louis Chemineau <louis@chmn.me>
This commit is contained in:
parent
3822db5174
commit
ebda7b45f6
14 changed files with 42 additions and 83 deletions
2
.github/workflows/cypress.yml
vendored
2
.github/workflows/cypress.yml
vendored
|
|
@ -162,7 +162,7 @@ jobs:
|
|||
|
||||
- name: Create data dir archive
|
||||
if: failure() && matrix.containers != 'component'
|
||||
run: docker exec nextcloud-cypress-tests-server tar -cvjf - data > data.tar
|
||||
run: docker exec nextcloud-cypress-tests_server tar -cvjf - data > data.tar
|
||||
|
||||
- name: Upload data dir archive
|
||||
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
|
||||
|
|
|
|||
|
|
@ -9,13 +9,13 @@
|
|||
import Docker from 'dockerode'
|
||||
import waitOn from 'wait-on'
|
||||
import { c as createTar } from 'tar'
|
||||
import path from 'path'
|
||||
import path, { basename } from 'path'
|
||||
import { execSync } from 'child_process'
|
||||
import { existsSync } from 'fs'
|
||||
|
||||
export const docker = new Docker()
|
||||
|
||||
const CONTAINER_NAME = 'nextcloud-cypress-tests-server'
|
||||
const CONTAINER_NAME = `nextcloud-cypress-tests_${basename(process.cwd()).replace(' ', '')}`
|
||||
const SERVER_IMAGE = 'ghcr.io/nextcloud/continuous-integration-shallow-server'
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -92,16 +92,12 @@ export function setupPublicShare(): Cypress.Chainable<string> {
|
|||
return cy.task('getVariable', { key: 'public-share-data' })
|
||||
.then((data) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const { dataSnapshot, dbSnapshot, shareUrl } = data as any || {}
|
||||
if (dataSnapshot && dbSnapshot) {
|
||||
cy.restoreDB(dbSnapshot)
|
||||
cy.restoreData(dataSnapshot)
|
||||
const { dataSnapshot, shareUrl } = data as any || {}
|
||||
if (dataSnapshot) {
|
||||
cy.restoreState(dataSnapshot)
|
||||
url = shareUrl
|
||||
return cy.wrap(shareUrl as string)
|
||||
} else {
|
||||
cy.restoreData()
|
||||
cy.restoreDB()
|
||||
|
||||
const shareData: Record<string, unknown> = {}
|
||||
return cy.createRandomUser()
|
||||
.then(($user) => { user = $user })
|
||||
|
|
@ -109,8 +105,7 @@ export function setupPublicShare(): Cypress.Chainable<string> {
|
|||
.then(() => createShare(shareName))
|
||||
.then((value) => { shareData.shareUrl = value })
|
||||
.then(() => adjustSharePermission())
|
||||
.then(() => cy.backupDB().then((value) => { shareData.dbSnapshot = value }))
|
||||
.then(() => cy.backupData([user.userId]).then((value) => { shareData.dataSnapshot = value }))
|
||||
.then(() => cy.saveState().then((value) => { shareData.dataSnapshot = value }))
|
||||
.then(() => cy.task('setVariable', { key: 'public-share-data', value: shareData }))
|
||||
.then(() => cy.log(`Public share setup, URL: ${shareData.shareUrl}`))
|
||||
.then(() => cy.wrap(url))
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ describe('files_sharing: Public share - File drop', { testIsolation: true }, ()
|
|||
})
|
||||
|
||||
describe('Terms of service', { testIsolation: true }, () => {
|
||||
before(() => cy.runOccCommand('config:app:set --value "TEST: Some disclaimer text" --type string core shareapi_public_link_disclaimertext'))
|
||||
before(() => cy.runOccCommand('config:app:set --value \'TEST: Some disclaimer text\' --type string core shareapi_public_link_disclaimertext'))
|
||||
beforeEach(() => cy.visit(shareUrl))
|
||||
after(() => cy.runOccCommand('config:app:delete core shareapi_public_link_disclaimertext'))
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ describe('Versions expiration', () => {
|
|||
})
|
||||
|
||||
it('Expire all versions', () => {
|
||||
cy.runOccCommand('config:system:set versions_retention_obligation --value "0, 0"')
|
||||
cy.runOccCommand('config:system:set versions_retention_obligation --value \'0, 0\'')
|
||||
cy.runOccCommand('versions:expire')
|
||||
cy.runOccCommand('config:system:set versions_retention_obligation --value auto')
|
||||
cy.visit('/apps/files')
|
||||
|
|
@ -38,7 +38,7 @@ describe('Versions expiration', () => {
|
|||
it('Expire versions v2', () => {
|
||||
nameVersion(2, 'v1')
|
||||
|
||||
cy.runOccCommand('config:system:set versions_retention_obligation --value "0, 0"')
|
||||
cy.runOccCommand('config:system:set versions_retention_obligation --value \'0, 0\'')
|
||||
cy.runOccCommand('versions:expire')
|
||||
cy.runOccCommand('config:system:set versions_retention_obligation --value auto')
|
||||
cy.visit('/apps/files')
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ describe('Settings: Change personal information', { testIsolation: true }, () =>
|
|||
cy.login(user)
|
||||
cy.visit('/settings/user')
|
||||
|
||||
cy.backupDB().then(($snapshot) => {
|
||||
cy.saveState().then(($snapshot) => {
|
||||
snapshot = $snapshot
|
||||
})
|
||||
})
|
||||
|
|
@ -136,7 +136,7 @@ describe('Settings: Change personal information', { testIsolation: true }, () =>
|
|||
})
|
||||
|
||||
afterEach(() => {
|
||||
cy.restoreDB(snapshot)
|
||||
cy.restoreState(snapshot)
|
||||
})
|
||||
|
||||
it('Can dis- and enable the profile', () => {
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ describe.only('Settings: Sort groups in the UI', () => {
|
|||
cy.runOccCommand('group:list --output json').then((output) => {
|
||||
const groups = Object.keys(JSON.parse(output.stdout)).filter((group) => group !== 'admin')
|
||||
groups.forEach((group) => {
|
||||
cy.runOccCommand(`group:delete "${group}"`)
|
||||
cy.runOccCommand(`group:delete '${group}'`)
|
||||
})
|
||||
})
|
||||
|
||||
|
|
@ -221,7 +221,7 @@ describe.only('Settings: Sort groups in the UI', () => {
|
|||
cy.runOccCommand('group:add A')
|
||||
cy.runOccCommand('group:add B')
|
||||
cy.createRandomUser().then((user) => {
|
||||
cy.runOccCommand(`group:adduser B "${user.userId}"`)
|
||||
cy.runOccCommand(`group:adduser B '${user.userId}'`)
|
||||
})
|
||||
|
||||
// Visit the settings as admin
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ describe('Accessibility of Nextcloud theming colors', () => {
|
|||
before(() => {
|
||||
cy.createRandomUser().then(($user) => {
|
||||
// set user theme
|
||||
cy.runOccCommand(`user:setting -- '${$user.userId}' theming enabled-themes '["${theme}"]'`)
|
||||
cy.runOccCommand(`user:setting -- '${$user.userId}' theming enabled-themes '[\\"${theme}\\"]'`)
|
||||
cy.login($user)
|
||||
cy.visit('/')
|
||||
cy.injectAxe({ axeCorePath: 'node_modules/axe-core/axe.min.js' })
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ describe('User theming set app order with default app', () => {
|
|||
// install a third app
|
||||
installTestApp()
|
||||
// set files as default app
|
||||
cy.runOccCommand('config:system:set --value "files" defaultapp')
|
||||
cy.runOccCommand('config:system:set --value \'files\' defaultapp')
|
||||
|
||||
// Create random user for this test
|
||||
cy.createRandomUser().then(($user) => {
|
||||
|
|
|
|||
|
|
@ -216,41 +216,9 @@ Cypress.Commands.add('resetUserTheming', (user?: User) => {
|
|||
}
|
||||
})
|
||||
|
||||
Cypress.Commands.add('runOccCommand', (command: string, options?: Partial<Cypress.ExecOptions>) => {
|
||||
const env = Object.entries(options?.env ?? {}).map(([name, value]) => `-e '${name}=${value}'`).join(' ')
|
||||
return cy.exec(`docker exec --user www-data ${env} nextcloud-cypress-tests-server php ./occ ${command}`, options)
|
||||
})
|
||||
|
||||
Cypress.Commands.add('userFileExists', (user: string, path: string) => {
|
||||
user.replaceAll('"', '\\"')
|
||||
path.replaceAll('"', '\\"').replaceAll(/^\/+/gm, '')
|
||||
return cy.exec(`docker exec --user www-data nextcloud-cypress-tests-server stat --printf="%s" "data/${user}/files/${path}"`, { failOnNonZeroExit: true })
|
||||
return cy.runCommand(`stat --printf="%s" "data/${user}/files/${path}"`, { failOnNonZeroExit: true })
|
||||
.then((exec) => Number.parseInt(exec.stdout || '0'))
|
||||
})
|
||||
|
||||
Cypress.Commands.add('backupDB', (): Cypress.Chainable<string> => {
|
||||
const randomString = Math.random().toString(36).substring(7)
|
||||
cy.exec(`docker exec --user www-data nextcloud-cypress-tests-server cp /var/www/html/data/owncloud.db /var/www/html/data/owncloud.db-${randomString}`)
|
||||
cy.log(`Created snapshot ${randomString}`)
|
||||
return cy.wrap(randomString)
|
||||
})
|
||||
|
||||
Cypress.Commands.add('restoreDB', (snapshot: string = 'init') => {
|
||||
cy.exec(`docker exec --user www-data nextcloud-cypress-tests-server cp /var/www/html/data/owncloud.db-${snapshot} /var/www/html/data/owncloud.db`)
|
||||
cy.log(`Restored snapshot ${snapshot}`)
|
||||
})
|
||||
|
||||
Cypress.Commands.add('backupData', (users: string[] = ['admin']) => {
|
||||
const snapshot = Math.random().toString(36).substring(7)
|
||||
const toBackup = users.map((user) => `'${user.replaceAll('\\', '').replaceAll('\'', '\\\'')}'`).join(' ')
|
||||
cy.exec(`docker exec --user www-data rm /var/www/html/data/data-${snapshot}.tar`, { failOnNonZeroExit: false })
|
||||
cy.exec(`docker exec --user www-data --workdir /var/www/html/data nextcloud-cypress-tests-server tar cf /var/www/html/data/data-${snapshot}.tar ${toBackup}`)
|
||||
return cy.wrap(snapshot as string)
|
||||
})
|
||||
|
||||
Cypress.Commands.add('restoreData', (snapshot?: string) => {
|
||||
snapshot = snapshot ?? 'init'
|
||||
snapshot.replaceAll('\\', '').replaceAll('"', '\\"')
|
||||
cy.exec(`docker exec --user www-data --workdir /var/www/html/data nextcloud-cypress-tests-server rm -vfr $(tar --exclude='*/*' -tf '/var/www/html/data/data-${snapshot}.tar')`)
|
||||
cy.exec(`docker exec --user www-data --workdir /var/www/html/data nextcloud-cypress-tests-server tar -xf '/var/www/html/data/data-${snapshot}.tar'`)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import { basename } from 'path'
|
||||
|
||||
/**
|
||||
* Get the header navigation bar
|
||||
*/
|
||||
|
|
@ -49,8 +51,12 @@ export function installTestApp() {
|
|||
cy.runOccCommand('-V').then((output) => {
|
||||
const version = output.stdout.match(/(\d\d+)\.\d+\.\d+/)?.[1]
|
||||
cy.wrap(version).should('not.be.undefined')
|
||||
cy.exec(`docker cp '${testAppPath}' nextcloud-cypress-tests-server:/var/www/html/apps`, { log: true })
|
||||
cy.exec(`docker exec nextcloud-cypress-tests-server sed -i -e 's|-version="[0-9]\\+|-version="${version}|g' apps/testapp/appinfo/info.xml`)
|
||||
getContainerName()
|
||||
.then(containerName => {
|
||||
cy.exec(`docker cp '${testAppPath}' ${containerName}:/var/www/html/apps`, { log: true })
|
||||
cy.exec(`docker exec --workdir /var/www/html ${containerName} chown -R www-data:www-data /var/www/html/apps/testapp`)
|
||||
})
|
||||
cy.runCommand(`sed -i -e 's|-version=\\"[0-9]\\+|-version=\\"${version}|g' apps/testapp/appinfo/info.xml`)
|
||||
cy.runOccCommand('app:enable --force testapp')
|
||||
})
|
||||
}
|
||||
|
|
@ -60,5 +66,15 @@ export function installTestApp() {
|
|||
*/
|
||||
export function uninstallTestApp() {
|
||||
cy.runOccCommand('app:remove testapp', { failOnNonZeroExit: false })
|
||||
cy.exec('docker exec nextcloud-cypress-tests-server rm -fr apps/testapp/appinfo/info.xml')
|
||||
cy.runCommand('rm -fr apps/testapp/appinfo/info.xml')
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function getContainerName(): Cypress.Chainable<string> {
|
||||
return cy.exec('pwd')
|
||||
.then(({ stdout }) => {
|
||||
return cy.wrap(`nextcloud-cypress-tests_${basename(stdout).replace(' ', '')}`)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
20
cypress/support/cypress-e2e.d.ts
vendored
20
cypress/support/cypress-e2e.d.ts
vendored
|
|
@ -53,27 +53,7 @@ declare global {
|
|||
*/
|
||||
resetUserTheming(user?: User): Cypress.Chainable<void>,
|
||||
|
||||
/**
|
||||
* Run an occ command in the docker container.
|
||||
*/
|
||||
runOccCommand(command: string, options?: Partial<Cypress.ExecOptions>): Cypress.Chainable<Cypress.Exec>,
|
||||
|
||||
userFileExists(user: string, path: string): Cypress.Chainable<number>
|
||||
|
||||
/**
|
||||
* Create a snapshot of the current database
|
||||
*/
|
||||
backupDB(): Cypress.Chainable<string>,
|
||||
|
||||
/**
|
||||
* Restore a snapshot of the database
|
||||
* Default is the post-setup state
|
||||
*/
|
||||
restoreDB(snapshot?: string): Cypress.Chainable
|
||||
|
||||
backupData(users?: string[]): Cypress.Chainable<string>
|
||||
|
||||
restoreData(snapshot?: string): Cypress.Chainable
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
8
package-lock.json
generated
8
package-lock.json
generated
|
|
@ -94,7 +94,7 @@
|
|||
"@cypress/vue2": "^2.1.1",
|
||||
"@cypress/webpack-preprocessor": "^6.0.2",
|
||||
"@nextcloud/babel-config": "^1.2.0",
|
||||
"@nextcloud/cypress": "^1.0.0-beta.9",
|
||||
"@nextcloud/cypress": "^1.0.0-beta.11",
|
||||
"@nextcloud/eslint-config": "^8.4.1",
|
||||
"@nextcloud/stylelint-config": "^3.0.1",
|
||||
"@nextcloud/typings": "^1.9.1",
|
||||
|
|
@ -3686,9 +3686,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@nextcloud/cypress": {
|
||||
"version": "1.0.0-beta.9",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/cypress/-/cypress-1.0.0-beta.9.tgz",
|
||||
"integrity": "sha512-i43skZoCkrr5H1L1PsYddzz/SjDlSNcTCrEcMJFRwoHiJo5giUNCz0b2lKEQBMtudP8J+BGfG+AIFA0LJ/oD2A==",
|
||||
"version": "1.0.0-beta.11",
|
||||
"resolved": "https://registry.npmjs.org/@nextcloud/cypress/-/cypress-1.0.0-beta.11.tgz",
|
||||
"integrity": "sha512-8wR0UVfqZXRmQSAeaJg+yw95Smc9zAw35FYckk52PhXhnRugn2J5aqcXMtrQZovdeqak1y5Kjc/t0AJ2QhtnOA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"dockerode": "^4.0.2",
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@
|
|||
"@cypress/vue2": "^2.1.1",
|
||||
"@cypress/webpack-preprocessor": "^6.0.2",
|
||||
"@nextcloud/babel-config": "^1.2.0",
|
||||
"@nextcloud/cypress": "^1.0.0-beta.9",
|
||||
"@nextcloud/cypress": "^1.0.0-beta.11",
|
||||
"@nextcloud/eslint-config": "^8.4.1",
|
||||
"@nextcloud/stylelint-config": "^3.0.1",
|
||||
"@nextcloud/typings": "^1.9.1",
|
||||
|
|
@ -204,4 +204,4 @@
|
|||
"overrides": {
|
||||
"colors": "1.4.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue