From ddda167de3d1cd46979f9e5bac74812c6c53b751 Mon Sep 17 00:00:00 2001 From: "akash.rathod@hyland.com" Date: Tue, 18 Jul 2023 16:41:36 +0200 Subject: [PATCH 1/3] re-enable protracotr test --- e2e/playwright/viewer/exclude.tests.json | 7 ++- .../suites/viewer/viewer-general.test.ts | 44 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/e2e/playwright/viewer/exclude.tests.json b/e2e/playwright/viewer/exclude.tests.json index 0967ef424b..e43a787031 100644 --- a/e2e/playwright/viewer/exclude.tests.json +++ b/e2e/playwright/viewer/exclude.tests.json @@ -1 +1,6 @@ -{} +{ + "C284636" : "https://alfresco.atlassian.net/browse/ACS-5639", + "C284635" : "https://alfresco.atlassian.net/browse/ACS-5639", + "C279175" : "https://alfresco.atlassian.net/browse/ACS-5639", + "C284634" : "https://alfresco.atlassian.net/browse/ACS-5639" +} diff --git a/e2e/protractor/suites/viewer/viewer-general.test.ts b/e2e/protractor/suites/viewer/viewer-general.test.ts index 37f12450d1..0685d5fcdc 100755 --- a/e2e/protractor/suites/viewer/viewer-general.test.ts +++ b/e2e/protractor/suites/viewer/viewer-general.test.ts @@ -48,8 +48,9 @@ describe('Viewer general', () => { const loginPage = new LoginPage(); const page = new BrowsingPage(); - const { dataTable } = page; + const { dataTable, toolbar } = page; const viewer = new Viewer(); + const { searchInput } = page.pageLayoutHeader; const adminApiActions = new AdminActions(); const userActions = new UserActions(); @@ -112,4 +113,45 @@ describe('Viewer general', () => { expect(await viewer.isCloseButtonDisplayed()).toBe(true, 'Close button is not displayed'); expect(await viewer.isFileTitleDisplayed()).toBe(true, 'File title is not displayed'); }); + + it('[C284636] Viewer opens for a file from Recent Files', async () => { + await page.clickRecentFilesAndWait(); + await dataTable.doubleClickOnRowByName(xlsxFile); + expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened'); + expect(await viewer.isViewerToolbarDisplayed()).toBe(true, 'Toolbar not displayed'); + expect(await viewer.isCloseButtonDisplayed()).toBe(true, 'Close button is not displayed'); + expect(await viewer.isFileTitleDisplayed()).toBe(true, 'File title is not displayed'); + }); + + it('[C284635] Viewer opens for a file from Shared Files', async () => { + await page.clickSharedFilesAndWait(); + await dataTable.doubleClickOnRowByName(xlsxFile); + expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened'); + expect(await viewer.isViewerToolbarDisplayed()).toBe(true, 'Toolbar not displayed'); + expect(await viewer.isCloseButtonDisplayed()).toBe(true, 'Close button is not displayed'); + expect(await viewer.isFileTitleDisplayed()).toBe(true, 'File title is not displayed'); + }); + + it('[C284634] Viewer opens for a file from Favorites', async () => { + await page.clickFavoritesAndWait(); + await dataTable.doubleClickOnRowByName(xlsxFile); + expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened'); + expect(await viewer.isViewerToolbarDisplayed()).toBe(true, 'Toolbar not displayed'); + expect(await viewer.isCloseButtonDisplayed()).toBe(true, 'Close button is not displayed'); + expect(await viewer.isFileTitleDisplayed()).toBe(true, 'File title is not displayed'); + }); + + it('[C279175] Viewer opens for a file from Search Results', async () => { + await toolbar.clickSearchIconButton(); + await searchInput.clickSearchButton(); + await searchInput.checkFilesAndFolders(); + await searchInput.searchFor(xlsxFile); + await dataTable.waitForBody(); + + await dataTable.doubleClickOnRowByName(xlsxFile); + expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened'); + expect(await viewer.isViewerToolbarDisplayed()).toBe(true, 'Toolbar not displayed'); + expect(await viewer.isCloseButtonDisplayed()).toBe(true, 'Close button is not displayed'); + expect(await viewer.isFileTitleDisplayed()).toBe(true, 'File title is not displayed'); + }); }); From 4c85b441773d9adcaa852d093e79a97e87d8eab4 Mon Sep 17 00:00:00 2001 From: "akash.rathod@hyland.com" Date: Wed, 19 Jul 2023 11:40:41 +0200 Subject: [PATCH 2/3] viewer protected file tests --- .../viewer/src/tests/viewer-protected.spec.ts | 91 ++++++++++++++++++ .../viewer/src/tests/viewer.spec.ts | 8 +- e2e/protractor/protractor.excludes.json | 8 +- .../page-objects/components/dialogs/index.ts | 2 +- .../password-overlay-dialog.component.ts | 83 ++++++++++++++++ .../components/viewer.component.ts | 11 +++ .../page-objects/pages/personal-files.page.ts | 4 +- .../test-files/file-pdf-protected.pdf | Bin 0 -> 18052 bytes .../src/resources/test-files/index.ts | 52 +++++++--- 9 files changed, 236 insertions(+), 23 deletions(-) create mode 100644 e2e/playwright/viewer/src/tests/viewer-protected.spec.ts create mode 100644 projects/aca-playwright-shared/src/page-objects/components/dialogs/password-overlay-dialog.component.ts create mode 100644 projects/aca-playwright-shared/src/resources/test-files/file-pdf-protected.pdf diff --git a/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts b/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts new file mode 100644 index 0000000000..1acdc84cb2 --- /dev/null +++ b/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts @@ -0,0 +1,91 @@ +/*! + * 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, getUserState, test, TEST_FILES, Utils } from '@alfresco/playwright-shared'; + +test.use({ storageState: getUserState('hruser') }); +test.describe('viewer file', () => { + const apiClientFactory = new ApiClientFactory(); + const randomFolderName = `playwright-folder-${Utils.random()}`; + const randomDocxName = `$(TEST_FILES.DOCX_PROTECTED.name)-${Utils.random()}`; + let folderId: string; + let fileDocxId: string; + + test.beforeAll(async ({ fileAction, shareAction, favoritesPageAction: favoritesPageAction }) => { + await apiClientFactory.setUpAcaBackend('hruser'); + const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); + folderId = await node.entry.id; + const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX_PROTECTED.path, randomDocxName, folderId); + fileDocxId = await fileDoc.entry.id; + await shareAction.shareFileById(fileDocxId); + await favoritesPageAction.addFavoriteById('file', fileDocxId); + }); + + test.beforeEach(async ({ personalFiles }) => { + await personalFiles.navigate({ waitUntil: 'domcontentloaded' }); + await personalFiles.dataTable.performClickFolderOrFileToOpen(randomFolderName); + await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName); + }); + + test.afterAll(async () => { + await apiClientFactory.nodes.deleteNode(folderId); + }); + + test('[C268958] Password dialog appears when opening a protected file', async ({ personalFiles }) => { + expect(await personalFiles.passwordDialog.isDialogOpen(), 'Password dialog not open').toBe(true); + expect(await personalFiles.passwordDialog.isPasswordInputDisplayed(), 'Password input not displayed').toBe(true); + expect(await personalFiles.passwordDialog.submitButton.isHidden(), 'Submit button not disabled').toBe(false); + expect(await personalFiles.passwordDialog.isCloseVisible(), 'Close button not enabled').toBe(true); + expect(await personalFiles.viewer.pdfViewerContentPages.isVisible(), 'Viewer did not close').toBe(false); + }); + + test('[C268959] File content is displayed when entering the correct password', async ({ personalFiles }) => { + await personalFiles.passwordDialog.enterPassword(TEST_FILES.DOCX_PROTECTED.password); + expect(await personalFiles.passwordDialog.submitButton.isVisible(), 'Submit button not enabled').toBe(true); + + await personalFiles.passwordDialog.submitButton.click(); + await personalFiles.passwordDialog.waitForDialogToClose(); + + expect(await personalFiles.viewer.isPdfViewerContentDisplayed(), 'file content not displayed').toBe(true); + }); + + test('[C268960] Error appears when entering an incorrect password', async ({ personalFiles }) => { + await personalFiles.passwordDialog.enterPassword('incorrect'); + expect(await personalFiles.passwordDialog.submitButton.isVisible(), 'Submit button not enabled').toBe(true); + await personalFiles.passwordDialog.submitButton.click(); + + expect(await personalFiles.passwordDialog.getErrorMessage()).toBe('Password is wrong'); + expect(await personalFiles.viewer.isPdfViewerContentDisplayed(), 'file content is displayed').toBe(false); + }); + + test('[C268961] Refresh the page while Password dialog is open', async ({ personalFiles }) => { + await personalFiles.passwordDialog.enterPassword(TEST_FILES.DOCX_PROTECTED.password); + await personalFiles.reload({ waitUntil: 'domcontentloaded' }); + await personalFiles.viewer.waitForViewerToOpen(); + + expect(await personalFiles.viewer.isPdfViewerContentDisplayed(), 'file content is displayed').toBe(false); + expect(await personalFiles.passwordDialog.isDialogOpen(), 'Password dialog not open').toBe(true); + }); +}); diff --git a/e2e/playwright/viewer/src/tests/viewer.spec.ts b/e2e/playwright/viewer/src/tests/viewer.spec.ts index 709b554a4e..d7f9a21ed8 100644 --- a/e2e/playwright/viewer/src/tests/viewer.spec.ts +++ b/e2e/playwright/viewer/src/tests/viewer.spec.ts @@ -23,13 +23,13 @@ */ import { expect } from '@playwright/test'; -import { ApiClientFactory, getUserState, test, TEST_FILES } from '@alfresco/playwright-shared'; +import { ApiClientFactory, getUserState, test, TEST_FILES, Utils } from '@alfresco/playwright-shared'; test.use({ storageState: getUserState('admin') }); test.describe('viewer file', () => { const apiClientFactory = new ApiClientFactory(); - const randomFolderName = `playwright-folder-${(Math.random() + 1).toString(36).substring(6)}`; - const randomDocxName = TEST_FILES.DOCX.name + (Math.random() + 1).toString(36).substring(6); + const randomFolderName = `playwright-folder-${Utils.random()}`; + const randomDocxName = `$(TEST_FILES.DOCX.name)-${Utils.random()}`; let folderId: string; let fileDocxId: string; @@ -76,7 +76,7 @@ test.describe('viewer file', () => { await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName); expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); await personalFiles.viewer.closeButtonLocator.click(); - expect(await personalFiles.viewer.isViewerOpened(), 'Viewer did not close').toBe(false); + expect(await personalFiles.dataTable.getCellLinkByName(randomDocxName).isVisible(), 'Viewer did not close').toBe(true); }); test('[C284632] Close button tooltip', async ({ personalFiles }) => { diff --git a/e2e/protractor/protractor.excludes.json b/e2e/protractor/protractor.excludes.json index 8f26192e3a..353fbcc7d9 100644 --- a/e2e/protractor/protractor.excludes.json +++ b/e2e/protractor/protractor.excludes.json @@ -19,5 +19,11 @@ "C279221": "temp, will be fixed in https://alfresco.atlassian.net/browse/ACS-4985", "C279220": "temp, will be fixed in https://alfresco.atlassian.net/browse/ACS-4985", "C325006": "temp, will be fixed in https://alfresco.atlassian.net/browse/ACS-4985", - "C213097": "https://alfresco.atlassian.net/browse/ACS-5479" + "C213097": "https://alfresco.atlassian.net/browse/ACS-5479", + + "C268958" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5604", + "C268959" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5604", + "C268960" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5604", + "C268961" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5604" + } diff --git a/projects/aca-playwright-shared/src/page-objects/components/dialogs/index.ts b/projects/aca-playwright-shared/src/page-objects/components/dialogs/index.ts index 1177660266..8a0e9a2a04 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/dialogs/index.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/dialogs/index.ts @@ -24,4 +24,4 @@ export * from './adf-folder-dialog.component'; export * from './adf-library-dialog.component'; - +export * from './password-overlay-dialog.component'; diff --git a/projects/aca-playwright-shared/src/page-objects/components/dialogs/password-overlay-dialog.component.ts b/projects/aca-playwright-shared/src/page-objects/components/dialogs/password-overlay-dialog.component.ts new file mode 100644 index 0000000000..0255cb12a1 --- /dev/null +++ b/projects/aca-playwright-shared/src/page-objects/components/dialogs/password-overlay-dialog.component.ts @@ -0,0 +1,83 @@ +/*! + * 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 { Page } from '@playwright/test'; +import { BaseComponent } from '../base.component'; +import { timeouts } from '../../../utils'; + +export class PasswordOverlayDialogComponent extends BaseComponent { + private static rootElement = '.cdk-overlay-pane'; + + public closeButton = this.getChild('[data-automation-id="adf-password-dialog-close"]'); + public submitButton = this.getChild('[data-automation-id="adf-password-dialog-submit"]'); + public passwordInput = this.getChild('[data-automation-id="adf-password-dialog-input"]'); + public errorMessage = this.getChild('[data-automation-id="adf-password-dialog-error"]'); + + constructor(page: Page, rootElement = PasswordOverlayDialogComponent.rootElement) { + super(page, rootElement); + } + + async waitForDialogToOpen(): Promise { + await this.spinnerWaitForReload(); + await this.passwordInput.waitFor({ state: 'attached', timeout: timeouts.large }); + await this.passwordInput.isVisible(); + } + + async waitForDialogToClose(): Promise { + await this.passwordInput.waitFor({ state: 'detached', timeout: timeouts.large }); + } + + async isDialogOpen(): Promise { + await this.waitForDialogToOpen(); + return await this.passwordInput.isVisible(); + } + + async isCloseVisible(): Promise { + return await this.closeButton.isVisible(); + } + + async isSubmitHidden(): Promise { + return await this.submitButton.isHidden(); + } + + async isPasswordInputDisplayed(): Promise { + return await this.passwordInput.isVisible(); + } + + async isErrorDisplayed(): Promise { + await this.errorMessage.waitFor({ state: 'visible', timeout: timeouts.short }); + return await this.errorMessage.isVisible(); + } + + async getErrorMessage(): Promise { + if (await this.isErrorDisplayed()) { + return this.errorMessage.innerText(); + } + return ''; + } + + async enterPassword(password: string): Promise { + await this.passwordInput.fill(password); + } +} diff --git a/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts b/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts index 0aaa290014..16b7ad4093 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/viewer.component.ts @@ -33,6 +33,7 @@ export class ViewerComponent extends BaseComponent { private viewerLocator = this.getChild('.adf-viewer-render-layout-content'); public closeButtonLocator = this.getChild('.adf-viewer-close-button'); public fileTitleButtonLocator = this.getChild('.adf-viewer__file-title'); + public pdfViewerContentPages = this.getChild('.adf-pdf-viewer__content .page'); toolbar = new AcaHeader(this.page); @@ -40,7 +41,17 @@ export class ViewerComponent extends BaseComponent { super(page, ViewerComponent.rootElement); } + async isPdfViewerContentDisplayed(): Promise { + const count = await this.pdfViewerContentPages.count(); + return count > 0; + } + + async waitForViewerToOpen(): Promise { + await this.viewerLocator.waitFor({ state: 'visible', timeout: timeouts.medium }); + } + async isViewerOpened(): Promise { + await this.waitForViewerToOpen(); return await this.viewerLocator.isVisible(); } diff --git a/projects/aca-playwright-shared/src/page-objects/pages/personal-files.page.ts b/projects/aca-playwright-shared/src/page-objects/pages/personal-files.page.ts index 94251cc440..daf2d2aa2b 100644 --- a/projects/aca-playwright-shared/src/page-objects/pages/personal-files.page.ts +++ b/projects/aca-playwright-shared/src/page-objects/pages/personal-files.page.ts @@ -22,12 +22,11 @@ * from Hyland Software. If not, see . */ - import { Page } from '@playwright/test'; import { BasePage } from './base.page'; import { DataTableComponent, MatMenuComponent, ViewerComponent } from '../components'; import { AcaHeader } from '../components/aca-header.component'; -import { AdfFolderDialogComponent } from '../components/dialogs'; +import { AdfFolderDialogComponent, PasswordOverlayDialogComponent } from '../components/dialogs'; export class PersonalFilesPage extends BasePage { private static pageUrl = 'personal-files'; @@ -41,4 +40,5 @@ export class PersonalFilesPage extends BasePage { public folderDialog = new AdfFolderDialogComponent(this.page); public dataTable = new DataTableComponent(this.page); public viewer = new ViewerComponent(this.page); + public passwordDialog = new PasswordOverlayDialogComponent(this.page); } diff --git a/projects/aca-playwright-shared/src/resources/test-files/file-pdf-protected.pdf b/projects/aca-playwright-shared/src/resources/test-files/file-pdf-protected.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0d083f114898f160cad4b07fdb57046a46cfdf8 GIT binary patch literal 18052 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�n$D2q#UC*S2dlsX7xdxaRXh03)Na4ql`!)% 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 literal 0 HcmV?d00001 diff --git a/projects/aca-playwright-shared/src/resources/test-files/index.ts b/projects/aca-playwright-shared/src/resources/test-files/index.ts index a516a5d5c3..7c745a1199 100644 --- a/projects/aca-playwright-shared/src/resources/test-files/index.ts +++ b/projects/aca-playwright-shared/src/resources/test-files/index.ts @@ -1,22 +1,44 @@ -/* - * Copyright © 2005 - 2021 Alfresco Software, Ltd. All rights reserved. +/*! + * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. * - * License rights for this program may be obtained from Alfresco Software, Ltd. - * pursuant to a written agreement and any use of this program without such an - * agreement is prohibited. + * 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 { resolve } from 'path'; export const TEST_FILES = { - DOCX: { - path: resolve(__dirname, 'file-docx.docx'), - name: 'file-docx', - data: 'Lorem ipsum dolor sit amet' - }, - PDF: { - path: resolve(__dirname, 'file-pdf.pdf'), - name: 'file-pdf', - data: 'Lorem ipsum dolor sit amet' - }, + DOCX: { + path: resolve(__dirname, 'file-docx.docx'), + name: 'file-docx', + data: 'Lorem ipsum dolor sit amet' + }, + PDF: { + path: resolve(__dirname, 'file-pdf.pdf'), + name: 'file-pdf', + data: 'Lorem ipsum dolor sit amet' + }, + DOCX_PROTECTED: { + path: resolve(__dirname, 'file-pdf-protected.pdf'), + name: 'file-pdf-protected', + data: 'Lorem ipsum dolor sit amet', + password: '0000' + } }; From 13be03474849feff45679ad4dfb58805358b2b29 Mon Sep 17 00:00:00 2001 From: "akash.rathod@hyland.com" Date: Wed, 19 Jul 2023 18:59:50 +0200 Subject: [PATCH 3/3] remove navigate though pages --- .../viewer/src/tests/viewer-protected.spec.ts | 6 +- .../viewer/src/tests/viewer.spec.ts | 78 ++++++++++++------- .../dataTable/data-table.component.ts | 13 ++-- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts b/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts index 1acdc84cb2..565ab2863f 100644 --- a/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts +++ b/e2e/playwright/viewer/src/tests/viewer-protected.spec.ts @@ -29,7 +29,7 @@ test.use({ storageState: getUserState('hruser') }); test.describe('viewer file', () => { const apiClientFactory = new ApiClientFactory(); const randomFolderName = `playwright-folder-${Utils.random()}`; - const randomDocxName = `$(TEST_FILES.DOCX_PROTECTED.name)-${Utils.random()}`; + const randomDocxName = `${TEST_FILES.DOCX_PROTECTED.name}-${Utils.random()}`; let folderId: string; let fileDocxId: string; @@ -44,8 +44,8 @@ test.describe('viewer file', () => { }); test.beforeEach(async ({ personalFiles }) => { - await personalFiles.navigate({ waitUntil: 'domcontentloaded' }); - await personalFiles.dataTable.performClickFolderOrFileToOpen(randomFolderName); + const gotoNodeURL = `#/personal-files/${folderId}`; + await personalFiles.navigate({ remoteUrl: gotoNodeURL }); await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName); }); diff --git a/e2e/playwright/viewer/src/tests/viewer.spec.ts b/e2e/playwright/viewer/src/tests/viewer.spec.ts index d7f9a21ed8..205f933b41 100644 --- a/e2e/playwright/viewer/src/tests/viewer.spec.ts +++ b/e2e/playwright/viewer/src/tests/viewer.spec.ts @@ -31,21 +31,17 @@ test.describe('viewer file', () => { const randomFolderName = `playwright-folder-${Utils.random()}`; const randomDocxName = `$(TEST_FILES.DOCX.name)-${Utils.random()}`; let folderId: string; - let fileDocxId: string; - test.beforeAll(async ({ fileAction, shareAction, favoritesPageAction: favoritesPageAction }) => { + test.beforeAll(async ({ fileAction }) => { await apiClientFactory.setUpAcaBackend('admin'); const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); folderId = await node.entry.id; - const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); - fileDocxId = await fileDoc.entry.id; - await shareAction.shareFileById(fileDocxId); - await favoritesPageAction.addFavoriteById('file', fileDocxId); + await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); }); test.beforeEach(async ({ personalFiles }) => { - await personalFiles.navigate({ waitUntil: 'domcontentloaded' }); - await personalFiles.dataTable.performClickFolderOrFileToOpen(randomFolderName); + const gotoNodeURL = `#/personal-files/${folderId}`; + await personalFiles.navigate({ remoteUrl: gotoNodeURL }); }); test.afterAll(async () => { @@ -84,14 +80,6 @@ test.describe('viewer file', () => { expect(await personalFiles.viewer.getCloseButtonTooltip()).toEqual('Close'); }); - test('[C279285] Viewer opens when accessing the preview URL for a file', async ({ personalFiles }) => { - const previewURL = `#/personal-files/${folderId}/(viewer:view/${fileDocxId})`; - await personalFiles.navigate({ remoteUrl: previewURL }); - await personalFiles.dataTable.spinnerWaitForReload(); - expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); - expect(await personalFiles.viewer.fileTitleButtonLocator.innerText()).toEqual(randomDocxName); - }); - test('[C284636] Viewer opens for a file from Recent Files', async ({ personalFiles, recentFilesPage }) => { await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName); expect(await personalFiles.viewer.getCloseButtonTooltip()).toEqual('Close'); @@ -103,9 +91,53 @@ test.describe('viewer file', () => { expect(await recentFilesPage.viewer.isFileTitleDisplayed(), 'File title is not displayed').toBe(true); }); + test('[C279175] Viewer opens for a file from Search Results', async ({ personalFiles, searchPage }) => { + await personalFiles.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchOverlay.checkFilesAndFolders(); + await searchPage.searchOverlay.searchFor(randomDocxName); + await searchPage.reload({ waitUntil: 'domcontentloaded' }); + await searchPage.dataTable.goThroughPagesLookingForRowWithName(randomDocxName); + await searchPage.searchInput.performDoubleClickFolderOrFileToOpen(randomDocxName); + expect(await searchPage.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); + expect(await searchPage.viewer.isCloseButtonDisplayed(), 'Close button is not displayed').toBe(true); + expect(await searchPage.viewer.isFileTitleDisplayed(), 'File title is not displayed').toBe(true); + }); +}); + +test.describe('viewer file', () => { + const apiClientFactory = new ApiClientFactory(); + const randomFolderName = `playwright-folder-${Utils.random()}`; + const randomDocxName = `$(TEST_FILES.DOCX.name)-${Utils.random()}`; + let folderId: string; + let fileDocxId: string; + + test.beforeAll(async ({ fileAction, shareAction, favoritesPageAction: favoritesPageAction }) => { + await apiClientFactory.setUpAcaBackend('admin'); + const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); + folderId = await node.entry.id; + const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); + fileDocxId = await fileDoc.entry.id; + await shareAction.shareFileById(fileDocxId); + await favoritesPageAction.addFavoriteById('file', fileDocxId); + }); + + test.afterAll(async () => { + await apiClientFactory.nodes.deleteNode(folderId); + }); + + test('[C279285] Viewer opens when accessing the preview URL for a file', async ({ personalFiles }) => { + const previewURL = `#/personal-files/${folderId}/(viewer:view/${fileDocxId})`; + await personalFiles.navigate({ remoteUrl: previewURL }); + await personalFiles.dataTable.spinnerWaitForReload(); + expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); + expect(await personalFiles.viewer.fileTitleButtonLocator.innerText()).toEqual(randomDocxName); + }); + test('[C284635] Viewer opens for a file from Shared Files', async ({ sharedPage }) => { await sharedPage.navigate(); await sharedPage.reload(); + await sharedPage.dataTable.goThroughPagesLookingForRowWithName(randomDocxName); await sharedPage.dataTable.performClickFolderOrFileToOpen(randomDocxName); expect(await sharedPage.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); expect(await sharedPage.viewer.isCloseButtonDisplayed(), 'Close button is not displayed').toBe(true); @@ -114,22 +146,10 @@ test.describe('viewer file', () => { test('[C284634] Viewer opens for a file from Favorites', async ({ favoritePage }) => { await favoritePage.navigate({ waitUntil: 'domcontentloaded' }); + await favoritePage.dataTable.goThroughPagesLookingForRowWithName(randomDocxName); await favoritePage.dataTable.performClickFolderOrFileToOpen(randomDocxName); expect(await favoritePage.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); expect(await favoritePage.viewer.isCloseButtonDisplayed(), 'Close button is not displayed').toBe(true); expect(await favoritePage.viewer.isFileTitleDisplayed(), 'File title is not displayed').toBe(true); }); - - test('[C279175] Viewer opens for a file from Search Results', async ({ personalFiles, searchPage }) => { - await personalFiles.acaHeader.searchButton.click(); - await searchPage.searchInput.searchButton.click(); - await searchPage.searchOverlay.checkFilesAndFolders(); - await searchPage.searchOverlay.searchFor(randomDocxName); - await searchPage.reload({ waitUntil: 'domcontentloaded' }); - - await searchPage.searchInput.performDoubleClickFolderOrFileToOpen(randomDocxName); - expect(await searchPage.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); - expect(await searchPage.viewer.isCloseButtonDisplayed(), 'Close button is not displayed').toBe(true); - expect(await searchPage.viewer.isFileTitleDisplayed(), 'File title is not displayed').toBe(true); - }); }); diff --git a/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts b/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts index 33b079a3cc..c1be07e465 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts @@ -160,11 +160,10 @@ export class DataTableComponent extends BaseComponent { * * @param name of the data table element with which we want to double click */ - async performClickFolderOrFileToOpen(name: string): Promise { - await this.goThroughPagesLookingForRowWithName(name); - await this.getCellLinkByName(name).click(); - await this.spinnerWaitForReload(); - } + async performClickFolderOrFileToOpen(name: string): Promise { + await this.getCellLinkByName(name).click(); + await this.spinnerWaitForReload(); + } async getActionLocatorFromExpandableMenu(name: string | number, action: string): Promise { await this.getRowByName(name).click({ button: 'right' }); @@ -200,8 +199,8 @@ export class DataTableComponent extends BaseComponent { async selectItem(name: string): Promise { const isSelected = await this.hasCheckMarkIcon(name); if (!isSelected) { - const row = await this.getRowByName(name); - await row.locator('.mat-checkbox[id*="mat-checkbox"]').check(); + const row = await this.getRowByName(name); + await row.locator('.mat-checkbox[id*="mat-checkbox"]').check(); } }