diff options
Diffstat (limited to 'cypress/e2e/files_sharing/public-share/setup-public-share.ts')
-rw-r--r-- | cypress/e2e/files_sharing/public-share/setup-public-share.ts | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/cypress/e2e/files_sharing/public-share/setup-public-share.ts b/cypress/e2e/files_sharing/public-share/setup-public-share.ts new file mode 100644 index 00000000000..9549552c200 --- /dev/null +++ b/cypress/e2e/files_sharing/public-share/setup-public-share.ts @@ -0,0 +1,119 @@ +/*! + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +import type { User } from '@nextcloud/cypress' +import { openSharingPanel } from '../FilesSharingUtils.ts' + +let user: User +let url: string + +/** + * URL of the share + */ +export function getShareUrl() { + if (url === undefined) { + throw new Error('You need to setup the share first!') + } + return url +} + +/** + * Setup the available data + * @param shareName The name of the shared folder + */ +function setupData(shareName: string) { + cy.mkdir(user, `/${shareName}`) + cy.mkdir(user, `/${shareName}/subfolder`) + cy.uploadContent(user, new Blob(['<content>foo</content>']), 'text/plain', `/${shareName}/foo.txt`) + cy.uploadContent(user, new Blob(['<content>bar</content>']), 'text/plain', `/${shareName}/subfolder/bar.txt`) +} + +/** + * Create a public link share + * @param shareName The name of the shared folder + */ +function createShare(shareName: string) { + cy.login(user) + // open the files app + cy.visit('/apps/files') + // open the sidebar + openSharingPanel(shareName) + // create the share + cy.intercept('POST', '**/ocs/v2.php/apps/files_sharing/api/v1/shares').as('createShare') + cy.findByRole('button', { name: 'Create a new share link' }) + .click() + + // extract the link + return cy.wait('@createShare') + .should(({ response }) => { + const { ocs } = response!.body + url = ocs?.data.url + expect(url).to.match(/^http:\/\//) + }) + .then(() => cy.wrap(url)) +} + +/** + * Adjust share permissions to be editable + */ +function adjustSharePermission() { + // Update the share to be a file drop + cy.findByRole('list', { name: 'Link shares' }) + .findAllByRole('listitem') + .first() + .findByRole('button', { name: /Actions/i }) + .click() + cy.findByRole('menuitem', { name: /Customize link/i }) + .should('be.visible') + .click() + + // Enable upload-edit + cy.get('[data-cy-files-sharing-share-permissions-bundle]') + .should('be.visible') + cy.get('[data-cy-files-sharing-share-permissions-bundle="upload-edit"]') + .click() + // save changes + cy.intercept('PUT', '**/ocs/v2.php/apps/files_sharing/api/v1/shares/*').as('updateShare') + cy.findByRole('button', { name: 'Update share' }) + .click() + cy.wait('@updateShare') +} + +/** + * Setup a public share and backup the state. + * If the setup was already done in another run, the state will be restored. + * + * @return The URL of the share + */ +export function setupPublicShare(): Cypress.Chainable<string> { + const shareName = 'shared' + + 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) + 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 }) + .then(() => setupData(shareName)) + .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.task('setVariable', { key: 'public-share-data', value: shareData })) + .then(() => cy.log(`Public share setup, URL: ${shareData.shareUrl}`)) + .then(() => cy.wrap(url)) + } + }) +} |