diff --git a/e2e/playwright/info-drawer/playwright.config.ts b/e2e/playwright/info-drawer/playwright.config.ts index 2f5d2d83ff..31cb13ef51 100644 --- a/e2e/playwright/info-drawer/playwright.config.ts +++ b/e2e/playwright/info-drawer/playwright.config.ts @@ -35,7 +35,7 @@ const config: PlaywrightTestConfig = { name: 'Info Drawer', testDir: './src/tests', use: { - users: ['hruser', 'admin'] + users: [] } } ] diff --git a/e2e/playwright/info-drawer/src/tests/general.spec.ts b/e2e/playwright/info-drawer/src/tests/general.spec.ts new file mode 100644 index 0000000000..5e61d1cc4a --- /dev/null +++ b/e2e/playwright/info-drawer/src/tests/general.spec.ts @@ -0,0 +1,90 @@ +/*! + * 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 { expect } from '@playwright/test'; +import { ApiClientFactory, Utils, test, TrashcanApi, NodesApi, FileActionsApi } from '@alfresco/playwright-shared'; + +test.describe('Info Drawer - General', () => { + let fileActionsApi: FileActionsApi; + let trashcanApi: TrashcanApi; + let nodesApi: NodesApi; + + const username = `user1-${Utils.random()}`; + + test.beforeEach(async ({ loginPage }) => { + try { + await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); + } catch (error) { + console.error(`beforeEach failed: ${error}`); + } + }); + + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + fileActionsApi = await FileActionsApi.initialize(username, username); + trashcanApi = await TrashcanApi.initialize(username, username); + nodesApi = await NodesApi.initialize(username, username); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test.afterAll(async () => { + try { + await trashcanApi.emptyTrashcan(); + await nodesApi.deleteCurrentUserNodes(); + } catch (error) { + console.error(`afterAll failed: ${error}`); + } + }); + + test('[C268999] Info drawer closes on page refresh', async ({ personalFiles }) => { + const parentFolder = `parent-${Utils.random()}`; + const file1 = `file1-${Utils.random()}.txt`; + const folder1 = `folder1-${Utils.random()}`; + const parentId = (await nodesApi.createFolder(parentFolder)).entry.id; + + await nodesApi.createFile(file1, parentId); + await nodesApi.createFolder(folder1, parentId); + await fileActionsApi.waitForNodes(file1, { expect: 1 }); + await personalFiles.navigate(); + await expect(personalFiles.dataTable.getRowByName(parentFolder)).toBeVisible(); + await personalFiles.dataTable.performClickFolderOrFileToOpen(parentFolder); + await personalFiles.dataTable.selectItem(file1); + await personalFiles.acaHeader.viewDetails.click(); + await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible(); + + await personalFiles.reload({ waitUntil: 'load' }); + await expect(personalFiles.infoDrawer.infoDrawerPanel).not.toBeVisible(); + await personalFiles.dataTable.selectItem(file1); + await personalFiles.acaHeader.viewDetails.click(); + await expect(personalFiles.infoDrawer.infoDrawerPanel).toBeVisible(); + + await personalFiles.reload({ waitUntil: 'load' }); + await expect(personalFiles.infoDrawer.infoDrawerPanel).not.toBeVisible(); + }); +}); diff --git a/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts b/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts new file mode 100644 index 0000000000..94f9f96ed5 --- /dev/null +++ b/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts @@ -0,0 +1,256 @@ +/*! + * 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 { expect } from '@playwright/test'; +import { ApiClientFactory, Utils, test, SitesApi, QueriesApi, SITE_VISIBILITY, SITE_ROLES } from '@alfresco/playwright-shared'; + +test.describe('Library properties', () => { + let sitesApi: SitesApi; + + const username = `user1-${Utils.random()}`; + const site = { + name: `site1-${Utils.random()}`, + id: `site-id-${Utils.random()}`, + visibility: SITE_VISIBILITY.MODERATED, + description: 'my site description' + }; + const siteForUpdate = { + name: `site2-${Utils.random()}`, + id: `site-id-${Utils.random()}`, + visibility: SITE_VISIBILITY.MODERATED, + description: 'my initial description' + }; + const siteDup = `site3-${Utils.random()}`; + + test.beforeEach(async ({ myLibrariesPage, loginPage }) => { + try { + await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); + await myLibrariesPage.navigate(); + } catch (error) { + console.error(` beforeEach failed: ${error}`); + } + }); + + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + + sitesApi = await SitesApi.initialize(username, username); + await sitesApi.createSite(site.name, site.visibility, site.description, site.id); + await sitesApi.createSite(siteForUpdate.name, siteForUpdate.visibility, siteForUpdate.description, siteForUpdate.id); + await sitesApi.createSite(siteDup); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test.afterAll(async () => { + await sitesApi.deleteSites([site.id, siteForUpdate.id, siteDup]); + }); + + test('[C289336] Info drawer opens for a library', async ({ myLibrariesPage }) => { + await expect(myLibrariesPage.dataTable.getRowByName(site.name)).toBeVisible(); + await myLibrariesPage.dataTable.getRowByName(site.name).click(); + await myLibrariesPage.acaHeader.viewDetails.click(); + + 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.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.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.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(); + await expect(myLibrariesPage.libraryDetails.updateButton).toBeDisabled(); + }); + + test('[C289339] Edit site details', async ({ myLibrariesPage }) => { + const siteUpdated = { + name: `site-for-rename-${Utils.random()}`, + visibility: SITE_VISIBILITY.PRIVATE, + description: 'new description' + }; + + 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.nameField.fill(siteUpdated.name); + await myLibrariesPage.libraryDetails.visibilityField.click(); + await myLibrariesPage.libraryDetails.selectVisibility(siteUpdated.visibility); + await myLibrariesPage.libraryDetails.descriptionField.fill(siteUpdated.description); + await expect(myLibrariesPage.libraryDetails.updateButton).toBeEnabled(); + + await myLibrariesPage.libraryDetails.updateButton.click(); + 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); + }); + + test('[C289340] Cancel editing a site', async ({ myLibrariesPage }) => { + const newName = `new-name-${Utils.random}`; + const newDesc = `new desc ${Utils.random}`; + + 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 myLibrariesPage.libraryDetails.nameField.fill(newName); + await myLibrariesPage.libraryDetails.visibilityField.click(); + await myLibrariesPage.libraryDetails.selectVisibility(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); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + }); + + test('[C289341] Warning appears when editing the name of the library by entering an existing name', async ({ myLibrariesPage }) => { + const queriesApi = await QueriesApi.initialize(username, username); + + await queriesApi.waitForSites(site.name, { expect: 1 }); + await myLibrariesPage.dataTable.getRowByName(siteDup).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.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.getRowByName(site.name).click(); + await myLibrariesPage.acaHeader.viewDetails.click(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + + await myLibrariesPage.libraryDetails.editButton.click(); + 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).toBeDisabled(); + }); + + test('[C289343] Site description too long', async ({ myLibrariesPage }) => { + await myLibrariesPage.dataTable.getRowByName(site.name).click(); + await myLibrariesPage.acaHeader.viewDetails.click(); + await expect(myLibrariesPage.libraryDetails.infoDrawerPanel).toBeVisible(); + + await myLibrariesPage.libraryDetails.editButton.click(); + 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).toBeDisabled(); + }); +}); + +test.describe('Non manager', () => { + let sitesApi: SitesApi; + + const username = `user1-${Utils.random()}`; + const user2 = `user2-${Utils.random()}`; + const user3 = `user3-${Utils.random()}`; + const site = { + name: `site1-${Utils.random()}`, + id: `site-id-${Utils.random()}`, + visibility: SITE_VISIBILITY.MODERATED, + description: 'my site description' + }; + + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + await apiClientFactory.createUser({ username: user2 }); + await apiClientFactory.createUser({ username: user3 }); + + 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(); + + expect(await myLibrariesPage.snackBar.message.textContent()).toEqual('There was an error updating library properties'); + }); +}); diff --git a/projects/aca-playwright-shared/src/api/api-client-factory.ts b/projects/aca-playwright-shared/src/api/api-client-factory.ts index 1eec3b96fe..585966fce7 100644 --- a/projects/aca-playwright-shared/src/api/api-client-factory.ts +++ b/projects/aca-playwright-shared/src/api/api-client-factory.ts @@ -85,6 +85,7 @@ export class ApiClientFactory { public favorites: FavoritesApi; public trashCan: TrashcanApi; public commentsApi: CommentsApi; + public queriesApi: QueriesApi; constructor() { this.alfrescoApi = new AlfrescoApi(config); @@ -108,6 +109,7 @@ export class ApiClientFactory { this.favorites = new FavoritesApi(this.alfrescoApi); this.trashCan = new TrashcanApi(this.alfrescoApi); this.commentsApi = new CommentsApi(this.alfrescoApi); + this.queriesApi = new QueriesApi(this.alfrescoApi); return this; } diff --git a/projects/aca-playwright-shared/src/api/index.ts b/projects/aca-playwright-shared/src/api/index.ts index a855779580..0cdb747b0c 100644 --- a/projects/aca-playwright-shared/src/api/index.ts +++ b/projects/aca-playwright-shared/src/api/index.ts @@ -33,3 +33,4 @@ export * from './sites-api'; export * from './node-content-tree'; export * from './search-api'; export * from './trashcan-api'; +export * from './queries-api'; diff --git a/projects/aca-playwright-shared/src/api/queries-api.ts b/projects/aca-playwright-shared/src/api/queries-api.ts new file mode 100755 index 0000000000..0bc00aea82 --- /dev/null +++ b/projects/aca-playwright-shared/src/api/queries-api.ts @@ -0,0 +1,75 @@ +/*! + * 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 + * along with Alfresco. If not, see . + */ + +import { FindQuery } from '@alfresco/js-api'; +import { Utils } from '../utils'; +import { ApiClientFactory } from './api-client-factory'; + +export class QueriesApi { + private apiService: ApiClientFactory; + + constructor() { + this.apiService = new ApiClientFactory(); + } + + static async initialize(userName: string, password?: string): Promise { + const classObj = new QueriesApi(); + await classObj.apiService.setUpAcaBackend(userName, password); + return classObj; + } + + async waitForSites(searchTerm: string, data: { expect: number }): Promise { + try { + const sites = async () => { + const totalItems = await this.findSitesTotalItems(searchTerm); + if (totalItems !== data.expect) { + return Promise.reject(totalItems); + } else { + return Promise.resolve(totalItems); + } + }; + + return await Utils.retryCall(sites); + } catch (error) { + console.error(`QueriesApi waitForSites : catch : `); + console.error(`\tExpected: ${data.expect} items, but found ${error}`); + return null; + } + } + + private async findSitesTotalItems(searchTerm: string): Promise { + try { + const opts: FindQuery = { + term: searchTerm, + fields: ['title'] + }; + + const sites = await this.apiService.queries.findSites(searchTerm, opts); + return sites.list.pagination.totalItems; + } catch (error) { + console.error(`QueriesApi findSitesTotalItems : catch :`, error); + return null; + } + } +} diff --git a/projects/aca-playwright-shared/src/api/sites-api.ts b/projects/aca-playwright-shared/src/api/sites-api.ts index a2e27f2b3c..9bd6de215b 100755 --- a/projects/aca-playwright-shared/src/api/sites-api.ts +++ b/projects/aca-playwright-shared/src/api/sites-api.ts @@ -158,4 +158,13 @@ export class SitesApi { console.error(`SitesApi deleteSiteMember : catch : `, error); } } + + async getSite(siteId: string): Promise { + try { + return await this.apiService.sites.getSite(siteId); + } catch (error) { + console.error(`SitesApi getSite : catch : `, error); + return null; + } + } } 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 3edb4ce8d7..f52ffa1ce0 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,11 +34,12 @@ 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 infoDrawerTabs = this.getChild('.adf-info-drawer-tab'); - public propertiesTab = this.infoDrawerTabs.nth(0); - public commentsTab = this.infoDrawerTabs.nth(1); public commentInputField = this.getChild('mat-form-field'); public commentsHeader = this.getChild('#comment-header'); public addCommentButton = this.getChild('[data-automation-id="comments-input-add"]'); @@ -46,11 +47,21 @@ export class AdfInfoDrawerComponent extends BaseComponent { public commentUsername = this.getChild('.adf-comment-user-name'); public commentTextContent = this.getChild('.adf-comment-message'); public commentTimestamp = this.getChild('.adf-comment-message-time'); - public headerTitle = this.getChild('.adf-info-drawer-layout-header-title div'); + 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 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 selectVisibility = (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..41f572999e 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_ROLES = { + SITE_MANAGER: { + ROLE: 'SiteManager', + LABEL: 'Manager' + }, + SITE_CONSUMER: { + ROLE: 'SiteConsumer', + LABEL: 'Consumer' + }, + SITE_CONTRIBUTOR: { + ROLE: 'SiteContributor', + LABEL: 'Contributor' + }, + SITE_COLLABORATOR: { + ROLE: 'SiteCollaborator', + LABEL: 'Collaborator' + }, + NONE: { + LABEL: 'Not a member' + } +}; + +export const SITE_VISIBILITY = { + PUBLIC: 'PUBLIC', + MODERATED: 'MODERATED', + PRIVATE: 'PRIVATE' +};