Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ACS-5650] viewer action files e2e migration #3367

Merged
merged 5 commits into from
Aug 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions e2e/playwright/folder-rules/src/tests/actions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,14 @@ test.describe('Folder Rules Actions', () => {
});

test.beforeEach(async ({ personalFiles }) => {
await personalFiles.navigate({ waitUntil: 'domcontentloaded' });
await personalFiles.navigate({ remoteUrl: `#/nodes/${folderId}/rules` });
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.nodes.deleteNode(folderId, { permanent: true });
});

test('[C691637] Create a rule with actions', async ({ personalFiles, nodesPage }) => {
await personalFiles.dataTable.performActionFromExpandableMenu(randomFolderName, 'Manage rules');

test('[C691637] Create a rule with actions', async ({ nodesPage }) => {
await nodesPage.toolbar.clickCreateRuleButton();
await nodesPage.manageRulesDialog.ruleNameInputLocator.type(randomRuleName);

Expand Down
2 changes: 1 addition & 1 deletion e2e/playwright/folder-rules/src/tests/conditions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ test.describe('Folder Rules Conditions', () => {
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.nodes.deleteNode(folderId, { permanent: true });
});

test('[C691638] Create a rule with condition', async ({ personalFiles, nodesPage }) => {
Expand Down
2 changes: 1 addition & 1 deletion e2e/playwright/folder-rules/src/tests/manage-rules.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ test.describe('Rules - Manage Rules', () => {
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.nodes.deleteNode(folderId, { permanent: true });
});

test('[C691651] Disable an existing rule', async ({ personalFiles, nodesPage }) => {
Expand Down
11 changes: 7 additions & 4 deletions e2e/playwright/viewer/exclude.tests.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{
"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"
"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"
}
163 changes: 163 additions & 0 deletions e2e/playwright/viewer/src/tests/viewer-action.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
/*!
* 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 <http://www.gnu.org/licenses/>.
*/

import { expect } from '@playwright/test';
import { ApiClientFactory, getUserState, test, TEST_FILES, timeouts, Utils } from '@alfresco/playwright-shared';

test.use({ storageState: getUserState('hruser') });
test.describe('viewer action file', () => {
const apiClientFactory = new ApiClientFactory();
const randomFolderName = `playwright-folder-${Utils.random()}`;
const randomDocxName = `${TEST_FILES.DOCX.name}-${Utils.random()}`;
const randomDocxNameFavorite = `${TEST_FILES.DOCX.name}-${Utils.random()}`;
const randomDocxNameShare = `${TEST_FILES.DOCX.name}-${Utils.random()}`;
const randomDocxDelete = `${TEST_FILES.DOCX.name}-${Utils.random()}`;
const fileForEditOffline = `playwright-file1-${Utils.random()}.docx`;
const fileForCancelEditing = `playwright-file2-${Utils.random()}.docx`;
let folderId: string;
let fileDocxShareId: string;

test.beforeAll(async ({ fileAction, 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);
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);
await fileAction.uploadFile(TEST_FILES.DOCX.path, fileForEditOffline, folderId);
});

test.beforeEach(async ({ personalFiles }) => {
await personalFiles.navigate({ remoteUrl: `#/personal-files/${folderId}` });
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.trashCan.deleteDeletedNode(folderId);
});

test('[C268129] Download action', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName);
await personalFiles.viewer.waitForViewerToOpen();
const downloadPromise = personalFiles.page.waitForEvent('download');
await personalFiles.acaHeader.downloadButton.click();
const download = await downloadPromise;
expect(download.suggestedFilename()).toBe(randomDocxName);
});

test('[C268133] Delete action', async ({ personalFiles, trashPage }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxDelete);
await personalFiles.viewer.waitForViewerToOpen();

await personalFiles.acaHeader.clickViewerMoreActions();
await personalFiles.viewerDialog.deleteMenuButton.click();
await personalFiles.snackBar.getByMessageLocator(randomDocxDelete).waitFor({ state: 'attached' });
const deleteName = await personalFiles.snackBar.getByMessageLocator(randomDocxDelete).innerText();
expect(deleteName).toContain(`${randomDocxDelete} deleted`);
await personalFiles.dataTable.getCellLinkByName(randomDocxName).waitFor({ state: 'attached' });
expect(await personalFiles.dataTable.getCellLinkByName(randomDocxDelete).isVisible(), 'file should not visible').toBe(false);
await trashPage.navigate({ waitUntil: 'domcontentloaded' });
await trashPage.dataTable.goThroughPagesLookingForRowWithName(randomDocxDelete);
expect(await trashPage.dataTable.isItemPresent(randomDocxDelete), 'Item should be present in Trash').toBe(true);
akashrathod28 marked this conversation as resolved.
Show resolved Hide resolved
});

test('[C297584] Edit Offline action', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(fileForEditOffline);
await personalFiles.viewer.waitForViewerToOpen();
await personalFiles.acaHeader.clickViewerMoreActions();
await personalFiles.matMenu.clickMenuItem('Edit Offline');

const downloadPromise = personalFiles.page.waitForEvent('download');
await personalFiles.acaHeader.downloadButton.click();
const download = await downloadPromise;
expect(download.suggestedFilename(), 'File should found in download location').toBe(fileForEditOffline);
expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is closed after pressing Full screen').toBe(true);
await personalFiles.reload({ waitUntil: 'domcontentloaded' });
await personalFiles.acaHeader.clickViewerMoreActions();
expect(await personalFiles.matMenu.isMenuItemVisible('Cancel Editing'), 'Cancel Editing menu should be visible').toBe(true);
});

test('[C297585] Cancel Editing action', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(fileForCancelEditing);
await personalFiles.viewer.waitForViewerToOpen();
await personalFiles.acaHeader.clickViewerMoreActions();
await personalFiles.matMenu.clickMenuItem('Cancel Editing');
await personalFiles.reload({ waitUntil: 'domcontentloaded' });
await personalFiles.acaHeader.clickViewerMoreActions();
expect(await personalFiles.matMenu.isMenuItemVisible('Edit Offline'), 'Edit offline menu should be visible').toBe(true);
});

test('[C279282] Full screen action', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName);
await personalFiles.viewer.waitForViewerToOpen();
await personalFiles.acaHeader.fullScreenButton.click();
expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is closed after pressing Full screen').toBe(true);
});

test('[C286314] Pressing ESC in the viewer closes only the action dialog', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName);
await personalFiles.viewer.waitForViewerToOpen();
await personalFiles.acaHeader.clickViewerMoreActions();
await personalFiles.viewerDialog.clickActionsCopy();
expect(await personalFiles.viewerDialog.isCopyDialogOpen(), 'Dialog is not open').toBe(true);
await personalFiles.page.keyboard.press('Escape');
expect(await personalFiles.viewerDialog.isCopyDialogClose(), 'Dialog is not open').toBe(false);
expect(await personalFiles.viewer.isViewerOpened(), 'Viewer should be opened').toBe(true);
});

