From 2e61293654c751daac71a464d31ca1ac80ba04bb Mon Sep 17 00:00:00 2001 From: Louis Chemineau Date: Wed, 20 Nov 2024 10:55:38 +0100 Subject: [PATCH] feat: Export runCommand and runOccCommand And refactor saveState and restoreState to use those. Signed-off-by: Louis Chemineau --- lib/commands/docker.ts | 25 +++++++++++++++++++++++++ lib/commands/index.ts | 2 ++ lib/commands/occ.ts | 10 ++++++++++ lib/commands/state.ts | 34 ++++++++++++---------------------- lib/index.ts | 15 ++++++++++++++- 5 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 lib/commands/docker.ts create mode 100644 lib/commands/occ.ts diff --git a/lib/commands/docker.ts b/lib/commands/docker.ts new file mode 100644 index 00000000..4f91aa90 --- /dev/null +++ b/lib/commands/docker.ts @@ -0,0 +1,25 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { basename } from 'path' + +function getContainerName(): Cypress.Chainable { + return cy.exec('pwd').then(({ stdout }) => { + const name = basename(stdout).replace(' ', '') + return cy.wrap(`nextcloud-cypress-tests_${name}`) + }) +} + +export function runCommand(command: string, options?: Partial) { + const env = Object.entries(options?.env ?? {}) + .map(([name, value]) => `-e '${name}=${value}'`) + .join(' ') + + getContainerName() + .then((containerName) => { + return cy.exec(`docker exec --user www-data --workdir /var/www/html/data ${env} ${containerName} ${command}`, options) + }) + +} diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 67323ab2..a1210bf4 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -7,3 +7,5 @@ export * from './getNc' export * from './sessions' export * from './users' export * from './state' +export * from './docker' +export * from './occ' diff --git a/lib/commands/occ.ts b/lib/commands/occ.ts new file mode 100644 index 00000000..e445a060 --- /dev/null +++ b/lib/commands/occ.ts @@ -0,0 +1,10 @@ +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { runCommand } from "./docker" + +export function runOccCommand(command: string, options?: Partial) { + runCommand(`php ./occ ${command}`, options) +} diff --git a/lib/commands/state.ts b/lib/commands/state.ts index 24875630..5865f5d1 100644 --- a/lib/commands/state.ts +++ b/lib/commands/state.ts @@ -2,26 +2,18 @@ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { basename } from 'path' -const getContainerName = function(): Cypress.Chainable { - return cy.exec('pwd').then(({ stdout }) => { - const app = basename(stdout).replace(' ', '') - return cy.wrap(`nextcloud-cypress-tests_${app}`) - }) -} +import { runCommand } from "./docker" export function saveState(): Cypress.Chainable { const snapshot = Math.random().toString(36).substring(7) - getContainerName().then(name => { - // DB - cy.exec(`docker exec --user www-data ${name} cp /var/www/html/data/owncloud.db /var/www/html/data/owncloud.db-${snapshot}`) + // DB + runCommand(`cp /var/www/html/data/owncloud.db /var/www/html/data/owncloud.db-${snapshot}`) - // Data - 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 ${name} tar cf /var/www/html/data/data-${snapshot}.tar .`) - }) + // Data + runCommand(`rm /var/www/html/data/data-${snapshot}.tar`, { failOnNonZeroExit: false }) + runCommand(`tar cf /var/www/html/data/data-${snapshot}.tar .`) cy.log(`Created snapshot ${snapshot}`) @@ -29,14 +21,12 @@ export function saveState(): Cypress.Chainable { } export function restoreState(snapshot: string = 'init') { - getContainerName().then(name => { - // DB - cy.exec(`docker exec --user www-data ${name} cp /var/www/html/data/owncloud.db-${snapshot} /var/www/html/data/owncloud.db`) - - // Data - cy.exec(`docker exec --user www-data --workdir /var/www/html/data ${name} rm -vfr $(tar --exclude='*/*' -tf '/var/www/html/data/data-${snapshot}.tar')`) - cy.exec(`docker exec --user www-data --workdir /var/www/html/data ${name} tar -xf '/var/www/html/data/data-${snapshot}.tar'`) - }) + // DB + runCommand(`cp /var/www/html/data/owncloud.db-${snapshot} /var/www/html/data/owncloud.db`) + + // Data + runCommand(`rm -vfr $(tar --exclude='*/*' -tf '/var/www/html/data/data-${snapshot}.tar')`) + runCommand(`tar -xf '/var/www/html/data/data-${snapshot}.tar'`) cy.log(`Restored snapshot ${snapshot}`) } diff --git a/lib/index.ts b/lib/index.ts index f1697c75..e3d5654a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { getNc, restoreState, saveState } from "./commands" +import { getNc, restoreState, runCommand, runOccCommand, saveState } from "./commands" import { login, logout } from "./commands/sessions" import { User, createRandomUser, createUser, deleteUser, modifyUser, listUsers, getUserData, enableUser } from "./commands/users" import type { Selector } from "./selectors" @@ -98,6 +98,17 @@ declare global { * @param snapshot string the ID of the snapshot */ restoreState(snapshot: string): Cypress.Chainable + + /** + * Run a command in the docker container + * + */ + runCommand(command: string, options?: Partial): Cypress.Chainable + + /** + * Run an occ command + */ + runOccCommand(command: string, options?: Partial): Cypress.Chainable } } } @@ -122,6 +133,8 @@ export const addCommands = function() { Cypress.Commands.add('getUserData', getUserData) Cypress.Commands.add('saveState', saveState) Cypress.Commands.add('restoreState', restoreState) + Cypress.Commands.add('runCommand', runCommand) + Cypress.Commands.add('runOccCommand', runOccCommand) } export { User }