From b8dcfb9a4a35e95404e36803b59fa6c0934f919c Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Wed, 21 Aug 2024 19:28:55 +0200 Subject: [PATCH] chore(cypress): allow db snapshot and restore fo faster tests Signed-off-by: skjnldsv --- cypress/dockerNode.ts | 16 -------------- cypress/e2e/settings/personal-info.cy.ts | 27 ++++++++++++++++++------ cypress/support/commands.ts | 23 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/cypress/dockerNode.ts b/cypress/dockerNode.ts index ab9651059c652..53215f4d89154 100644 --- a/cypress/dockerNode.ts +++ b/cypress/dockerNode.ts @@ -135,22 +135,6 @@ export const configureNextcloud = async function() { console.log('└─ Nextcloud is now ready to use 🎉') } -export const createSnapshot = async function(): Promise { - console.log('\nSaving Nextcloud DB...') - const randomString = Math.random().toString(36).substring(7) - const container = docker.getContainer(CONTAINER_NAME) - await runExec(container, ['cp', '/var/www/html/data/owncloud.db', '/var/www/html/data/owncloud.db-' + randomString], true) - console.log('└─ Done') - return randomString -} - -export const restoreSnapshot = async function(snapshot: string) { - console.log('\nRestoring Nextcloud DB...') - const container = docker.getContainer(CONTAINER_NAME) - await runExec(container, ['cp', '/var/www/html/data/owncloud.db-' + snapshot, '/var/www/html/data/owncloud.db'], true) - console.log('└─ Done') -} - /** * Applying local changes to the container * Only triggered if we're not in CI. Otherwise the diff --git a/cypress/e2e/settings/personal-info.cy.ts b/cypress/e2e/settings/personal-info.cy.ts index 491d8206b5e4d..746717b5fb48e 100644 --- a/cypress/e2e/settings/personal-info.cy.ts +++ b/cypress/e2e/settings/personal-info.cy.ts @@ -102,11 +102,23 @@ const genericProperties = ['Location', 'X (formerly Twitter)', 'Fediverse'] const nonfederatedProperties = ['Organisation', 'Role', 'Headline', 'About'] describe('Settings: Change personal information', { testIsolation: true }, () => { + let snapshot: string = '' before(() => { // ensure we can set locale and language cy.runOccCommand('config:system:delete force_language') cy.runOccCommand('config:system:delete force_locale') + cy.createRandomUser().then(($user) => { + user = $user + cy.modifyUser(user, 'language', 'en') + cy.modifyUser(user, 'locale', 'en_US') + }) + + cy.wait(500) + + cy.backupDB().then(($snapshot) => { + snapshot = $snapshot + }) }) after(() => { @@ -115,16 +127,15 @@ describe('Settings: Change personal information', { testIsolation: true }, () => }) beforeEach(() => { - cy.createRandomUser().then(($user) => { - user = $user - cy.modifyUser(user, 'language', 'en') - cy.modifyUser(user, 'locale', 'en_US') - cy.login($user) - cy.visit('/settings/user') - }) + cy.login(user) + cy.visit('/settings/user') cy.intercept('PUT', /ocs\/v2.php\/cloud\/users\//).as('submitSetting') }) + afterEach(() => { + cy.restoreDB(snapshot) + }) + it('Can dis- and enable the profile', () => { cy.visit(`/u/${user.userId}`) cy.contains('h2', user.userId).should('be.visible') @@ -132,6 +143,7 @@ describe('Settings: Change personal information', { testIsolation: true }, () => cy.visit('/settings/user') cy.contains('Enable profile').click() handlePasswordConfirmation(user.password) + cy.wait('@submitSetting') cy.visit(`/u/${user.userId}`, { failOnStatusCode: false }) cy.contains('h2', 'Profile not found').should('be.visible') @@ -139,6 +151,7 @@ describe('Settings: Change personal information', { testIsolation: true }, () => cy.visit('/settings/user') cy.contains('Enable profile').click() handlePasswordConfirmation(user.password) + cy.wait('@submitSetting') cy.visit(`/u/${user.userId}`, { failOnStatusCode: false }) cy.contains('h2', user.userId).should('be.visible') diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 6ca0388a0a0b8..e5aa11df775f8 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -65,6 +65,17 @@ declare global { * Run an occ command in the docker container. */ runOccCommand(command: string, options?: Partial): Cypress.Chainable, + + /** + * Create a snapshot of the current database + */ + backupDB(): Cypress.Chainable, + + /** + * Restore a snapshot of the database + * Default is the post-setup state + */ + restoreDB(snapshot?: string): Cypress.Chainable, } } } @@ -276,3 +287,15 @@ Cypress.Commands.add('runOccCommand', (command: string, options?: Partial `-e '${name}=${value}'`).join(' ') return cy.exec(`docker exec --user www-data ${env} nextcloud-cypress-tests-server php ./occ ${command}`, options) }) + +Cypress.Commands.add('backupDB', (): Cypress.Chainable => { + const randomString = Math.random().toString(36).substring(7) + cy.exec(`docker exec 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 nextcloud-cypress-tests-server cp /var/www/html/data/owncloud.db-${snapshot} /var/www/html/data/owncloud.db`) + cy.log(`Restored snapshot ${snapshot}`) +})