diff --git a/e2e/playwright/viewer/src/tests/viewer.spec.ts b/e2e/playwright/viewer/src/tests/viewer.spec.ts index 4e5f06202d..a78aaa3c9a 100644 --- a/e2e/playwright/viewer/src/tests/viewer.spec.ts +++ b/e2e/playwright/viewer/src/tests/viewer.spec.ts @@ -23,34 +23,86 @@ */ import { expect } from '@playwright/test'; -import { ApiClientFactory, getUserState, test, TEST_FILES, Utils } from '@alfresco/playwright-shared'; +import { + ApiClientFactory, + FavoritesPageApi, + FileActionsApi, + LoginPage, + NodesApi, + SharedLinksApi, + SitesApi, + test, + TEST_FILES, + timeouts, + Utils +} from '@alfresco/playwright-shared'; +import { Site } from '@alfresco/js-api'; -test.use({ storageState: getUserState('hruser') }); test.describe('viewer file', () => { - const apiClientFactory = new ApiClientFactory(); - const randomFolderName = `playwright-folder-${Utils.random()}`; + const username = `user-${Utils.random()}`; const randomDocxName = `${TEST_FILES.DOCX.name}-${Utils.random()}`; + const siteUser = `siteUser-${Utils.random()}`; + const fileInSite = TEST_FILES.DOCX.name; + const siteAdmin = `siteAdmin-${Utils.random()}`; + const fileAdmin = TEST_FILES.XLSX.name; + let fileAdminId: string; + let docLibId: string; + let docLibSiteUserId: string; let folderId: string; let fileDocxId: string; + let nodesApi: NodesApi; - test.beforeAll(async ({ fileAction, shareAction, favoritesPageAction }) => { - await apiClientFactory.setUpAcaBackend('hruser'); - const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); + test.beforeAll(async () => { + test.setTimeout(timeouts.extendedTest); + const randomFolderName = `playwright-folder-${Utils.random()}`; + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + nodesApi = await NodesApi.initialize(username, username); + const fileActionApi = await FileActionsApi.initialize(username, username); + const shareActions = await SharedLinksApi.initialize(username, username); + const favoritesActions = await FavoritesPageApi.initialize(username, username); + const siteActionsUser = await SitesApi.initialize(username, username); + const siteActionsAdmin = await SitesApi.initialize('admin'); + const fileActionApiAdmin = await FileActionsApi.initialize('admin'); + const node = await nodesApi.createFolder(randomFolderName); folderId = node.entry.id; - const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); + const fileDoc = await fileActionApi.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); fileDocxId = fileDoc.entry.id; - await shareAction.shareFileById(fileDocxId); - await favoritesPageAction.addFavoriteById('file', fileDocxId); - await favoritesPageAction.isFavoriteWithRetry('hruser', fileDocxId, { expect: true }); - await fileAction.waitForNodes(randomDocxName, { expect: 1 }); + const consumerFavoritesTotalItems = await favoritesActions.getFavoritesTotalItems(username); + await shareActions.shareFileById(fileDocxId); + await favoritesActions.addFavoriteById('file', fileDocxId); + + await siteActionsAdmin.createSite(siteAdmin, Site.VisibilityEnum.PRIVATE); + docLibId = await siteActionsAdmin.getDocLibId(siteAdmin); + fileAdminId = (await fileActionApiAdmin.uploadFile(TEST_FILES.DOCX.path, fileAdmin, docLibId)).entry.id; + + await siteActionsUser.createSite(siteUser, Site.VisibilityEnum.PUBLIC); + docLibSiteUserId = await siteActionsUser.getDocLibId(siteUser); + await fileActionApi.uploadFile(TEST_FILES.DOCX.path, fileInSite, docLibSiteUserId); + + await Promise.all([ + favoritesActions.isFavoriteWithRetry(username, fileDocxId, { expect: true }), + favoritesActions.waitForApi(username, { expect: consumerFavoritesTotalItems + 2 }) + ]); + await shareActions.waitForFilesToBeShared([fileDocxId]); + await fileActionApi.waitForNodes(randomDocxName, { expect: 1 }); }); - test.beforeEach(async ({ personalFiles }) => { + test.beforeEach(async ({ personalFiles, page }) => { + const loginPage = new LoginPage(page); + await loginPage.loginUser( + { username, password: username }, + { + withNavigation: true, + waitForLoading: true + } + ); await personalFiles.navigate({ remoteUrl: `#/personal-files/${folderId}` }); }); test.afterAll(async () => { - await apiClientFactory.nodes.deleteNode(folderId, { permanent: true }); + await nodesApi.deleteCurrentUserNodes(); }); test('[C279269] Viewer opens on double clicking on a file from Personal Files', async ({ personalFiles }) => { @@ -131,4 +183,19 @@ test.describe('viewer file', () => { 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('[C279287] Viewer does not open when accessing the preview URL for a file without permissions', async ({ personalFiles }) => { + const previewURL = `#/libraries/${docLibId}/(viewer:view/${fileAdminId})`; + await personalFiles.navigate({ remoteUrl: `${previewURL}` }); + expect(await personalFiles.viewer.viewerLocator.isVisible(), 'Viewer should not be opened!').toBe(false); + }); + + test('[C284633] Viewer opens for a file from File Libraries', async ({ myLibrariesPage }) => { + await myLibrariesPage.navigate(); + await myLibrariesPage.dataTable.performClickFolderOrFileToOpen(siteUser); + await myLibrariesPage.dataTable.performClickFolderOrFileToOpen(fileInSite); + expect(await myLibrariesPage.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true); + expect(await myLibrariesPage.viewer.isCloseButtonDisplayed(), 'Close button is not displayed').toBe(true); + expect(await myLibrariesPage.viewer.isFileTitleDisplayed(), 'File title is not displayed').toBe(true); + }); }); diff --git a/e2e/protractor/suites/viewer/viewer-general.test.ts b/e2e/protractor/suites/viewer/viewer-general.test.ts deleted file mode 100755 index 37f12450d1..0000000000 --- a/e2e/protractor/suites/viewer/viewer-general.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -/*! - * 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 { AdminActions, UserActions, LoginPage, BrowsingPage, FILES, SITE_VISIBILITY, RepoClient, Utils, Viewer } from '@alfresco/aca-testing-shared'; - -describe('Viewer general', () => { - const username = `user-${Utils.random()}`; - - const parent = `parent-${Utils.random()}`; - let parentId: string; - - const xlsxFile = FILES.xlsxFile; - let xlsxFileId: string; - const fileAdmin = FILES.docxFile; - let fileAdminId: string; - - const siteAdmin = `siteAdmin-${Utils.random()}`; - let docLibId: string; - const siteUser = `siteUser-${Utils.random()}`; - let docLibSiteUserId: string; - - const fileInSite = FILES.docxFile; - - const apis = { - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const page = new BrowsingPage(); - const { dataTable } = page; - const viewer = new Viewer(); - - const adminApiActions = new AdminActions(); - const userActions = new UserActions(); - - beforeAll(async () => { - await adminApiActions.createUser({ username }); - - parentId = await apis.user.createFolder(parent); - xlsxFileId = (await apis.user.upload.uploadFile(xlsxFile, parentId)).entry.id; - - await adminApiActions.sites.createSite(siteAdmin, SITE_VISIBILITY.PRIVATE); - docLibId = await adminApiActions.sites.getDocLibId(siteAdmin); - fileAdminId = (await adminApiActions.upload.uploadFile(fileAdmin, docLibId)).entry.id; - - await apis.user.sites.createSite(siteUser, SITE_VISIBILITY.PUBLIC); - docLibSiteUserId = await apis.user.sites.getDocLibId(siteUser); - await apis.user.upload.uploadFile(fileInSite, docLibSiteUserId); - - await userActions.login(username, username); - await userActions.shareNodes([xlsxFileId]); - await apis.user.favorites.addFavoriteById('file', xlsxFileId); - - await apis.user.favorites.waitForApi({ expect: 2 }); - await apis.user.shared.waitForFilesToBeShared([xlsxFileId]); - - await loginPage.loginWith(username); - }); - - beforeEach(async () => { - await page.header.expandSideNav(); - await page.clickPersonalFilesAndWait(); - await dataTable.doubleClickOnRowByName(parent); - await dataTable.waitForHeader(); - }); - - afterEach(async () => { - await Utils.pressEscape(); - await page.header.expandSideNav(); - }); - - afterAll(async () => { - await apis.user.nodes.deleteNodeById(parentId); - await adminApiActions.sites.deleteSite(siteAdmin); - await apis.user.sites.deleteSite(siteUser); - }); - - it('[C279287] Viewer does not open when accessing the preview URL for a file without permissions', async () => { - const previewURL = `libraries/${docLibId}/(viewer:view/${fileAdminId})`; - await page.load(previewURL); - expect(await viewer.isViewerOpened()).toBe(false, 'Viewer should not be opened!'); - }); - - it('[C284633] Viewer opens for a file from File Libraries', async () => { - await page.goToMyLibrariesAndWait(); - await dataTable.doubleClickOnRowByName(siteUser); - await dataTable.waitForHeader(); - await dataTable.doubleClickOnRowByName(fileInSite); - 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'); - }); -}); 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 8c06ae37a4..a3c5be3dbd 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 @@ -30,7 +30,7 @@ import { timeouts } from '../../utils'; export class ViewerComponent extends BaseComponent { private static rootElement = 'adf-viewer'; - private viewerLocator = this.getChild('.adf-viewer-render-layout-content'); + public 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');