diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 7c862d2bd3..3c23368e84 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -101,12 +101,8 @@ jobs: fail-fast: false matrix: e2e-suites: - - name: "deleteActions" - id: 7 - - name: "editActions,favoriteActions" - id: 8 - - name: "uploadDownloadActions" - id: 9 + - name: "editActions" + id: 1 steps: - name: Checkout uses: actions/checkout@v3 @@ -174,6 +170,10 @@ jobs: id: 13 - name: "upload-download-actions" id: 14 + - name: "favorite-actions" + id: 15 + - name: "delete-actions" + id: 16 steps: - name: Checkout uses: actions/checkout@v3 @@ -240,5 +240,3 @@ jobs: echo -e "\e[31mPRs are not mergeable with conditional build. This build was run with custom ADF branch: $BRANCH \e[0m" exit 1 fi; - - diff --git a/e2e/playwright/delete-actions/exclude.tests.json b/e2e/playwright/delete-actions/exclude.tests.json index 0967ef424b..893d21a54a 100644 --- a/e2e/playwright/delete-actions/exclude.tests.json +++ b/e2e/playwright/delete-actions/exclude.tests.json @@ -1 +1,3 @@ -{} +{ + "C280502": "https://hyland.atlassian.net/browse/ACS-8200" +} diff --git a/e2e/playwright/favorite-actions/.eslintrc.json b/e2e/playwright/favorite-actions/.eslintrc.json new file mode 100644 index 0000000000..582353ca8f --- /dev/null +++ b/e2e/playwright/favorite-actions/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "extends": "../../../.eslintrc.json", + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "parserOptions": { + "project": [ + "e2e/playwright/favorite-actions/tsconfig.e2e.json" + ], + "createDefaultProgram": true + }, + "plugins": [ + "rxjs", + "unicorn" + ], + "rules": { + "@typescript-eslint/no-floating-promises": "off" + } + } + ] +} diff --git a/e2e/playwright/favorite-actions/exclude.tests.json b/e2e/playwright/favorite-actions/exclude.tests.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/e2e/playwright/favorite-actions/exclude.tests.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/e2e/playwright/favorite-actions/playwright.config.ts b/e2e/playwright/favorite-actions/playwright.config.ts new file mode 100644 index 0000000000..018c367f9d --- /dev/null +++ b/e2e/playwright/favorite-actions/playwright.config.ts @@ -0,0 +1,44 @@ +/*! + * Copyright © 2005-2024 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 { PlaywrightTestConfig } from '@playwright/test'; +import { CustomConfig, getGlobalConfig, getExcludedTestsRegExpArray } from '@alfresco/playwright-shared'; +import EXCLUDED_JSON from './exclude.tests.json'; + +const config: PlaywrightTestConfig = { + ...getGlobalConfig, + + grepInvert: getExcludedTestsRegExpArray(EXCLUDED_JSON, 'Favorite Actions'), + projects: [ + { + name: 'Favorite Actions', + testDir: './src/tests', + use: { + users: [] + } + } + ] +}; + +export default config; diff --git a/e2e/playwright/favorite-actions/project.json b/e2e/playwright/favorite-actions/project.json new file mode 100644 index 0000000000..20fec7c673 --- /dev/null +++ b/e2e/playwright/favorite-actions/project.json @@ -0,0 +1,22 @@ +{ + "name": "favorite-actions-e2e", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "e2e/playwright/favorite-actions", + "projectType": "application", + "targets": { + "e2e": { + "executor": "nx:run-commands", + "options": { + "commands": ["npx playwright test --config=e2e/playwright/favorite-actions/playwright.config.ts"] + }, + "configurations": { + "production": { + "devServerTarget": "content-ce:serve:production" + } + } + }, + "lint": { + "executor": "@angular-eslint/builder:lint" + } + } +} diff --git a/e2e/playwright/favorite-actions/src/tests/mark-favorite.e2e.ts b/e2e/playwright/favorite-actions/src/tests/mark-favorite.e2e.ts new file mode 100644 index 0000000000..762a866710 --- /dev/null +++ b/e2e/playwright/favorite-actions/src/tests/mark-favorite.e2e.ts @@ -0,0 +1,183 @@ +/*! + * Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved. + * + * Alfresco Example Content Application + * + * This file is part of the Alfresco Example Content Application. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * The Alfresco Example Content Application is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Alfresco Example Content Application is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * from Hyland Software. If not, see . + */ + +import { expect } from '@playwright/test'; +import { ApiClientFactory, Utils, test, TrashcanApi, NodesApi, FavoritesPageApi, SharedLinksApi } from '@alfresco/playwright-shared'; + +test.describe('Mark items as favorites', () => { + let trashcanApi: TrashcanApi; + let nodesApi: NodesApi; + let favoritesApi: FavoritesPageApi; + let sharedApi: SharedLinksApi; + + const username = `user-${Utils.random()}`; + const parent = `parent-${Utils.random()}`; + + const fileNotFavUI = `fileNotFavUI-${Utils.random()}.txt`; + const fileFavUI = `fileFavUI-${Utils.random()}.txt`; + const fileNotFav1 = `fileNotFav1-${Utils.random()}.txt`; + const fileNotFav2 = `fileNotFav2-${Utils.random()}.txt`; + const fileNotFav3 = `fileNotFav3-${Utils.random()}.txt`; + const fileNotFav4 = `fileNotFav4-${Utils.random()}.txt`; + const fileFav1 = `fileFav1-${Utils.random()}.txt`; + const fileFav2 = `fileFav2-${Utils.random()}.txt`; + const fileFav3 = `fileFav3-${Utils.random()}.txt`; + const fileFav4 = `fileFav4-${Utils.random()}.txt`; + const folder = `folder-${Utils.random()}`; + + let fileFavUIId: string; + let fileNotFav1Id: string; + let fileNotFav2Id: string; + let fileNotFav3Id: string; + let fileNotFav4Id: string; + let fileFav1Id: string; + let fileFav2Id: string; + let fileFav3Id: string; + let fileFav4Id: string; + let folderId: string; + let parentId: string; + + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + trashcanApi = await TrashcanApi.initialize(username, username); + nodesApi = await NodesApi.initialize(username, username); + favoritesApi = await FavoritesPageApi.initialize(username, username); + sharedApi = await SharedLinksApi.initialize(username, username); + + parentId = (await nodesApi.createFolder(parent)).entry.id; + fileFavUIId = (await nodesApi.createFile(fileFavUI, parentId)).entry.id; + fileNotFav1Id = (await nodesApi.createFile(fileNotFav1, parentId)).entry.id; + fileNotFav2Id = (await nodesApi.createFile(fileNotFav2, parentId)).entry.id; + fileNotFav3Id = (await nodesApi.createFile(fileNotFav3, parentId)).entry.id; + fileNotFav4Id = (await nodesApi.createFile(fileNotFav4, parentId)).entry.id; + fileFav1Id = (await nodesApi.createFile(fileFav1, parentId)).entry.id; + fileFav2Id = (await nodesApi.createFile(fileFav2, parentId)).entry.id; + fileFav3Id = (await nodesApi.createFile(fileFav3, parentId)).entry.id; + fileFav4Id = (await nodesApi.createFile(fileFav4, parentId)).entry.id; + folderId = (await nodesApi.createFolder(folder, parentId)).entry.id; + await nodesApi.createFile(fileNotFavUI, parentId); + + const currentFavoritesTotalItems = await favoritesApi.getFavoritesTotalItems(username); + await favoritesApi.addFavoritesByIds('file', [fileFavUIId, fileFav1Id, fileFav2Id, fileFav3Id, fileFav4Id]); + await favoritesApi.waitForApi(username, { expect: currentFavoritesTotalItems + 5 }); + + await sharedApi.shareFilesByIds([fileFav1Id, fileFav2Id, fileFav3Id, fileFav4Id]); + await sharedApi.shareFilesByIds([fileNotFav1Id, fileNotFav2Id, fileNotFav3Id, fileNotFav4Id]); + await sharedApi.waitForFilesToBeShared([ + fileFav1Id, + fileFav2Id, + fileFav3Id, + fileFav4Id, + fileNotFav1Id, + fileNotFav2Id, + fileNotFav3Id, + fileNotFav4Id + ]); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test.beforeEach(async ({ loginPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + }); + + test.afterAll(async () => { + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); + }); + + test.describe('on Personal Files', () => { + test.afterAll(async () => { + try { + await favoritesApi.addFavoritesByIds('file', [fileFavUIId, fileFav1Id, fileFav2Id, fileFav3Id, fileFav4Id]); + await favoritesApi.addFavoriteById('folder', folderId); + await favoritesApi.removeFavoritesByIds(username, [fileNotFav1Id, fileNotFav2Id, fileNotFav3Id, fileNotFav4Id]); + } catch (error) {} + }); + + test.beforeEach(async ({ personalFiles }) => { + await personalFiles.dataTable.performClickFolderOrFileToOpen(parent); + }); + + test('[XAT-5042] Favorite action has empty star icon for an item not marked as favorite', async ({ personalFiles }) => { + await personalFiles.dataTable.selectItem(fileNotFavUI); + await personalFiles.acaHeader.clickMoreActions(); + expect(await personalFiles.matMenu.isMenuItemVisible('Favorite')).toBe(true); + }); + + test('[XAT-5043] Favorite action has empty star icon for multiple selection of items when some are not favorite', async ({ personalFiles }) => { + await personalFiles.dataTable.selectMultiItem(fileNotFavUI, fileFavUI); + await personalFiles.acaHeader.clickMoreActions(); + expect(await personalFiles.matMenu.isMenuItemVisible('Favorite')).toBe(true); + }); + + test('[XAT-5044] Favorite action has full star icon for items marked as favorite', async ({ personalFiles }) => { + await personalFiles.dataTable.selectItem(fileFavUI); + await personalFiles.acaHeader.clickMoreActions(); + expect(await personalFiles.matMenu.isMenuItemVisible('Remove Favorite')).toBe(true); + }); + + test('[XAT-5045] Favorite a file', async ({ personalFiles }) => { + await personalFiles.selectItemsAndToggleFavorite([fileNotFav1], 'Favorite'); + + expect(await favoritesApi.isFavoriteWithRetry(username, fileNotFav1Id, { expect: true })).toBe(true); + }); + + test('[XAT-5046] Favorite a folder', async ({ personalFiles }) => { + await personalFiles.selectItemsAndToggleFavorite([folder], 'Favorite'); + + expect(await favoritesApi.isFavoriteWithRetry(username, folderId, { expect: true })).toBe(true); + }); + + test('[XAT-5047] Unfavorite an item', async ({ personalFiles }) => { + await personalFiles.selectItemsAndToggleFavorite([fileFav1], 'Remove Favorite'); + + expect(await favoritesApi.isFavoriteWithRetry(username, fileFav1Id, { expect: false })).toBe(false); + }); + + test('[XAT-5048] Favorite multiple items - all unfavorite', async ({ personalFiles }) => { + await personalFiles.selectItemsAndToggleFavorite([fileNotFav2, fileNotFav3], 'Favorite'); + + expect(await favoritesApi.isFavoriteWithRetry(username, fileNotFav2Id, { expect: true })).toBe(true); + expect(await favoritesApi.isFavoriteWithRetry(username, fileNotFav3Id, { expect: true })).toBe(true); + }); + + test('[XAT-5049] Unfavorite multiple items', async ({ personalFiles }) => { + await personalFiles.selectItemsAndToggleFavorite([fileFav3, fileFav4], 'Remove Favorite'); + + expect(await favoritesApi.isFavoriteWithRetry(username, fileFav3Id, { expect: false })).toBe(false); + expect(await favoritesApi.isFavoriteWithRetry(username, fileFav4Id, { expect: false })).toBe(false); + }); + + test('[XAT-5050] Favorite multiple items - some favorite and some unfavorite', async ({ personalFiles }) => { + await personalFiles.selectItemsAndToggleFavorite([fileNotFav4, fileFav2], 'Favorite'); + + expect(await favoritesApi.isFavoriteWithRetry(username, fileNotFav4Id, { expect: true })).toBe(true); + expect(await favoritesApi.isFavoriteWithRetry(username, fileFav2Id, { expect: true })).toBe(true); + }); + }); +}); diff --git a/e2e/playwright/favorite-actions/tsconfig.e2e.adf.json b/e2e/playwright/favorite-actions/tsconfig.e2e.adf.json new file mode 100644 index 0000000000..87cbcf775a --- /dev/null +++ b/e2e/playwright/favorite-actions/tsconfig.e2e.adf.json @@ -0,0 +1,15 @@ +{ + "extends": "../../../tsconfig.adf.json", + "compilerOptions": { + "outDir": "../../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es2017", + "types": ["jasmine", "jasminewd2", "node"], + "skipLibCheck": true, + "paths": { + "@alfresco/playwright-shared": ["../../../projects/aca-playwright-shared/src/index.ts"] + } + }, + "exclude": ["node_modules"] +} diff --git a/e2e/playwright/favorite-actions/tsconfig.e2e.json b/e2e/playwright/favorite-actions/tsconfig.e2e.json new file mode 100755 index 0000000000..c317985239 --- /dev/null +++ b/e2e/playwright/favorite-actions/tsconfig.e2e.json @@ -0,0 +1,15 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es2017", + "types": ["jasmine", "jasminewd2", "node", "@playwright/test"], + "skipLibCheck": true, + "paths": { + "@alfresco/playwright-shared": ["../../../projects/aca-playwright-shared/src/index.ts"] + } + }, + "exclude": ["node_modules"] +} diff --git a/e2e/protractor/suites/actions/favorite/mark-favorite.test.ts b/e2e/protractor/suites/actions/favorite/mark-favorite.test.ts deleted file mode 100644 index 79ae6e80de..0000000000 --- a/e2e/protractor/suites/actions/favorite/mark-favorite.test.ts +++ /dev/null @@ -1,195 +0,0 @@ -/*! - * Copyright © 2005-2024 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, RepoClient, Utils, UserActions } from '@alfresco/aca-testing-shared'; - -describe('Mark items as favorites', () => { - const username = `user-${Utils.random()}`; - const parent = `parent-${Utils.random()}`; - - const fileNotFavUI = `fileNotFavUI-${Utils.random()}.txt`; - const fileFavUI = `fileFavUI-${Utils.random()}.txt`; - const fileNotFav1 = `fileNotFav1-${Utils.random()}.txt`; - const fileNotFav2 = `fileNotFav2-${Utils.random()}.txt`; - const fileNotFav3 = `fileNotFav3-${Utils.random()}.txt`; - const fileNotFav4 = `fileNotFav4-${Utils.random()}.txt`; - const fileFav1 = `fileFav1-${Utils.random()}.txt`; - const fileFav2 = `fileFav2-${Utils.random()}.txt`; - const fileFav3 = `fileFav3-${Utils.random()}.txt`; - const fileFav4 = `fileFav4-${Utils.random()}.txt`; - const folder = `folder-${Utils.random()}`; - - let fileFavUIId: string; - let fileNotFav1Id: string; - let fileNotFav2Id: string; - let fileNotFav3Id: string; - let fileNotFav4Id: string; - let fileFav1Id: string; - let fileFav2Id: string; - let fileFav3Id: string; - let fileFav4Id: string; - let folderId: string; - let parentId: string; - - const apis = { - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const page = new BrowsingPage(); - const { dataTable, toolbar } = page; - - const adminApiActions = new AdminActions(); - const userActions = new UserActions(); - - beforeAll(async () => { - await adminApiActions.createUser({ username }); - await userActions.login(username, username); - - parentId = (await apis.user.nodes.createFolder(parent)).entry.id; - - await apis.user.nodes.createFile(fileNotFavUI, parentId); - fileFavUIId = (await apis.user.nodes.createFile(fileFavUI, parentId)).entry.id; - fileNotFav1Id = (await apis.user.nodes.createFile(fileNotFav1, parentId)).entry.id; - fileNotFav2Id = (await apis.user.nodes.createFile(fileNotFav2, parentId)).entry.id; - fileNotFav3Id = (await apis.user.nodes.createFile(fileNotFav3, parentId)).entry.id; - fileNotFav4Id = (await apis.user.nodes.createFile(fileNotFav4, parentId)).entry.id; - fileFav1Id = (await apis.user.nodes.createFile(fileFav1, parentId)).entry.id; - fileFav2Id = (await apis.user.nodes.createFile(fileFav2, parentId)).entry.id; - fileFav3Id = (await apis.user.nodes.createFile(fileFav3, parentId)).entry.id; - fileFav4Id = (await apis.user.nodes.createFile(fileFav4, parentId)).entry.id; - folderId = (await apis.user.nodes.createFolder(folder, parentId)).entry.id; - - const currentFavoritesTotalItems = await apis.user.favorites.getFavoritesTotalItems(); - await apis.user.favorites.addFavoritesByIds('file', [fileFavUIId, fileFav1Id, fileFav2Id, fileFav3Id, fileFav4Id]); - await apis.user.favorites.waitForApi({ expect: currentFavoritesTotalItems + 5 }); - - await apis.user.shared.shareFilesByIds([fileFav1Id, fileFav2Id, fileFav3Id, fileFav4Id]); - await apis.user.shared.shareFilesByIds([fileNotFav1Id, fileNotFav2Id, fileNotFav3Id, fileNotFav4Id]); - await apis.user.shared.waitForFilesToBeShared([ - fileFav1Id, - fileFav2Id, - fileFav3Id, - fileFav4Id, - fileNotFav1Id, - fileNotFav2Id, - fileNotFav3Id, - fileNotFav4Id - ]); - - await loginPage.loginWith(username); - }); - - afterAll(async () => { - await apis.user.nodes.deleteNodeById(parentId); - }); - - afterEach(async () => { - await Utils.pressEscape(); - }); - - describe('on Personal Files', () => { - afterAll(async () => { - try { - await apis.user.favorites.addFavoritesByIds('file', [fileFavUIId, fileFav1Id, fileFav2Id, fileFav3Id, fileFav4Id]); - await apis.user.favorites.addFavoriteById('folder', folderId); - await apis.user.favorites.removeFavoritesByIds([fileNotFav1Id, fileNotFav2Id, fileNotFav3Id, fileNotFav4Id]); - } catch (error) {} - }); - - beforeEach(async () => { - await page.clickPersonalFilesAndWait(); - await dataTable.doubleClickOnRowByName(parent); - }); - - it('[C217186] Favorite action has empty star icon for an item not marked as favorite', async () => { - await dataTable.selectItem(fileNotFavUI); - await toolbar.openMoreMenu(); - - expect(await toolbar.menu.getItemIconText('Favorite')).toEqual('star_border'); - await toolbar.closeMoreMenu(); - }); - - it('[C217187] Favorite action has empty star icon for multiple selection of items when some are not favorite', async () => { - await dataTable.selectMultipleItems([fileNotFavUI, fileFavUI]); - await toolbar.openMoreMenu(); - - expect(await toolbar.menu.getItemIconText('Favorite')).toEqual('star_border'); - await toolbar.closeMoreMenu(); - }); - - it('[C217188] Favorite action has full star icon for items marked as favorite', async () => { - await dataTable.selectItem(fileFavUI); - await toolbar.openMoreMenu(); - - expect(await toolbar.menu.getItemIconText('Remove Favorite')).toEqual('star'); - await toolbar.closeMoreMenu(); - }); - - it('[C217189] favorite a file', async () => { - await dataTable.selectItem(fileNotFav1); - await toolbar.clickMoreActionsFavorite(); - - expect(await apis.user.favorites.isFavoriteWithRetry(fileNotFav1Id, { expect: true })).toBe(true, `${fileNotFav1} not marked as favorite`); - }); - - it('[C280390] favorite a folder', async () => { - await dataTable.selectItem(folder); - await toolbar.clickMoreActionsFavorite(); - - expect(await apis.user.favorites.isFavoriteWithRetry(folderId, { expect: true })).toBe(true, `${folder} not marked as favorite`); - }); - - it('[C217190] unfavorite an item', async () => { - await dataTable.selectItem(fileFav1); - await toolbar.clickMoreActionsRemoveFavorite(); - - expect(await apis.user.favorites.isFavoriteWithRetry(fileFav1Id, { expect: false })).toBe(false, `${fileFav1} is marked as favorite`); - }); - - it('[C217192] favorite multiple items - all unfavorite', async () => { - await dataTable.selectMultipleItems([fileNotFav2, fileNotFav3]); - await toolbar.clickMoreActionsFavorite(); - - expect(await apis.user.favorites.isFavoriteWithRetry(fileNotFav2Id, { expect: true })).toBe(true, `${fileNotFav2} not marked as favorite`); - expect(await apis.user.favorites.isFavoriteWithRetry(fileNotFav3Id, { expect: true })).toBe(true, `${fileNotFav3} not marked as favorite`); - }); - - it('[C217194] favorite multiple items - some favorite and some unfavorite', async () => { - await dataTable.selectMultipleItems([fileNotFav4, fileFav2]); - await toolbar.clickMoreActionsFavorite(); - - expect(await apis.user.favorites.isFavoriteWithRetry(fileNotFav4Id, { expect: true })).toBe(true, `${fileNotFav4} not marked as favorite`); - expect(await apis.user.favorites.isFavoriteWithRetry(fileFav2Id, { expect: true })).toBe(true, `${fileFav2} not marked as favorite`); - }); - - it('[C217193] unfavorite multiple items', async () => { - await dataTable.selectMultipleItems([fileFav3, fileFav4]); - await toolbar.clickMoreActionsRemoveFavorite(); - - expect(await apis.user.favorites.isFavoriteWithRetry(fileFav3Id, { expect: false })).toBe(false, `${fileFav3} marked as favorite`); - expect(await apis.user.favorites.isFavoriteWithRetry(fileFav4Id, { expect: false })).toBe(false, `${fileFav4} marked as favorite`); - }); - }); -}); diff --git a/projects/aca-playwright-shared/src/api/favorites-api.ts b/projects/aca-playwright-shared/src/api/favorites-api.ts index 4f1a26b210..d676a81c73 100755 --- a/projects/aca-playwright-shared/src/api/favorites-api.ts +++ b/projects/aca-playwright-shared/src/api/favorites-api.ts @@ -115,4 +115,16 @@ export class FavoritesPageApi { return await Utils.retryCall(favoriteFiles); } catch {} } + + async removeFavoritesByIds(username: string, ids: string[]): Promise { + try { + if (ids && ids.length > 0) { + for (const id of ids) { + await this.apiService.favorites.deleteFavorite(username, id); + } + } + } catch (error) { + console.error('FavoritesApi: removeFavoritesByIds failed ', error); + } + } } 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 dcf7f17dc2..9b3eea07b3 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 @@ -103,4 +103,12 @@ export class PersonalFilesPage extends BasePage { await this.contentNodeSelector.selectDestination(destinationName); await this.contentNodeSelector.actionButton.click(); } + + async selectItemsAndToggleFavorite(item: string[], action: 'Favorite' | 'Remove Favorite') { + for (const itemToSelect of item) { + await this.dataTable.selectItem(itemToSelect); + } + await this.acaHeader.clickMoreActions(); + await this.matMenu.clickMenuItem(action); + } }