Skip to content

Commit

Permalink
test(files_sharing): add e2e tests for public link sharing
Browse files Browse the repository at this point in the history
Signed-off-by: nfebe <[email protected]>
  • Loading branch information
nfebe committed Jan 20, 2025
1 parent 88932cf commit d7f2b84
Show file tree
Hide file tree
Showing 3 changed files with 309 additions and 1 deletion.
6 changes: 6 additions & 0 deletions cypress/e2e/files_sharing/ShareOptionsType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export type ShareOptions = {
enforcePassword?: boolean
enforceExpirationDate?: boolean
alwaysAskForPassword?: boolean
defaultExpirationDateSet?: boolean
}
230 changes: 230 additions & 0 deletions cypress/e2e/files_sharing/public-share/required-before-create.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
/*!
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import type { ShareContext } from './setup-public-share.ts'
import { setupData, createShare } from './setup-public-share.ts'

describe('files_sharing: Before create checks', () => {

let shareContext: ShareContext

before(() => {
// Setup data for the shared folder once before all tests
cy.createRandomUser().then((randomUser) => {
shareContext = {
user: randomUser,
}
})

cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')
cy.runOccCommand('config:app:set --value 2 core shareapi_expire_after_n_days')
})

after(() => {
cy.runOccCommand('config:app:delete core shareapi_default_expire_date')
cy.runOccCommand('config:app:delete core shareapi_enforce_expire_date')
cy.runOccCommand('config:app:delete core shareapi_expire_after_n_days')
})

afterEach(() => {
cy.runOccCommand('config:app:delete core core shareapi_enable_link_password_by_default')
})

it('Checks if user can create share when both password and expiration date are enforced', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_expire_date')

const shareName = 'passwordAndExpireEnforced'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
alwaysAskForPassword: true,
enforcePassword: true,
enforceExpirationDate: true,
defaultExpirationDateSet: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share when password is enforced and expiration date has a default set', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')

const shareName = 'passwordEnforcedDefaultExpire'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
alwaysAskForPassword: true,
enforcePassword: true,
defaultExpirationDateSet: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share when password has a default set and expiration date is enforced', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enable_link_password_by_default')
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_expire_date')

const shareName = 'defaultPasswordExpireEnforced'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
alwaysAskForPassword: true,
enforceExpirationDate: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share when both password and expiration date have defaults set', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enable_link_password_by_default')
cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')

const shareName = 'defaultPasswordAndExpire'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
alwaysAskForPassword: true,
defaultExpirationDateSet: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share when neither password nor expiration date are enforced or set by default', () => {
cy.runOccCommand('config:app:set --value no core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_expire_date')

const shareName = 'noPasswordNoExpire'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: false,
enforceExpirationDate: false,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with password enforced and expiration date set but not enforced', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_expire_date')

const shareName = 'passwordEnforcedExpireSetNotEnforced'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: true,
defaultExpirationDateSet: true,
enforceExpirationDate: false,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with both password and expiration date not enforced, but defaults set', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enable_link_password_by_default')
cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_expire_date')

const shareName = 'defaultPasswordExpireNotEnforced'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: false,
enforceExpirationDate: false,
defaultExpirationDateSet: true,
alwaysAskForPassword: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with password and expiration date both enforced with specific values', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_expire_date')

const shareName = 'passwordAndExpireBothEnforcedWithValues'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: true,
defaultExpirationDateSet: true,
enforceExpirationDate: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with password not enforced but expiration date enforced', () => {
cy.runOccCommand('config:app:set --value no core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value yes core shareapi_enforce_expire_date')

const shareName = 'noPasswordExpireEnforced'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: false,
defaultExpirationDateSet: true,
enforceExpirationDate: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with password not enforced and expiration date has a default set', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_links_password')

const shareName = 'defaultExpireNoPasswordEnforced'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: false,
defaultExpirationDateSet: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with expiration date set and password not enforced', () => {
cy.runOccCommand('config:app:set --value yes core shareapi_default_expire_date')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_links_password')

const shareName = 'noPasswordExpireDefault'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: false,
defaultExpirationDateSet: true,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

it('Checks if user can create share with password not enforced, expiration date not enforced, and no defaults set', () => {
cy.runOccCommand('config:app:set --value no core shareapi_enforce_links_password')
cy.runOccCommand('config:app:set --value no core shareapi_enforce_expire_date')
cy.runOccCommand('config:app:set --value no core shareapi_enable_link_password_by_default')
cy.runOccCommand('config:app:set --value no core shareapi_default_expire_date')

const shareName = 'noPasswordNoExpireNoDefaults'
setupData(shareContext, shareName)
createShare(shareContext, shareName, {
enforcePassword: false,
alwaysAskForPassword: false,
enforceExpirationDate: false,
defaultExpirationDateSet: false,
}).then((shareUrl) => {
shareContext.url = shareUrl
cy.log(`Created share with URL: ${shareUrl}`)
})
})

})
74 changes: 73 additions & 1 deletion cypress/e2e/files_sharing/public-share/setup-public-share.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { User } from '@nextcloud/cypress'
import type { ShareOptions } from '../ShareOptionsType.ts'
import { openSharingPanel } from '../FilesSharingUtils.ts'

export interface ShareContext {
Expand All @@ -15,6 +16,13 @@ const defaultShareContext: ShareContext = {
url: undefined,
}

const defaultShareOptions: ShareOptions = {
enforcePassword: false,
enforceExpirationDate: false,
alwaysAskForPassword: false,
defaultExpirationDateSet: false,
}

/**
* Retrieves the URL of the share.
* Throws an error if the share context is not initialized properly.
Expand Down Expand Up @@ -42,18 +50,82 @@ export function setupData(context: ShareContext, shareName: string): void {
cy.uploadContent(context.user, new Blob(['<content>bar</content>']), 'text/plain', `/${shareName}/subfolder/bar.txt`)
}

/**
* Check the password state based on enforcement and default presence.
*
* @param enforced Whether the password is enforced.
* @param alwaysAskForPassword Wether the password should always be asked for.
*/
function checkPasswordState(enforced: boolean, alwaysAskForPassword: boolean) {
if (enforced) {
cy.contains('Password protection (enforced)').should('exist')
cy.contains('Enter a password')
.should('exist')
.and('not.be.disabled')
} else if (alwaysAskForPassword) {
cy.contains('Password protection').should('exist')
cy.contains('Enter a password')
.should('exist')
.and('not.be.disabled')
} else {
cy.contains('Password protection')
.parent()
.find('input[type="checkbox"]')
.should('not.be.disabled')
.uncheck()
}
}