test('[C286379] Favorite action from Shared Files', async ({ sharedPage, favoritePage, shareAction }) => {
await sharedPage.navigate({ waitUntil: 'domcontentloaded' });
await sharedPage.dataTable.performClickFolderOrFileToOpen(randomDocxNameShare);
expect(await sharedPage.viewer.isViewerOpened(), 'Viewer should be opened').toBe(true);

await sharedPage.acaHeader.clickViewerMoreActions();

await favoritePage.viewerDialog.favoriteMenuButton.waitFor({ state: 'attached', timeout: timeouts.normal });
await sharedPage.viewerDialog.favoriteMenuButton.click();
await favoritePage.viewerDialog.favoriteMenuButton.waitFor({ state: 'detached', timeout: timeouts.normal });

await sharedPage.acaHeader.clickViewerMoreActions();
expect(await sharedPage.viewerDialog.removeFavoriteMenuButton.isVisible(), 'Item should be remove favorite').toBe(true);
await sharedPage.page.keyboard.press('Escape');
await favoritePage.navigate({ waitUntil: 'domcontentloaded' });
expect(await favoritePage.dataTable.isItemPresent(randomDocxNameShare), 'Item is not present in Favorites list').toBe(true);
expect(await shareAction.isFavorite(randomDocxNameShare, 'hruser'), 'Item is not favorite').toBe(true);
akashrathod28 marked this conversation as resolved.
Show resolved Hide resolved
});

test('[C286395] Share action from Favorites', async ({ favoritePage }) => {
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();
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 });
expect(await favoritePage.viewerDialog.shareDialogTitle.isVisible(), 'Share dialog should be open').toBe(false);
});
});
9 changes: 4 additions & 5 deletions e2e/playwright/viewer/src/tests/viewer-protected.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,20 @@ test.describe('viewer file', () => {
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;
folderId = node.entry.id;
const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX_PROTECTED.path, randomDocxName, folderId);
fileDocxId = await fileDoc.entry.id;
fileDocxId = fileDoc.entry.id;
await shareAction.shareFileById(fileDocxId);
await favoritesPageAction.addFavoriteById('file', fileDocxId);
});

test.beforeEach(async ({ personalFiles }) => {
const gotoNodeURL = `#/personal-files/${folderId}`;
await personalFiles.navigate({ remoteUrl: gotoNodeURL });
await personalFiles.navigate({ remoteUrl: `#/personal-files/${folderId}` });
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName);
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.nodes.deleteNode(folderId, { permanent: true });
});

