diff --git a/e2e/playwright/viewer/exclude.tests.json b/e2e/playwright/viewer/exclude.tests.json index 9c00daf8b7..0967ef424b 100644 --- a/e2e/playwright/viewer/exclude.tests.json +++ b/e2e/playwright/viewer/exclude.tests.json @@ -1,9 +1 @@ -{ - "C284636" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639", - "C284635" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639", - "C279175" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639", - "C284634" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639", - "C297585" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639", - "C286379" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639", - "C286395" : "this have Protractor test Enabled https://alfresco.atlassian.net/browse/ACS-5639" -} +{} diff --git a/e2e/playwright/viewer/src/tests/viewer-action.spec.ts b/e2e/playwright/viewer/src/tests/viewer-action.spec.ts index 2b7dad58b4..5a778a24ab 100644 --- a/e2e/playwright/viewer/src/tests/viewer-action.spec.ts +++ b/e2e/playwright/viewer/src/tests/viewer-action.spec.ts @@ -37,19 +37,26 @@ test.describe('viewer action file', () => { const fileForCancelEditing = `playwright-file2-${Utils.random()}.docx`; let folderId: string; let fileDocxShareId: string; + let randomDocxNameFavoriteId: string; + let fileForCancelEditingId: string; - test.beforeAll(async ({ fileAction, shareAction }) => { + test.beforeAll(async ({ fileAction, favoritesPageAction, shareAction }) => { await apiClientFactory.setUpAcaBackend('hruser'); const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); folderId = node.entry.id; - await fileAction.uploadFile(TEST_FILES.DOCX.path, fileForCancelEditing, folderId); + + fileDocxShareId = (await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxNameShare, folderId)).entry.id; + await shareAction.shareFileById(fileDocxShareId); + fileForCancelEditingId = (await fileAction.uploadFile(TEST_FILES.DOCX.path, fileForCancelEditing, folderId)).entry.id; + await fileAction.lockNodes([fileForCancelEditingId]); await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxDelete, folderId); - const fileDocShare = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxNameShare, folderId); - fileDocxShareId = fileDocShare.entry.id; - await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxNameFavorite, folderId); - await shareAction.shareFileById(fileDocxShareId); + const fileFavoritesNode = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxNameFavorite, folderId); + randomDocxNameFavoriteId = fileFavoritesNode.entry.id; await fileAction.uploadFile(TEST_FILES.DOCX.path, fileForEditOffline, folderId); + await favoritesPageAction.addFavoriteById('file', randomDocxNameFavoriteId); + await favoritesPageAction.isFavoriteWithRetry('hruser', randomDocxNameFavoriteId, { expect: true }); + await fileAction.isFileLockedWriteWithRetry(fileForCancelEditingId, true); }); test.beforeEach(async ({ personalFiles }) => { @@ -140,6 +147,7 @@ test.describe('viewer action file', () => { await favoritePage.viewerDialog.favoriteMenuButton.waitFor({ state: 'detached', timeout: timeouts.normal }); await sharedPage.acaHeader.clickViewerMoreActions(); + await favoritePage.viewerDialog.removeFavoriteMenuButton.waitFor({ state: 'attached', timeout: timeouts.normal }); expect(await sharedPage.viewerDialog.removeFavoriteMenuButton.isVisible(), 'Item should be remove favorite').toBe(true); await sharedPage.page.keyboard.press('Escape'); await favoritePage.navigate({ waitUntil: 'domcontentloaded' }); @@ -150,8 +158,9 @@ test.describe('viewer action file', () => { await favoritePage.navigate({ waitUntil: 'domcontentloaded' }); await favoritePage.dataTable.performClickFolderOrFileToOpen(randomDocxNameFavorite); expect(await favoritePage.viewer.isViewerOpened(), 'Viewer should be opened').toBe(true); - - await favoritePage.acaHeader.shareButton.click(); + await favoritePage.viewer.shareButton.waitFor({ state: 'attached', timeout: timeouts.normal }); + await favoritePage.viewer.shareButton.click(); + await favoritePage.viewerDialog.shareDialogTitle.waitFor({ state: 'attached', timeout: timeouts.normal }); expect(await favoritePage.viewerDialog.shareDialogTitle.isVisible(), 'Share dialog should be open').toBe(true); await favoritePage.viewerDialog.shareDialogClose.click(); await favoritePage.viewerDialog.shareDialogClose.waitFor({ state: 'detached', timeout: timeouts.large }); diff --git a/e2e/playwright/viewer/src/tests/viewer.spec.ts b/e2e/playwright/viewer/src/tests/viewer.spec.ts index 7a2d96889f..4e5f06202d 100644 --- a/e2e/playwright/viewer/src/tests/viewer.spec.ts +++ b/e2e/playwright/viewer/src/tests/viewer.spec.ts @@ -31,12 +31,18 @@ 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 }) => { + test.beforeAll(async ({ fileAction, shareAction, favoritesPageAction }) => { await apiClientFactory.setUpAcaBackend('hruser'); const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); folderId = node.entry.id; - await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); + const fileDoc = await fileAction.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 }); }); test.beforeEach(async ({ personalFiles }) => { @@ -98,28 +104,6 @@ test.describe('viewer file', () => { 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('hruser'); - const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' }); - folderId = node.entry.id; - const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId); - fileDocxId = fileDoc.entry.id; - await shareAction.shareFileById(fileDocxId); - await favoritesPageAction.addFavoriteById('file', fileDocxId); - }); - - test.afterAll(async () => { - await apiClientFactory.nodes.deleteNode(folderId, { permanent: true }); - }); test('[C279285] Viewer opens when accessing the preview URL for a file', async ({ personalFiles }) => { const previewURL = `#/personal-files/${folderId}/(viewer:view/${fileDocxId})`; diff --git a/e2e/protractor/protractor.excludes.json b/e2e/protractor/protractor.excludes.json index 99183958b9..effe33632b 100644 --- a/e2e/protractor/protractor.excludes.json +++ b/e2e/protractor/protractor.excludes.json @@ -17,16 +17,5 @@ "C279220": "will be fixed after protractor to playwright migration, see https://alfresco.atlassian.net/browse/ACS-5007", "C279221": "will be fixed after protractor to playwright migration, see https://alfresco.atlassian.net/browse/ACS-5007", "C325006": "will be fixed after protractor to playwright migration, see https://alfresco.atlassiana.net/browse/ACS-5007", - "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", - - "C286314" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5650", - "C279282" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5650", - "C297584" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5650", - "C268133" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5650", - "C268129" : "test migrated to playwright https://alfresco.atlassian.net/browse/ACS-5650" + "C213097": "https://alfresco.atlassian.net/browse/ACS-5479" } diff --git a/e2e/protractor/suites/viewer/viewer-actions.test.ts b/e2e/protractor/suites/viewer/viewer-actions.test.ts index 6fdfbafd5a..31802f0546 100755 --- a/e2e/protractor/suites/viewer/viewer-actions.test.ts +++ b/e2e/protractor/suites/viewer/viewer-actions.test.ts @@ -64,7 +64,6 @@ describe('Viewer actions', () => { const userActions = new UserActions(); const uploadFilesDialog = new UploadFilesDialog(); - const downloadButton = element(By.css(`button[id='app.viewer.download']`)); const shareButton = element(By.css(`adf-viewer [data-automation-id="share-action-button"]`)); beforeAll(async () => { @@ -85,8 +84,6 @@ describe('Viewer actions', () => { const filePersonalFiles = docxFile2; let filePersonalFilesId: string; - const fileForEditOffline = `file1-${Utils.random()}.docx`; - let fileForEditOfflineId: string; const fileForCancelEditing = `file2-${Utils.random()}.docx`; let fileForCancelEditingId: string; const fileForUploadNewVersion = `file3-${Utils.random()}.docx`; @@ -105,7 +102,6 @@ describe('Viewer actions', () => { await apis.user.upload.uploadFileWithRename(xlsxFileForMove, parentId, xlsxPersonalFiles); await apis.user.upload.uploadFileWithRename(pdfFileForDelete, parentId, pdfPersonalFiles); - fileForEditOfflineId = (await apis.user.upload.uploadFileWithRename(docxFile, parentId, fileForEditOffline)).entry.id; fileForCancelEditingId = (await apis.user.upload.uploadFileWithRename(docxFile, parentId, fileForCancelEditing)).entry.id; fileForUploadNewVersionId = (await apis.user.upload.uploadFileWithRename(docxFile, parentId, fileForUploadNewVersion)).entry.id; fileForUploadNewVersionId2 = (await apis.user.upload.uploadFileWithRename(docxFile, parentId, fileForUploadNewVersion2)).entry.id; @@ -142,37 +138,6 @@ describe('Viewer actions', () => { } }); - it('[C268129] Download action', async () => { - await dataTable.doubleClickOnRowByName(docxPersonalFiles); - await viewer.waitForViewerToOpen(); - - await downloadButton.click(); - - expect(await Utils.fileExistsOnOS(docxPersonalFiles)).toBe(true, 'File not found in download location'); - }); - - it('[C268133] Delete action', async () => { - await dataTable.doubleClickOnRowByName(pdfPersonalFiles); - await viewer.waitForViewerToOpen(); - - await toolbar.clickMoreActionsDelete(); - expect(await page.getSnackBarMessage()).toContain(`${pdfPersonalFiles} deleted`); - expect(await viewer.isViewerOpened()).toBe(false, 'Viewer is opened'); - await Utils.pressEscape(); - await page.clickTrashAndWait(); - expect(await dataTable.isItemPresent(pdfPersonalFiles)).toBe(true, 'Item is not present in Trash'); - }); - - it('[C297584] Edit Offline action', async () => { - await dataTable.doubleClickOnRowByName(fileForEditOffline); - await viewer.waitForViewerToOpen(); - await toolbar.clickMoreActionsEditOffline(); - - expect(await Utils.fileExistsOnOS(fileForEditOffline)).toBe(true, 'File not found in download location'); - expect(await apis.user.nodes.isFileLockedWrite(fileForEditOfflineId)).toBe(true, `${fileForEditOffline} is not locked`); - expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not open'); - }); - it('[C297585] Cancel Editing action', async () => { await dataTable.doubleClickOnRowByName(fileForCancelEditing); await viewer.waitForViewerToOpen(); @@ -216,106 +181,6 @@ describe('Viewer actions', () => { expect(await toolbar.menu.cancelEditingAction.isPresent()).toBe(false, `'Cancel Editing' button shouldn't be shown`); expect(await toolbar.menu.editOfflineAction.isPresent()).toBe(true, `'Edit Offline' should be shown`); }); - - it('[C279282] Full screen action', async () => { - await dataTable.doubleClickOnRowByName(docxPersonalFiles); - await viewer.waitForViewerToOpen(); - - await toolbar.fullScreenButton.click(); - expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is closed after pressing Full screen'); - }); - - it('[C286314] Pressing ESC in the viewer closes only the action dialog', async () => { - await dataTable.doubleClickOnRowByName(docxPersonalFiles); - await viewer.waitForViewerToOpen(); - - await toolbar.clickMoreActionsCopy(); - expect(await copyMoveDialog.isDialogOpen()).toBe(true, 'Dialog is not open'); - await Utils.pressEscape(); - expect(await shareDialog.isDialogOpen()).toBe(false, 'Dialog is still open'); - expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened'); - }); - }); - - describe('from File Libraries', () => { - const siteName = `site-${Utils.random()}`; - const destination = `destFL-${Utils.random()}`; - let destinationId: string; - - const xlsxLibraries = `xlsxFL-${Utils.random()}.xlsx`; - const pdfLibraries = `pdfFL-${Utils.random()}.pdf`; - - const fileForEditOffline = `file1-${Utils.random()}.docx`; - const fileForCancelEditing = `file2-${Utils.random()}.docx`; - let fileForCancelEditingId: string; - const fileForUploadNewVersion = `file3-${Utils.random()}.docx`; - let fileForUploadNewVersionId: string; - - beforeAll(async () => { - try { - await apis.user.sites.createSite(siteName); - const docLibId = await apis.user.sites.getDocLibId(siteName); - destinationId = await apis.user.createFolder(destination); - - await apis.user.upload.uploadFile(docxFile2, docLibId); - - await apis.user.upload.uploadFileWithRename(xlsxFileForMove, docLibId, xlsxLibraries); - await apis.user.upload.uploadFileWithRename(pdfFileForDelete, docLibId, pdfLibraries); - - await apis.user.upload.uploadFileWithRename(docxFile, docLibId, fileForEditOffline); - fileForCancelEditingId = (await apis.user.upload.uploadFileWithRename(docxFile, docLibId, fileForCancelEditing)).entry.id; - fileForUploadNewVersionId = (await apis.user.upload.uploadFileWithRename(docxFile, docLibId, fileForUploadNewVersion)).entry.id; - - await userActions.lockNodes([fileForCancelEditingId, fileForUploadNewVersionId]); - - await loginPage.loginWith(username); - } catch (error) { - Logger.error(`----- beforeAll failed : ${error}`); - } - }); - - beforeEach(async () => { - try { - await page.goToMyLibrariesAndWait(); - await dataTable.doubleClickOnRowByName(siteName); - await dataTable.waitForHeader(); - } catch (error) { - Logger.error(`----- beforeEach failed : ${error}`); - } - }); - - afterEach(async () => { - await Utils.pressEscape(); - await uploadFilesDialog.closeUploadDialog(); - }); - - afterAll(async () => { - try { - await userActions.login(username, username); - await userActions.deleteSites([siteName]); - await userActions.deleteNodes([destinationId]); - await userActions.emptyTrashcan(); - } catch (error) { - Logger.error(`----- afterAll failed : ${error}`); - } - }); - - it('[C286371] Move action', async () => { - await dataTable.doubleClickOnRowByName(xlsxLibraries); - expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened'); - - await toolbar.clickMoreActionsMove(); - expect(await copyMoveDialog.isDialogOpen()).toBe(true, 'Dialog is not open'); - await copyMoveDialog.selectLocation('Personal Files'); - await copyMoveDialog.selectDestination(destination); - await copyMoveDialog.moveButton.click(); - expect(await page.getSnackBarMessage()).toContain('Moved 1 item'); - await viewer.closeButton.click(); - expect(await dataTable.isItemPresent(xlsxLibraries)).toBe(false, 'Item was not moved'); - await page.clickPersonalFilesAndWait(); - await dataTable.doubleClickOnRowByName(destination); - expect(await dataTable.isItemPresent(xlsxLibraries)).toBe(true, 'Item is not present in destination'); - }); }); describe('from Recent Files', () => { diff --git a/e2e/protractor/suites/viewer/viewer-general.test.ts b/e2e/protractor/suites/viewer/viewer-general.test.ts index 0685d5fcdc..65fd6909fe 100755 --- a/e2e/protractor/suites/viewer/viewer-general.test.ts +++ b/e2e/protractor/suites/viewer/viewer-general.test.ts @@ -48,9 +48,8 @@ describe('Viewer general', () => { const loginPage = new LoginPage(); const page = new BrowsingPage(); - const { dataTable, toolbar } = page; + const { dataTable } = page; const viewer = new Viewer(); - const { searchInput } = page.pageLayoutHeader; const adminApiActions = new AdminActions(); const userActions = new UserActions(); @@ -114,24 +113,6 @@ describe('Viewer general', () => { 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); @@ -140,18 +121,4 @@ 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('[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'); - }); }); diff --git a/e2e/protractor/suites/viewer/viewer-protected-file.test.ts b/e2e/protractor/suites/viewer/viewer-protected-file.test.ts deleted file mode 100755 index 095e63f738..0000000000 --- a/e2e/protractor/suites/viewer/viewer-protected-file.test.ts +++ /dev/null @@ -1,109 +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, LoginPage, BrowsingPage, FILES, RepoClient, Utils, Viewer, PasswordDialog } from '@alfresco/aca-testing-shared'; -import { BrowserActions } from '@alfresco/adf-testing'; - -describe('Viewer - password protected file', () => { - const username = `user-${Utils.random()}`; - - const parent = `parent-${Utils.random()}`; - let parentId: string; - - const protectedFile = FILES.protectedFile; - - const apis = { - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const page = new BrowsingPage(); - const { dataTable } = page; - const viewer = new Viewer(); - const passwordDialog = new PasswordDialog(); - const adminApiActions = new AdminActions(); - - beforeAll(async () => { - await adminApiActions.createUser({ username }); - parentId = (await apis.user.nodes.createFolder(parent)).entry.id; - await apis.user.upload.uploadFile(protectedFile.name, parentId); - - await loginPage.loginWith(username); - }); - - beforeEach(async () => { - await page.header.expandSideNav(); - await page.clickPersonalFilesAndWait(); - await dataTable.doubleClickOnRowByName(parent); - await dataTable.waitForHeader(); - await dataTable.doubleClickOnRowByName(protectedFile.name); - await viewer.waitForViewerToOpen(); - await passwordDialog.waitForDialogToOpen(); - }); - - afterEach(async () => { - await page.closeOpenDialogs(); - await Utils.pressEscape(); - }); - - afterAll(async () => { - await apis.user.nodes.deleteNodeById(parentId); - }); - - it('[C268958] Password dialog appears when opening a protected file', async () => { - expect(await passwordDialog.isDialogOpen()).toBe(true, 'Password dialog not open'); - expect(await passwordDialog.isPasswordInputDisplayed()).toBe(true, 'Password input not displayed'); - expect(await passwordDialog.isSubmitEnabled()).toBe(false, 'Submit button not disabled'); - expect(await passwordDialog.isCloseEnabled()).toBe(true, 'Close button not enabled'); - expect(await viewer.isPdfViewerContentDisplayed()).toBe(false, 'file content is displayed'); - }); - - it('[C268959] File content is displayed when entering the correct password', async () => { - await passwordDialog.enterPassword(protectedFile.password); - expect(await passwordDialog.isSubmitEnabled()).toBe(true, 'Submit button not enabled'); - - await BrowserActions.click(passwordDialog.submitButton); - await passwordDialog.waitForDialogToClose(); - - expect(await viewer.isPdfViewerContentDisplayed()).toBe(true, 'file content not displayed'); - }); - - it('[C268960] Error appears when entering an incorrect password', async () => { - await passwordDialog.enterPassword('incorrect'); - expect(await passwordDialog.isSubmitEnabled()).toBe(true, 'Submit button not enabled'); - await BrowserActions.click(passwordDialog.submitButton); - - expect(await passwordDialog.getErrorMessage()).toBe('Password is wrong'); - expect(await viewer.isPdfViewerContentDisplayed()).toBe(false, 'file content is displayed'); - }); - - it('[C268961] Refresh the page while Password dialog is open', async () => { - await passwordDialog.enterPassword(protectedFile.password); - await page.refresh(); - await viewer.waitForViewerToOpen(); - - expect(await viewer.isPdfViewerContentDisplayed()).toBe(false, 'file content is displayed'); - expect(await passwordDialog.isDialogOpen()).toBe(true, 'Password dialog not open'); - }); -}); diff --git a/projects/aca-playwright-shared/src/api/favorites-api.ts b/projects/aca-playwright-shared/src/api/favorites-api.ts index 21cae7b456..7233617447 100755 --- a/projects/aca-playwright-shared/src/api/favorites-api.ts +++ b/projects/aca-playwright-shared/src/api/favorites-api.ts @@ -24,6 +24,8 @@ import { ApiClientFactory } from './api-client-factory'; import { FavoriteEntry } from '@alfresco/js-api'; +import { Logger } from '@alfresco/adf-testing'; +import { Utils } from '../utils'; export class FavoritesPageApi { private apiService: ApiClientFactory; @@ -47,4 +49,38 @@ export class FavoritesPageApi { }; return await this.apiService.favorites.createFavorite('-me-', data); } + + private async getFavorites(username: string) { + try { + return await this.apiService.favorites.listFavorites(username); + } catch (error) { + Logger.error(`FavoritesApi getFavorites : catch : `, error); + return null; + } + } + + async isFavorite(username: string, nodeId: string) { + try { + return JSON.stringify((await this.getFavorites(username)).list.entries).includes(nodeId); + } catch (error) { + Logger.error(`FavoritesApi isFavorite : catch : `, error); + return null; + } + } + + async isFavoriteWithRetry(username: string, nodeId: string, data: { expect: boolean }) { + let isFavorite = false; + try { + const favorite = async () => { + isFavorite = await this.isFavorite(username, nodeId); + if (isFavorite !== data.expect) { + return Promise.reject(isFavorite); + } else { + return Promise.resolve(isFavorite); + } + }; + return await Utils.retryCall(favorite); + } catch (error) {} + return isFavorite; + } } diff --git a/projects/aca-playwright-shared/src/api/file-actions.ts b/projects/aca-playwright-shared/src/api/file-actions.ts index b4614522ac..865f74cb4e 100644 --- a/projects/aca-playwright-shared/src/api/file-actions.ts +++ b/projects/aca-playwright-shared/src/api/file-actions.ts @@ -24,32 +24,125 @@ import * as fs from 'fs'; import { ApiClientFactory } from './api-client-factory'; +import { Utils } from '../utils'; +import { ApiUtil, Logger } from '@alfresco/adf-testing'; +import { NodeEntry } from '@alfresco/js-api'; export class FileActionsApi { - private apiService: ApiClientFactory; + private apiService: ApiClientFactory; - constructor() { - this.apiService = new ApiClientFactory(); + constructor() { + this.apiService = new ApiClientFactory(); + } + + static async initialize(userName: string, password?: string): Promise { + const classObj = new FileActionsApi(); + await classObj.apiService.setUpAcaBackend(userName, password); + return classObj; + } + + async uploadFile(fileLocation: string, fileName: string, parentFolderId: string): Promise { + const file = fs.createReadStream(fileLocation); + return this.apiService.upload.uploadFile(file, '', parentFolderId, null, { + name: fileName, + nodeType: 'cm:content', + renditions: 'doclib' + }); + } + + async lockNodes(nodeIds: string[], lockType: string = 'ALLOW_OWNER_CHANGES') { + try { + for (const nodeId of nodeIds) { + await this.apiService.nodes.lockNode(nodeId, { type: lockType }); + } + } catch (error) { + Logger.error(`${this.constructor.name} ${this.lockNodes.name}`, error); + } + } + + async getNodeById(id: string): Promise { + try { + return await this.apiService.nodes.getNode(id); + } catch (error) { + Logger.error(`${this.constructor.name} ${this.getNodeById.name}`, error); + return null; + } + } + + async getNodeProperty(nodeId: string, property: string): Promise { + try { + const node = await this.getNodeById(nodeId); + return (node.entry.properties && node.entry.properties[property]) || ''; + } catch (error) { + Logger.error(`${this.constructor.name} ${this.getNodeProperty.name}`, error); + return ''; } + } - static async initialize(userName: string, password?: string): Promise { - const classObj = new FileActionsApi(); - await classObj.apiService.setUpAcaBackend(userName, password); - return classObj; + private async getLockType(nodeId: string): Promise { + try { + const lockType = await this.getNodeProperty(nodeId, 'cm:lockType'); + return lockType || ''; + } catch (error) { + Logger.error(`${this.constructor.name} ${this.getLockType.name}`, error); + return ''; } + } + + async isFileLockedWriteWithRetry(nodeId: string, expect: boolean): Promise { + const data = { + expect: expect, + retry: 5 + }; + let isLocked = false; + try { + const locked = async () => { + isLocked = (await this.getLockType(nodeId)) === 'WRITE_LOCK'; + if (isLocked !== data.expect) { + return Promise.reject(isLocked); + } else { + return Promise.resolve(isLocked); + } + }; + return await Utils.retryCall(locked, data.retry); + } catch (error) { + Logger.error(`${this.constructor.name} ${this.isFileLockedWriteWithRetry.name}`, error); + } + return isLocked; + } + + private async queryNodesNames(searchTerm: string) { + const data = { + query: { + query: `cm:name:\"${searchTerm}*\"`, + language: 'afts' + }, + filterQueries: [{ query: `+TYPE:'cm:folder' OR +TYPE:'cm:content'` }] + }; + + try { + return this.apiService.search.search(data); + } catch (error) { + Logger.error(`SearchApi queryNodesNames : catch : `, error); + return null; + } + } + async waitForNodes(searchTerm: string, data: { expect: number }) { + const predicate = (totalItems: number) => totalItems === data.expect; + + const apiCall = async () => { + try { + return (await this.queryNodesNames(searchTerm)).list.pagination.totalItems; + } catch (error) { + return 0; + } + }; - async uploadFile(fileLocation: string, fileName: string, parentFolderId: string): Promise { - const file = fs.createReadStream(fileLocation); - return this.apiService.upload.uploadFile( - file, - '', - parentFolderId, - null, - { - name: fileName, - nodeType: 'cm:content', - renditions: 'doclib' - } - ); + try { + await ApiUtil.waitForApi(apiCall, predicate, 30, 2500); + } catch (error) { + Logger.error(`SearchApi waitForNodes : catch : `); + Logger.error(`\tExpected: ${data.expect} items, but found ${error}`); } + } } diff --git a/projects/aca-playwright-shared/src/api/shared-links-api.ts b/projects/aca-playwright-shared/src/api/shared-links-api.ts index 188abd3d69..95310f7444 100755 --- a/projects/aca-playwright-shared/src/api/shared-links-api.ts +++ b/projects/aca-playwright-shared/src/api/shared-links-api.ts @@ -23,8 +23,7 @@ */ import { ApiClientFactory } from './api-client-factory'; -import { FavoritePaging, SharedLinkEntry } from '@alfresco/js-api'; -import { logger } from '@alfresco/adf-cli/scripts/logger'; +import { SharedLinkEntry } from '@alfresco/js-api'; export class SharedLinksApi { private apiService: ApiClientFactory; @@ -49,22 +48,4 @@ export class SharedLinksApi { return null; } } - - private async getFavorites(userName: string): Promise { - try { - return await this.apiService.favorites.listFavorites(userName); - } catch (error) { - logger.error(`\n--- Error while fetching favourites list ${error} :`); - return null; - } - } - - async isFavorite(nodeId: string, userName: string): Promise { - try { - return JSON.stringify((await this.getFavorites(userName)).list.entries).includes(nodeId); - } catch (error) { - logger.error(`\n--- Error while checking favourite node ${error} ${error} :`); - return null; - } - } } diff --git a/projects/aca-playwright-shared/src/page-objects/components/aca-header.component.ts b/projects/aca-playwright-shared/src/page-objects/components/aca-header.component.ts index 5b8ab0ddf3..bbb1d9355c 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/aca-header.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/aca-header.component.ts @@ -32,7 +32,7 @@ export class AcaHeader extends BaseComponent { public viewButton = this.getChild('button[title="View"]'); public searchButton = this.getChild('button[title="Search"]'); public fullScreenButton = this.getChild('button[id="app.viewer.fullscreen"]'); - public shareButton = this.getChild('button[id="app.viewer.fullscreen"]'); + public shareButton = this.getChild('button[id="share-action-button"]'); public downloadButton = this.getChild('button[id="app.viewer.download"]'); constructor(page: Page) { 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 16b7ad4093..601899620c 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 @@ -34,6 +34,7 @@ export class ViewerComponent extends BaseComponent { 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'); + public shareButton = this.getChild('button[id="share-action-button"]'); toolbar = new AcaHeader(this.page); diff --git a/projects/aca-playwright-shared/src/utils/utils.ts b/projects/aca-playwright-shared/src/utils/utils.ts index 575fb9f8d4..c23779b4c5 100644 --- a/projects/aca-playwright-shared/src/utils/utils.ts +++ b/projects/aca-playwright-shared/src/utils/utils.ts @@ -25,9 +25,17 @@ const crypto = require('crypto'); export class Utils { - static random(): string { return crypto.getRandomValues(new Uint32Array(1))[0].toString(36).substring(0, 5).toLowerCase(); } + static retryCall(fn: () => Promise, retry: number = 30, delay: number = 1500): Promise { + const pause = (duration: number) => new Promise((res) => setTimeout(res, duration)); + + const run = (retries: number): Promise => { + return fn().catch((err) => (retries > 1 ? pause(delay).then(() => run(retries - 1)) : Promise.reject(err))); + }; + + return run(retry); + } }