/**
* Check the expiration date state based on enforcement and default presence.
*
* @param enforced Whether the expiration date is enforced.
* @param hasDefault Whether a default expiration date is set.
*/
function checkExpirationDateState(enforced: boolean, hasDefault: boolean) {
if (enforced) {
cy.contains('Enable link expiration (enforced)').should('exist')
cy.contains('Enter expiration date')
.should('exist')
.and('not.be.disabled')
} else if (hasDefault) {
cy.contains('Enable link expiration').should('exist')
cy.contains('Enter expiration date')
.should('exist')
.and('not.be.disabled')
} else {
cy.contains('Enable link expiration')
.parent()
.find('input[type="checkbox"]')
.should('not.be.disabled')
.uncheck()
}
}

/**
* Create a public link share
* @param context The current share context
* @param shareName The name of the shared folder
* @param options The share options
*/
export function createShare(context: ShareContext, shareName: string) {
export function createShare(context: ShareContext, shareName: string, options: ShareOptions = defaultShareOptions) {
cy.login(context.user)
cy.visit('/apps/files') // Open the files app
openSharingPanel(shareName) // Open the sharing sidebar

cy.intercept('POST', '**/ocs/v2.php/apps/files_sharing/api/v1/shares').as('createShare')
cy.findByRole('button', { name: 'Create a new share link' }).click()
// Conduct optional checks based on the provided options
if (options) {
cy.get('.sharing-entry__actions').should('be.visible') // Wait for the dialog to open
if (options.enforcePassword || options.alwaysAskForPassword) {
checkPasswordState(options.enforcePassword ?? false, options.alwaysAskForPassword ?? false)
}
if (options.enforceExpirationDate || options.defaultExpirationDateSet) {
checkExpirationDateState(options.enforceExpirationDate ?? false, options.defaultExpirationDateSet ?? false)
}
cy.findByRole('button', { name: 'Create share' }).should('be.visible').click()
}

// Extract the share link
return cy.wait('@createShare')
Expand Down

0 comments on commit d7f2b84

Please sign in to comment.