diff --git a/tests/acceptance/features/webUISharingInternalGroups/shareWithGroups.feature b/tests/acceptance/features/webUISharingInternalGroups/shareWithGroups.feature index dc5a8ffe0f4..c02fc87ce08 100644 --- a/tests/acceptance/features/webUISharingInternalGroups/shareWithGroups.feature +++ b/tests/acceptance/features/webUISharingInternalGroups/shareWithGroups.feature @@ -391,20 +391,13 @@ Feature: Sharing files and folders with internal groups And the setting "shareapi_enforce_expire_date_group_share" of app "core" has been set to "yes" And the setting "shareapi_expire_after_n_days_group_share" of app "core" has been set to "5" And user "user3" has logged in using the webUI - When the user tries to share file "" with group "grp1" which expires after 6 days using the webUI - Then user "user3" should have a share with these details: - | field | value | - | path | / | - | share_type | group | - | uid_owner | user3 | - | share_with | grp1 | - | expiration | +5 | - And user "user1" should have received a share with target "" and expiration date in 5 days - And user "user2" should have received a share with target "" and expiration date in 5 days + When the user tries to share file "" with group "grp1" which expires in "+6" days using the webUI + Then enforced maximum expiration date for group share should be set in the expiration date input field of collaborators form on the webUI + And user "user1" should not have created any shares Examples: - | shared-resource | target-resource | - | lorem.txt | lorem (2).txt | - | simple-folder | simple-folder (2) | + | shared-resource | + | lorem.txt | + | simple-folder | Scenario Outline: user cannot change the expiry date of an existing group share to a date that is past enforced maximum expiration date Given the setting "shareapi_default_expire_date_group_share" of app "core" has been set to "yes" @@ -417,13 +410,7 @@ Feature: Sharing files and folders with internal groups | expireDate | +4 | And user "user3" has logged in using the webUI When the user tries to edit the collaborator expiry date of "grp1" of file "" to "+7" days using the webUI - Then user "user3" should have a share with these details: - | field | value | - | path | / | - | share_type | group | - | uid_owner | user3 | - | share_with | grp1 | - | expiration | +4 | + Then it should not be possible to save the pending share on the webUI And user "user1" should have received a share with target "" and expiration date in 4 days And user "user2" should have received a share with target "" and expiration date in 4 days Examples: diff --git a/tests/acceptance/features/webUISharingInternalUsers/shareWithUsers.feature b/tests/acceptance/features/webUISharingInternalUsers/shareWithUsers.feature index a0c1f52beef..5791c82be48 100644 --- a/tests/acceptance/features/webUISharingInternalUsers/shareWithUsers.feature +++ b/tests/acceptance/features/webUISharingInternalUsers/shareWithUsers.feature @@ -593,7 +593,7 @@ Feature: Sharing files and folders with internal users Scenario: share a file with another internal user which should expire after 2 days Given user "user1" has logged in using the webUI - When the user shares file "testimage.jpg" with user "User Two" which expires after 2 days using the webUI + When the user shares file "testimage.jpg" with user "User Two" which expires in "+2" days using the webUI Then user "user2" should have received a share with target "testimage (2).jpg" and expiration date in 2 days Scenario: share a file with another internal user with default expiration date @@ -624,19 +624,13 @@ Feature: Sharing files and folders with internal users And the setting "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes" And the setting "shareapi_expire_after_n_days_user_share" of app "core" has been set to "5" And user "user1" has logged in using the webUI - When the user tries to share file "" with user "User Two" which expires after 6 days using the webUI - Then user "user1" should have a share with these details: - | field | value | - | path | / | - | share_type | user | - | uid_owner | user1 | - | share_with | user2 | - | expiration | +5 | - And user "user2" should have received a share with target "" and expiration date in 5 days + When the user tries to share file "" with user "User Two" which expires in "+6" days using the webUI + Then enforced maximum expiration date for user share should be set in the expiration date input field of collaborators form on the webUI + And user "user1" should not have created any shares Examples: - | shared-resource | target-resource | - | lorem.txt | lorem (2).txt | - | simple-folder | simple-folder (2) | + | shared-resource | + | lorem.txt | + | simple-folder | Scenario Outline: user cannot change the expiry date of an existing user share to a date that is past enforced maximum expiration date Given the setting "shareapi_default_expire_date_user_share" of app "core" has been set to "yes" @@ -647,14 +641,8 @@ Feature: Sharing files and folders with internal users | shareWith | user2 | | expireDate | +4 | And user "user1" has logged in using the webUI - When the user tries to edit the collaborator expiry date of "User Two" of file "" to "+7" days using the webUI - Then user "user1" should have a share with these details: - | field | value | - | path | / | - | share_type | user | - | uid_owner | user1 | - | share_with | user2 | - | expiration | +4 | + When the user tries to edit the collaborator expiry date of "User Two" of resource "" to "+7" days using the webUI + Then it should not be possible to save the pending share on the webUI Examples: | shared-resource | | lorem.txt | @@ -665,7 +653,7 @@ Feature: Sharing files and folders with internal users And the setting "shareapi_enforce_expire_date_user_share" of app "core" has been set to "yes" And the setting "shareapi_expire_after_n_days_user_share" of app "core" has been set to "5" And user "user1" has logged in using the webUI - When the user shares file "lorem.txt" with user "User Two" which expires after 4 days using the webUI + When the user shares file "lorem.txt" with user "User Two" which expires in "+4" days using the webUI Then user "user1" should have a share with these details: | field | value | | path | /lorem.txt | @@ -686,15 +674,8 @@ Feature: Sharing files and folders with internal users And the setting "shareapi_expire_after_n_days_user_share" of app "core" has been set to "10" And the setting "shareapi_expire_after_n_days_group_share" of app "core" has been set to "5" And user "user3" has logged in using the webUI - When the user shares file "" with user "User Two" which expires after 6 days using the webUI - Then user "user3" should have a share with these details: - | field | value | - | path | / | - | share_type | user | - | uid_owner | user3 | - | share_with | user2 | - | expiration | +5 | -# | expiration | +6 | + When the user tries to share file "" with user "User Two" which expires in "+6" days using the webUI + Then enforced maximum expiration date for user share should be set in the expiration date input field of collaborators form on the webUI Examples: | shared-resource | | lorem.txt | diff --git a/tests/acceptance/pageObjects/FilesPageElement/expirationDatePicker.js b/tests/acceptance/pageObjects/FilesPageElement/expirationDatePicker.js index 2962405564a..c38c80734b9 100644 --- a/tests/acceptance/pageObjects/FilesPageElement/expirationDatePicker.js +++ b/tests/acceptance/pageObjects/FilesPageElement/expirationDatePicker.js @@ -107,9 +107,6 @@ module.exports = { ) const daySelector = this.setExpiryDateDaySelectorXpath(pastDate.getDay()) await this - .initAjaxCounters() - .waitForElementVisible('@linkExpirationDateField') - .click('@linkExpirationDateField') .waitForElementVisible('@dateTimePopupYear') .waitForAnimationToFinish() .waitForElementEnabled( @@ -150,7 +147,7 @@ module.exports = { * sets expiration date on collaborators/public-link shares * * @param {string} value - provided date in format YYYY-MM-DD, or empty string to unset date - * @returns {Promise} + * @returns {Promise} returns true if succeeds to set provided expiration date */ setExpirationDate: async function (value) { if (value === '') { @@ -158,17 +155,22 @@ module.exports = { } value = sharingHelper.calculateDate(value) const dateToSet = new Date(Date.parse(value)) + const disabled = await this.isExpiryDateDisabled(dateToSet) + if (disabled) { + console.log('WARNING: Cannot change expiration date to disabled value!') + await this + .waitForElementVisible('@dateTimeCancelButton') + .click('@dateTimeCancelButton') + return false + } const year = dateToSet.getFullYear() const month = dateToSet.toLocaleString('en-GB', { month: 'long' }) const day = dateToSet.getDate() await this - .initAjaxCounters() - .waitForElementVisible('@linkExpirationDateField') - .click('@linkExpirationDateField') - return this .setExpiryDateYear(year) .setExpiryDateMonth(month) .setExpiryDateDay(day) + return true } }, elements: { @@ -191,12 +193,13 @@ module.exports = { selector: '//div[@class="vdatetime-popup__actions"]/div[.="Ok"]', locateStrategy: 'xpath' }, + dateTimeCancelButton: { + selector: '//div[@class="vdatetime-popup__actions"]/div[.="Cancel"]', + locateStrategy: 'xpath' + }, dateTimePopupDate: { selector: '.vdatetime-popup__date' }, - linkExpirationDateField: { - selector: '.vdatetime-input' - }, publicLinkDeleteExpirationDateButton: { selector: '#oc-files-file-link-expire-date-delete' } diff --git a/tests/acceptance/pageObjects/FilesPageElement/publicLinksDialog.js b/tests/acceptance/pageObjects/FilesPageElement/publicLinksDialog.js index 4e403122fbd..bfee3d2d7ef 100644 --- a/tests/acceptance/pageObjects/FilesPageElement/publicLinksDialog.js +++ b/tests/acceptance/pageObjects/FilesPageElement/publicLinksDialog.js @@ -71,7 +71,7 @@ module.exports = { * @param value values for the different fields to be set * @returns {*|Promise|exports} */ - setPublicLinkForm: function (key, value) { + setPublicLinkForm: async function (key, value) { if (key === 'role') { return this.setPublicLinkRole(value) } else if (key === 'name') { @@ -79,10 +79,15 @@ module.exports = { } else if (key === 'password') { return this.setPublicLinkPassword(value) } else if (key === 'expireDate') { - return this.api.page + const expectToSucceed = await this.api.page .FilesPageElement - .expirationDatePicker() + .sharingDialog() + .openExpiryDateCalender() .setExpirationDate(value) + if (!expectToSucceed) { + console.log('WARNING: Cannot create share with disabled expiration date!') + return + } } return this }, @@ -97,10 +102,10 @@ module.exports = { * @param {string} editData.expireDate - Expire date for a public link share * @returns {exports} */ - editPublicLink: function (linkName, editData) { - this.clickLinkEditBtn(linkName) + editPublicLink: async function (linkName, editData) { + await this.clickLinkEditBtn(linkName) for (const [key, value] of Object.entries(editData)) { - this.setPublicLinkForm(key, value) + await this.setPublicLinkForm(key, value) } return this }, diff --git a/tests/acceptance/pageObjects/FilesPageElement/sharingDialog.js b/tests/acceptance/pageObjects/FilesPageElement/sharingDialog.js index d3ed299fe67..fdd20712552 100644 --- a/tests/acceptance/pageObjects/FilesPageElement/sharingDialog.js +++ b/tests/acceptance/pageObjects/FilesPageElement/sharingDialog.js @@ -1,6 +1,6 @@ const util = require('util') const _ = require('lodash') -const { COLLABORATOR_PERMISSION_ARRAY } = require('../../helpers/sharingHelper') +const sharingHelper = require('../../helpers/sharingHelper') const { client } = require('nightwatch-api') const collaboratorDialog = client.page.FilesPageElement.SharingDialog.collaboratorsDialog() const SHARE_TYPE_STRING = { @@ -128,27 +128,6 @@ module.exports = { return this }, - /** - * @param {int} days - */ - selectExpirationDaysOnPendingShare: async function (days) { - const currentDate = new Date() - const currentDay = currentDate.getDate() - const currentMonth = currentDate.getMonth() - const expirationDate = new Date(currentDate.setDate(currentDay + days)) - const dateSelector = util.format(this.elements.collaboratorExpirationDateModalDay.selector, expirationDate.getDate()) - - if (expirationDate.getMonth() !== currentMonth) { - await this.click('@collaboratorExpirationDateModalNextMonthButton') - } - - await this.click('@collaboratorExpirationDateInput') - await this.useXpath().click(dateSelector) - await this.click('@collaboratorExpirationDateModalConfirmButton') - await this.useCss() - return this - }, - /** * * @param {string} sharee @@ -156,10 +135,12 @@ module.exports = { * @param {string} role * @param {string} permissions * @param {boolean} remote - * @param {int} days + * @param {string} days + * @param {boolean} expectToSucceed */ shareWithUserOrGroup: async function ( - sharee, shareWithGroup = false, role, permissions, remote = false, days + sharee, shareWithGroup = false, role, permissions, + remote = false, days, expectToSucceed = true ) { await collaboratorDialog.clickCreateShare() await this.selectCollaboratorForShare(sharee, shareWithGroup, remote) @@ -170,7 +151,14 @@ module.exports = { } if (days) { - await this.selectExpirationDaysOnPendingShare(days) + const dateToSet = sharingHelper.calculateDate(days) + const expectToSucceed = await this + .openExpiryDateCalender() + .setExpirationDate(dateToSet) + if (!expectToSucceed) { + console.log('WARNING: Cannot create share with disabled expiration date!') + return + } } return this.confirmShare() @@ -234,10 +222,10 @@ module.exports = { const permissions = {} const panelSelector = this.elements.sharingSidebarRoot.selector let permissionToggle - for (let i = 0; i < COLLABORATOR_PERMISSION_ARRAY.length; i++) { + for (let i = 0; i < sharingHelper.COLLABORATOR_PERMISSION_ARRAY.length; i++) { permissionToggle = panelSelector + util.format( this.elements.permissionCheckbox.selector, - COLLABORATOR_PERMISSION_ARRAY[i] + sharingHelper.COLLABORATOR_PERMISSION_ARRAY[i] ) await this.api.element('xpath', permissionToggle, result => { @@ -245,7 +233,7 @@ module.exports = { return } return this.api.elementIdSelected(result.value.ELEMENT, result => { - permissions[COLLABORATOR_PERMISSION_ARRAY[i]] = result.value + permissions[sharingHelper.COLLABORATOR_PERMISSION_ARRAY[i]] = result.value }) }) } @@ -494,20 +482,48 @@ module.exports = { /** * @param {string} collaborator Name of the collaborator * @param {string} days number of days to be added or subtracted from current date - * @param {boolean} tries + * @param {boolean} expectToSucceed * * @return {Promise<*>} */ - changeCollaboratorExpiryDate: async function (collaborator, days, tries = false) { + changeCollaboratorExpiryDate: async function (collaborator, days) { await collaboratorDialog.clickEditShare(collaborator) - await this.api.page - .FilesPageElement - .expirationDatePicker() + const expectToSucceed = await this + .openExpiryDateCalender() .setExpirationDate(days) - if (!tries) { - this.saveChanges() + if (!expectToSucceed) { + console.log('WARNING: Cannot create share with disabled expiration date!') + return } + await this.saveChanges() return this + }, + openExpiryDateCalender: function () { + this + .initAjaxCounters() + .waitForElementVisible('@expirationDateField') + .click('@expirationDateField') + return client.page.FilesPageElement.expirationDatePicker() + }, + getExpirationDateFromInputField: async function () { + let expirationDate + await this + .waitForElementVisible('@expirationDateField') + .getValue('@expirationDateField', (result) => { + console.log(result) + expirationDate = result.value + }) + return expirationDate + }, + getDisabledAttributeOfSaveShareButton: async function () { + let disabled + await this + .waitForElementVisible('@saveShareButton') + .getAttribute('@saveShareButton', 'disabled', (result) => { + console.log(result) + disabled = result.value + }) + return disabled } }, elements: { @@ -621,6 +637,9 @@ module.exports = { collaboratorsListItemName: { selector: '//span[contains(@class, "files-collaborators-collaborator-name") and text()="%s"]', locateStrategy: 'xpath' + }, + expirationDateField: { + selector: '.vdatetime-input' } } } diff --git a/tests/acceptance/stepDefinitions/publicLinkContext.js b/tests/acceptance/stepDefinitions/publicLinkContext.js index ba88d7aa4cd..235c5cdfad7 100644 --- a/tests/acceptance/stepDefinitions/publicLinkContext.js +++ b/tests/acceptance/stepDefinitions/publicLinkContext.js @@ -128,15 +128,17 @@ When('the user edits the public link named {string} of file/folder/resource {str When('the user tries to edit expiration of the public link named {string} of file {string} to past date {string}', async function (linkName, resource, pastDate) { - await client.page.FilesPageElement + const api = client.page.FilesPageElement + await api .appSideBar() .closeSidebar(100) .openPublicLinkDialog(resource) - await client.page.FilesPageElement.publicLinksDialog().clickLinkEditBtn(linkName) + await api.publicLinksDialog().clickLinkEditBtn(linkName) const value = sharingHelper.calculateDate(pastDate) const dateToSet = new Date(Date.parse(value)) - const isDisabled = await client.page.FilesPageElement - .expirationDatePicker() + const isDisabled = await api + .sharingDialog() + .openExpiryDateCalender() .isExpiryDateDisabled(dateToSet) return assert.ok( isDisabled, diff --git a/tests/acceptance/stepDefinitions/sharingContext.js b/tests/acceptance/stepDefinitions/sharingContext.js index 3f1fc8a0b1e..8169c3a638e 100644 --- a/tests/acceptance/stepDefinitions/sharingContext.js +++ b/tests/acceptance/stepDefinitions/sharingContext.js @@ -325,12 +325,14 @@ const assertUsersGroupsWithPatternInAutocompleteListExcluding = async function ( * * @param {string} resource * @param {string} sharee - * @param {int} days + * @param {string} days * @param {boolean} shareWithGroup * @param {boolean} remote + * @param {boolean} expectToSucceed */ const userSharesFileOrFolderWithUserOrGroupWithExpirationDate = async function ({ - resource, sharee, days, shareWithGroup = false, remote = false + resource, sharee, days, + shareWithGroup = false, remote = false, expectToSucceed = true }) { const api = client.page .FilesPageElement @@ -341,7 +343,7 @@ const userSharesFileOrFolderWithUserOrGroupWithExpirationDate = async function ( .openSharingDialog(resource) return api.sharingDialog().shareWithUserOrGroup( - sharee, shareWithGroup, 'Viewer', undefined, remote, days + sharee, shareWithGroup, 'Viewer', undefined, remote, days, expectToSucceed ) } @@ -779,7 +781,7 @@ When( } ) -When('the user edits the collaborator expiry date of {string} of file/folder/resource {string} to {string} days/day using the webUI', +When('the user (tries to )edit/edits the collaborator expiry date of {string} of file/folder/resource {string} to {string} days/day using the webUI', async function (collaborator, resource, days) { const api = client.page.FilesPageElement await api @@ -789,16 +791,6 @@ When('the user edits the collaborator expiry date of {string} of file/folder/res return api.sharingDialog().changeCollaboratorExpiryDate(collaborator, days) }) -When('the user tries to edit the collaborator expiry date of {string} of file/folder/resource {string} to {string} days/day using the webUI', - async function (collaborator, resource, days) { - const api = client.page.FilesPageElement - await api - .appSideBar() - .closeSidebar(100) - .openSharingDialog(resource) - return api.sharingDialog().changeCollaboratorExpiryDate(collaborator, days, true) - }) - Then('user {string} should be listed as {string} in the collaborators list on the webUI', function (user, role) { return assertCollaboratorslistContains('user', user, { role }) }) @@ -1006,12 +998,17 @@ Then('the following resources should have the following collaborators', async fu } }) -When('the user (tries to )share/shares file/folder/resource {string} with user {string} which expires after {int} day/days using the webUI', +When('the user (tries to )share/shares file/folder/resource {string} with user {string} which expires in {string} day/days using the webUI', function (resource, sharee, days) { - return userSharesFileOrFolderWithUserOrGroupWithExpirationDate({ resource, sharee, days }) + return userSharesFileOrFolderWithUserOrGroupWithExpirationDate( + { + resource: resource, + sharee: sharee, + days: days + }) }) -When('the user tries to share file/folder/resource {string} with group {string} which expires after {int} day/days using the webUI', +When('the user (tries to )share/shares file/folder/resource {string} with group {string} which expires in {string} day/days using the webUI', function (resource, sharee, days) { return userSharesFileOrFolderWithUserOrGroupWithExpirationDate( { @@ -1033,3 +1030,63 @@ Then('the fields of the {string} collaborator for file/folder/resource {string} Then('user {string} should have received a share with target {string} and expiration date in {int} day/days', function (user, target, days) { return checkReceivedSharesExpirationDate(user, target, days) }) + +const assertExpirationInputValueWithEnforcedDays = async function (enforcedDays) { + const expectedDateTime = new Date() + enforcedDays = parseInt(enforcedDays.ocs.data.stdOut) + expectedDateTime.setDate(expectedDateTime.getDate() + parseInt(enforcedDays)) + const expectedDate = new Date(Date.UTC( + expectedDateTime.getFullYear(), + expectedDateTime.getMonth(), + expectedDateTime.getDate() + )) + const actualExpirationDate = await client.page.FilesPageElement + .sharingDialog() + .getExpirationDateFromInputField() + const [month, day, year] = actualExpirationDate.split(' ') + const monthNames = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ] + const actualDate = new Date(Date.UTC( + parseInt(year), + monthNames.indexOf(month), + parseInt(day) + )) + const actualDays = Math.floor((actualDate - expectedDate) / (86400000)) + assert.strictEqual( + enforcedDays, + actualDays + ) +} + +Then('enforced maximum expiration date for group share should be set in the expiration date input field of collaborators form on the webUI', + async function () { + const enforcedDays = await runOcc( + [ + 'config:app:get', + 'core', + 'shareapi_expire_after_n_days_group_share' + ] + ) + return assertExpirationInputValueWithEnforcedDays(enforcedDays) + }) + +Then('enforced maximum expiration date for user share should be set in the expiration date input field of collaborators form on the webUI', + async function () { + const enforcedDays = await runOcc( + [ + 'config:app:get', + 'core', + 'shareapi_expire_after_n_days_user_share' + ] + ) + return assertExpirationInputValueWithEnforcedDays(enforcedDays) + }) + +Then('it should not be possible to save the pending share on the webUI', async function () { + const state = await client.page.FilesPageElement.sharingDialog().getDisabledAttributeOfSaveShareButton() + assert.strictEqual( + 'true', + state + ) +})