test('[C268958] Password dialog appears when opening a protected file', async ({ personalFiles }) => {
Expand Down
27 changes: 11 additions & 16 deletions e2e/playwright/viewer/src/tests/viewer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,26 @@
import { expect } from '@playwright/test';
import { ApiClientFactory, getUserState, test, TEST_FILES, Utils } from '@alfresco/playwright-shared';

test.use({ storageState: getUserState('admin') });
test.use({ storageState: getUserState('hruser') });
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;

test.beforeAll(async ({ fileAction }) => {
await apiClientFactory.setUpAcaBackend('admin');
await apiClientFactory.setUpAcaBackend('hruser');
const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' });
folderId = await node.entry.id;
folderId = node.entry.id;
await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId);
});

test.beforeEach(async ({ personalFiles }) => {
const gotoNodeURL = `#/personal-files/${folderId}`;
await personalFiles.navigate({ remoteUrl: gotoNodeURL });
await personalFiles.navigate({ remoteUrl: `#/personal-files/${folderId}` });
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.nodes.deleteNode(folderId, { permanent: true });
});

test('[C279269] Viewer opens on double clicking on a file from Personal Files', async ({ personalFiles }) => {
Expand All @@ -71,15 +70,11 @@ test.describe('viewer file', () => {
test('[C279271] Close the viewer', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName);
expect(await personalFiles.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true);
expect(await personalFiles.viewer.getCloseButtonTooltip()).toEqual('Close');
await personalFiles.viewer.closeButtonLocator.click();
expect(await personalFiles.dataTable.getCellLinkByName(randomDocxName).isVisible(), 'Viewer did not close').toBe(true);
});

test('[C284632] Close button tooltip', async ({ personalFiles }) => {
await personalFiles.dataTable.performClickFolderOrFileToOpen(randomDocxName);
expect(await personalFiles.viewer.getCloseButtonTooltip()).toEqual('Close');
});

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');
Expand Down Expand Up @@ -113,17 +108,17 @@ test.describe('viewer file', () => {
let fileDocxId: string;

test.beforeAll(async ({ fileAction, shareAction, favoritesPageAction: favoritesPageAction }) => {
await apiClientFactory.setUpAcaBackend('admin');
await apiClientFactory.setUpAcaBackend('hruser');
const node = await apiClientFactory.nodes.createNode('-my-', { name: randomFolderName, nodeType: 'cm:folder', relativePath: '/' });
folderId = await node.entry.id;
folderId = node.entry.id;
const fileDoc = await fileAction.uploadFile(TEST_FILES.DOCX.path, randomDocxName, folderId);
fileDocxId = await fileDoc.entry.id;
fileDocxId = fileDoc.entry.id;
await shareAction.shareFileById(fileDocxId);
await favoritesPageAction.addFavoriteById('file', fileDocxId);
});

test.afterAll(async () => {
await apiClientFactory.nodes.deleteNode(folderId);
await apiClientFactory.nodes.deleteNode(folderId, { permanent: true });
});

test('[C279285] Viewer opens when accessing the preview URL for a file', async ({ personalFiles }) => {
Expand All @@ -136,7 +131,7 @@ test.describe('viewer file', () => {

test('[C284635] Viewer opens for a file from Shared Files', async ({ sharedPage }) => {
await sharedPage.navigate();
await sharedPage.reload();
await sharedPage.reload({ waitUntil: 'domcontentloaded' });
await sharedPage.dataTable.goThroughPagesLookingForRowWithName(randomDocxName);
await sharedPage.dataTable.performClickFolderOrFileToOpen(randomDocxName);
expect(await sharedPage.viewer.isViewerOpened(), 'Viewer is not opened').toBe(true);
Expand Down
7 changes: 6 additions & 1 deletion e2e/protractor/protractor.excludes.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
"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"
"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"
}
6 changes: 5 additions & 1 deletion projects/aca-playwright-shared/src/api/api-client-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ import {
SitesApi,
UploadApi,
SharedlinksApi,
FavoritesApi
FavoritesApi,
TrashcanApi
} from '@alfresco/js-api';
import { logger } from '@alfresco/adf-cli/scripts/logger';
import { ActionTypes, Rule } from './rules-api';
Expand All @@ -49,6 +50,7 @@ export interface AcaBackend {
nodes: NodesApi;
share: SharedlinksApi;
favorites: FavoritesApi;
trashCan: TrashcanApi;

tearDown(): Promise<any>;
}
Expand Down Expand Up @@ -79,6 +81,7 @@ export class ApiClientFactory {
public contentClient: ContentClient;
public share: SharedlinksApi;
public favorites: FavoritesApi;
public trashCan: TrashcanApi;

constructor() {
this.alfrescoApi = new AlfrescoApi(config);
Expand All @@ -100,6 +103,7 @@ export class ApiClientFactory {
this.securityMarksApi = new SecurityMarksApi(this.alfrescoApi);
this.share = new SharedlinksApi(this.alfrescoApi);
this.favorites = new FavoritesApi(this.alfrescoApi);
this.trashCan = new TrashcanApi(this.alfrescoApi);

return this;
}
Expand Down
Loading