diff --git a/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts b/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts index a8a7d279c0..c4503e481e 100644 --- a/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts +++ b/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts @@ -22,9 +22,8 @@ * from Hyland Software. If not, see . */ -import { SITE_VISIBILITY, SITE_ROLES } from '@alfresco/aca-testing-shared'; import { expect } from '@playwright/test'; -import { ApiClientFactory, Utils, test, SitesApi, QueriesApi } from '@alfresco/playwright-shared'; +import { ApiClientFactory, Utils, test, SitesApi, QueriesApi, SITE_VISIBILITY, SITE_ROLES } from '@alfresco/playwright-shared'; test.describe('Library properties', () => { let sitesApi: SitesApi; @@ -101,29 +100,29 @@ test.describe('Library properties', () => { await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); expect(await myLibrariesPage.libraryDetails.headerTitle.textContent()).toEqual(site.name); await expect(myLibrariesPage.libraryDetails.propertiesTab).toBeVisible(); - await expect(myLibrariesPage.libraryDetails.getNameField('Name')).toBeVisible(); - await expect(myLibrariesPage.libraryDetails.getIdField('Library ID')).toBeVisible(); - await expect(myLibrariesPage.libraryDetails.getVisibilityField('Visibility')).toBeVisible(); - await expect(myLibrariesPage.libraryDetails.getDescriptionField).toBeVisible(); - - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel.locator('label', { hasText: 'Name' }).inputValue()).toEqual(site.name); - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel.locator('label', { hasText: 'Library ID' }).inputValue()).toEqual(site.id); - // expect(await myLibrariesPage.libraryDetails.infoDrawerPanel.locator('label', {hasText: 'Visibility'}).locator('../../..').inputValue()).toEqual(site.visibility); - expect(await myLibrariesPage.libraryDetails.getDescriptionField.textContent()).toEqual(site.description); + await expect(myLibrariesPage.libraryDetails.nameField).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.idField).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.visibilityField).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.descriptionField).toBeVisible(); + + expect(await myLibrariesPage.libraryDetails.nameField.inputValue()).toEqual(site.name); + expect(await myLibrariesPage.libraryDetails.idField.inputValue()).toEqual(site.id); + expect((await myLibrariesPage.libraryDetails.visibilityField.textContent()).toUpperCase()).toEqual(site.visibility); + expect(await myLibrariesPage.libraryDetails.descriptionField.inputValue()).toEqual(site.description); await expect(myLibrariesPage.libraryDetails.editButton).toBeVisible(); }); test('[C289338] Editable properties', async ({ myLibrariesPage }) => { - await myLibrariesPage.dataTable.selectItem(site.name); + await myLibrariesPage.dataTable.getRowByName(site.name).click(); await myLibrariesPage.acaHeader.viewDetails.click(); await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); await expect(myLibrariesPage.libraryDetails.editButton).toBeVisible(); await myLibrariesPage.libraryDetails.editButton.click(); - await expect(myLibrariesPage.libraryDetails.getNameField('Name')).toBeVisible(); - await expect(myLibrariesPage.libraryDetails.getIdField('Library ID')).not.toBeEditable(); - await expect(myLibrariesPage.libraryDetails.getVisibilityField('Visibility')).toBeEditable(); - await expect(myLibrariesPage.libraryDetails.getDescriptionField).toBeEditable(); + await expect(myLibrariesPage.libraryDetails.nameField).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.idField).not.toBeEditable(); + await expect(myLibrariesPage.libraryDetails.visibilityField).toBeEditable(); + await expect(myLibrariesPage.libraryDetails.descriptionField).toBeEditable(); await expect(myLibrariesPage.libraryDetails.cancelButton).toBeVisible(); await expect(myLibrariesPage.libraryDetails.updateButton).toBeVisible(); await expect(myLibrariesPage.libraryDetails.cancelButton).toBeEnabled(); @@ -131,21 +130,22 @@ test.describe('Library properties', () => { }); test('[C289339] Edit site details', async ({ myLibrariesPage }) => { - await myLibrariesPage.dataTable.selectItem(site.name); + await myLibrariesPage.dataTable.getRowByName(siteForUpdate.name).click(); await myLibrariesPage.acaHeader.viewDetails.click(); await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); await expect(myLibrariesPage.libraryDetails.editButton).toBeVisible(); await myLibrariesPage.libraryDetails.editButton.click(); - await myLibrariesPage.libraryDetails.getNameField('Name').fill(siteUpdated.name); - await myLibrariesPage.libraryDetails.getVisibilityField('Visibility').selectOption(siteUpdated.visibility); - await myLibrariesPage.libraryDetails.getDescriptionField.fill(siteUpdated.description); + await myLibrariesPage.libraryDetails.nameField.fill(siteUpdated.name); + await myLibrariesPage.libraryDetails.visibilityField.click(); + await myLibrariesPage.libraryDetails.selectVisbility(siteUpdated.visibility); + await myLibrariesPage.libraryDetails.descriptionField.fill(siteUpdated.description); await expect(myLibrariesPage.libraryDetails.updateButton).toBeEnabled(); await myLibrariesPage.libraryDetails.updateButton.click(); - await expect(myLibrariesPage.snackBar.message).toEqual('Library properties updated'); - await expect(myLibrariesPage.dataTable.isItemPresent(siteUpdated.name)).toBe(true); - await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + expect(await myLibrariesPage.snackBar.message.innerText()).toEqual('Library properties updated'); + expect(await myLibrariesPage.dataTable.isItemPresent(siteUpdated.name)).toBe(true); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).not.toBeVisible(); expect((await sitesApi.getSite(siteForUpdate.id)).entry.title).toEqual(siteUpdated.name); expect((await sitesApi.getSite(siteForUpdate.id)).entry.description).toEqual(siteUpdated.description); expect((await sitesApi.getSite(siteForUpdate.id)).entry.visibility).toEqual(siteUpdated.visibility); @@ -155,86 +155,116 @@ test.describe('Library properties', () => { const newName = `new-name-${Utils.random}`; const newDesc = `new desc ${Utils.random}`; - await myLibrariesPage.dataTable.selectItem(site.name); + await myLibrariesPage.dataTable.getRowByName(site.name).click(); await myLibrariesPage.acaHeader.viewDetails.click(); - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.editButton).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.editButton).toBeVisible(); await myLibrariesPage.libraryDetails.editButton.click(); - await myLibrariesPage.libraryDetails.getNameField('Name').fill(newName); - await myLibrariesPage.libraryDetails.getVisibilityField('Visibility').selectOption(SITE_VISIBILITY.MODERATED); - await myLibrariesPage.libraryDetails.getDescriptionField.fill(newDesc); - expect(await myLibrariesPage.libraryDetails.updateButton).toBeEnabled(); + await myLibrariesPage.libraryDetails.nameField.fill(newName); + await myLibrariesPage.libraryDetails.visibilityField.click(); + await myLibrariesPage.libraryDetails.selectVisbility(SITE_VISIBILITY.MODERATED); + await myLibrariesPage.libraryDetails.descriptionField.fill(newDesc); + await expect(myLibrariesPage.libraryDetails.updateButton).toBeEnabled(); await myLibrariesPage.libraryDetails.cancelButton.click(); expect(await myLibrariesPage.dataTable.isItemPresent(newName)).toBe(false); expect(await myLibrariesPage.dataTable.isItemPresent(site.name)).toBe(true); - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); }); test('[C289341] Warning appears when editing the name of the library by entering an existing name', async ({ myLibrariesPage }) => { queriesApi = await QueriesApi.initialize(username, username); await queriesApi.waitForSites(site.name, { expect: 1 }); - await myLibrariesPage.dataTable.selectItem(siteDup); + await myLibrariesPage.dataTable.getRowByName(siteDup).click(); await myLibrariesPage.acaHeader.viewDetails.click(); - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.editButton).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.editButton).toBeVisible(); await myLibrariesPage.libraryDetails.editButton.click(); - await myLibrariesPage.libraryDetails.getNameField('Name').fill(site.name); - expect(await myLibrariesPage.libraryDetails.hintMessage).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.hintMessage).toEqual('Library name already in use'); + await myLibrariesPage.libraryDetails.nameField.fill(site.name); + await expect(myLibrariesPage.libraryDetails.hintMessage).toBeVisible(); + expect(await myLibrariesPage.libraryDetails.hintMessage.textContent()).toEqual('Library name already in use'); }); test('[C289342] Site name too long', async ({ myLibrariesPage }) => { - await myLibrariesPage.dataTable.selectItem(site.name); + await myLibrariesPage.dataTable.getRowByName(site.name).click(); await myLibrariesPage.acaHeader.viewDetails.click(); - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); await myLibrariesPage.libraryDetails.editButton.click(); - await myLibrariesPage.libraryDetails.getNameField('Name').fill(Utils.string257Long); - expect(await myLibrariesPage.libraryDetails.hintMessage).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.hintMessage).toEqual('Use 256 characters or less for title'); - expect(await myLibrariesPage.libraryDetails.updateButton).not.toBeEnabled(); + await myLibrariesPage.libraryDetails.nameField.fill(Utils.string257Long); + await expect(myLibrariesPage.libraryDetails.errorMessage).toBeVisible(); + expect((await myLibrariesPage.libraryDetails.errorMessage.textContent()).trim()).toEqual('Use 256 characters or less for title'); + await expect(myLibrariesPage.libraryDetails.updateButton).not.toBeEnabled(); }); test('[C289343] Site description too long', async ({ myLibrariesPage }) => { - await myLibrariesPage.dataTable.selectItem(site.name); + await myLibrariesPage.dataTable.getRowByName(site.name).click(); await myLibrariesPage.acaHeader.viewDetails.click(); - expect(await myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); await myLibrariesPage.libraryDetails.editButton.click(); - await myLibrariesPage.libraryDetails.getDescriptionField.fill(Utils.string513Long); - expect(await myLibrariesPage.libraryDetails.hintMessage).toBeVisible(); - expect(await myLibrariesPage.libraryDetails.hintMessage).toEqual('Use 512 characters or less for description'); - expect(await myLibrariesPage.libraryDetails.updateButton).not.toBeEnabled(); + await myLibrariesPage.libraryDetails.descriptionField.fill(Utils.string513Long); + await expect(myLibrariesPage.libraryDetails.errorMessage).toBeVisible(); + expect((await myLibrariesPage.libraryDetails.errorMessage.textContent()).trim()).toEqual('Use 512 characters or less for description'); + await expect(myLibrariesPage.libraryDetails.updateButton).not.toBeEnabled(); }); +}); - test.describe('Non manager', () => { - test.beforeEach(async ({ myLibrariesPage }) => { - await myLibrariesPage.navigate(); - }); +test.describe('Non manager', () => { + let sitesApi: SitesApi; + const username = `user1-${Utils.random()}`; + const user2 = `user2-${Utils.random()}`; + const user3 = `user3-${Utils.random()}`; - test.afterAll(async ({ loginPage }) => { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - }); + const site = { + name: `site1-${Utils.random()}`, + id: `site-id-${Utils.random()}`, + visibility: SITE_VISIBILITY.MODERATED, + description: 'my site description' + }; - test('[C289337] Info drawer button is not displayed when user is not the library manager', async ({ loginPage, myLibrariesPage }) => { - await loginPage.loginUser({ username, password: user2 }, { withNavigation: true, waitForLoading: true }); - await myLibrariesPage.dataTable.selectItem(site.name); - expect(await myLibrariesPage.acaHeader.viewDetails).not.toBeVisible(); - }); + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username: username }); + await apiClientFactory.createUser({ username: user2 }); + await apiClientFactory.createUser({ username: user3 }); - test('[C289344] Error notification', async ({ loginPage, myLibrariesPage }) => { - await loginPage.loginUser({ username, password: user3 }, { withNavigation: true, waitForLoading: true }); - await myLibrariesPage.dataTable.selectItem(site.name); - await myLibrariesPage.acaHeader.viewDetails.click(); - await myLibrariesPage.libraryDetails.editButton.click(); - await sitesApi.updateSiteMember(site.id, user3, SITE_ROLES.SITE_CONSUMER.ROLE); - await myLibrariesPage.libraryDetails.getDescriptionField.fill('new description'); - await myLibrariesPage.libraryDetails.updateButton.click(); + sitesApi = await SitesApi.initialize(username, username); + await sitesApi.createSite(site.name, site.visibility, site.description, site.id); + await sitesApi.addSiteMember(site.id, user2, SITE_ROLES.SITE_COLLABORATOR.ROLE); + await sitesApi.addSiteMember(site.id, user3, SITE_ROLES.SITE_MANAGER.ROLE); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test.afterAll(async () => { + await sitesApi.deleteSites([site.id]); + }); + + test('[C289337] Info drawer button is not displayed when user is not the library manager', async ({ loginPage, myLibrariesPage }) => { + await loginPage.loginUser({ username: user2, password: user2 }, { withNavigation: true, waitForLoading: true }); + await myLibrariesPage.navigate(); + + await myLibrariesPage.dataTable.getRowByName(site.name).click(); + await expect(myLibrariesPage.acaHeader.viewDetails).not.toBeVisible(); + }); + + test('[C289344] Error notification when editing with no rights', async ({ loginPage, myLibrariesPage }) => { + await loginPage.loginUser({ username: user3, password: user3 }, { withNavigation: true, waitForLoading: true }); + await myLibrariesPage.navigate(); + + await myLibrariesPage.dataTable.getRowByName(site.name).click(); + await myLibrariesPage.acaHeader.viewDetails.click(); + await myLibrariesPage.libraryDetails.editButton.click(); + await sitesApi.updateSiteMember(site.id, user3, SITE_ROLES.SITE_CONSUMER.ROLE); + await myLibrariesPage.libraryDetails.descriptionField.fill('new description'); + await myLibrariesPage.libraryDetails.updateButton.click(); - await expect(myLibrariesPage.snackBar.message).toEqual('There was an error updating library properties'); - }); + expect(await myLibrariesPage.snackBar.message.textContent()).toEqual('There was an error updating library properties'); }); }); diff --git a/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts b/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts index 39d0015fd4..19fbf78ce6 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/adf-info-drawer.component.ts @@ -1,26 +1,26 @@ /*! - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ + * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. + * + * Alfresco Example Content Application + * + * This file is part of the Alfresco Example Content Application. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * The Alfresco Example Content Application is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Alfresco Example Content Application is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * from Hyland Software. If not, see . + */ import { BaseComponent } from './base.component'; import { Page, expect } from '@playwright/test'; @@ -34,10 +34,11 @@ export class AdfInfoDrawerComponent extends BaseComponent { public getNameField = (labelText: string) => this.getChild('[data-automation-id="library-name-properties-wrapper"]', { hasText: labelText }); public getIdField = (labelText: string) => this.getChild('[data-automation-id="library-id-properties-wrapper"]', { hasText: labelText }); - public getVisibilityField = (labelText: string) => this.getChild('[data-automation-id="library-visibility-properties-wrapper"]', { hasText: labelText }); + public getVisibilityField = (labelText: string) => + this.getChild('[data-automation-id="library-visibility-properties-wrapper"]', { hasText: labelText }); public getDescriptionField = this.getChild('[data-automation-id="library-description-properties-wrapper"] textarea'); - public propertiesTab = this.page.getByRole('tab', { name: 'Properties'}); - public commentsTab = this.page.getByRole('tab', { name: 'Comments'}); + public propertiesTab = this.page.getByRole('tab', { name: 'Properties' }); + public commentsTab = this.page.getByRole('tab', { name: 'Comments' }); public infoDrawerTabs = this.getChild('.adf-info-drawer-tab'); public commentInputField = this.getChild('mat-form-field'); public commentsHeader = this.getChild('#comment-header'); @@ -49,13 +50,19 @@ export class AdfInfoDrawerComponent extends BaseComponent { public commentProfileIcon = this.getChild('.adf-comment-user-icon'); public infoDrawerPanel = this.page.locator('.adf-info-drawer'); public headerTitle = this.page.locator('.adf-info-drawer-layout-header-title').getByRole('heading'); - public editButton = this.page.getByRole('button', { name: 'Edit'}); - public cancelButton = this.page.getByRole('button', { name: 'Cancel'}); - public updateButton = this.page.getByRole('button', { name: 'Update'}); + public editButton = this.page.getByRole('button', { name: 'Edit' }); + public cancelButton = this.page.getByRole('button', { name: 'Cancel' }); + public updateButton = this.page.getByRole('button', { name: 'Update' }); public hintMessage = this.page.locator('.mat-hint'); + public errorMessage = this.page.locator('.mat-error'); public expandDetailsButton = this.getChild(`button[title='Expand panel']`); public expandedDetailsTabs = this.page.locator('.aca-details-container .mat-tab-label-content'); - public expandedDetailsPermissionsTab = this.expandedDetailsTabs.getByText("Permissions"); + public expandedDetailsPermissionsTab = this.expandedDetailsTabs.getByText('Permissions'); + public nameField = this.page.locator('label', { hasText: 'Name' }); + public idField = this.page.locator('label', { hasText: 'Library ID' }); + public descriptionField = this.page.locator('label', { hasText: 'Description' }); + public visibilityField = this.infoDrawerPanel.getByRole('combobox'); + public selectVisbility = (visibilityOption: string) => this.page.getByRole('listbox').getByRole('option', { name: visibilityOption }).click(); async checkCommentsHeaderCount(): Promise { const commentsCountTextContent = await this.commentsHeader.textContent(); diff --git a/projects/aca-playwright-shared/src/utils/config.ts b/projects/aca-playwright-shared/src/utils/config.ts index f85982bae7..4575a49eb7 100644 --- a/projects/aca-playwright-shared/src/utils/config.ts +++ b/projects/aca-playwright-shared/src/utils/config.ts @@ -43,3 +43,31 @@ export const SIDEBAR_LABELS = { FAVORITES: 'Favorites', TRASH: 'Trash' }; + +export const SITE_VISIBILITY = { + PUBLIC: 'PUBLIC', + MODERATED: 'MODERATED', + PRIVATE: 'PRIVATE' +}; + +export const SITE_ROLES = { + SITE_CONSUMER: { + ROLE: 'SiteConsumer', + LABEL: 'Consumer' + }, + SITE_COLLABORATOR: { + ROLE: 'SiteCollaborator', + LABEL: 'Collaborator' + }, + SITE_CONTRIBUTOR: { + ROLE: 'SiteContributor', + LABEL: 'Contributor' + }, + SITE_MANAGER: { + ROLE: 'SiteManager', + LABEL: 'Manager' + }, + NONE: { + LABEL: 'Not a member' + } +};