diff --git a/e2e/playwright/search/src/tests/search-highlighting.e2e.ts b/e2e/playwright/search/src/tests/search-highlighting.e2e.ts new file mode 100644 index 0000000000..7d8bee2628 --- /dev/null +++ b/e2e/playwright/search/src/tests/search-highlighting.e2e.ts @@ -0,0 +1,80 @@ +/*! + * 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, NodesApi, TrashcanApi, TEST_FILES, FileActionsApi } from '@alfresco/aca-playwright-shared'; + +test.describe('Search Highlighting', () => { + let nodesApi: NodesApi; + let trashcanApi: TrashcanApi; + let fileActionsApi: FileActionsApi; + const randomId = Utils.random(); + const username = `user-${randomId}`; + const fileNameHighlight = `${randomId}-file-name.jpg`; + const fileDescriptionHighlight = `${randomId}-file-description.jpg`; + const fileDescription = `highlight`; + const fileContentHighlight = `${randomId}-file-content.pdf`; + const fileContent = 'TEXT:Virtual'; + + test.beforeEach(async ({ loginPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + }); + + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + nodesApi = await NodesApi.initialize(username, username); + trashcanApi = await TrashcanApi.initialize(username, username); + fileActionsApi = await FileActionsApi.initialize(username, username); + await nodesApi.createFile(fileNameHighlight, '-my-'); + await nodesApi.createFile(fileDescriptionHighlight, '-my-', null, fileDescription); + await fileActionsApi.uploadFileWithRename(TEST_FILES.PDF.path, fileContentHighlight); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test.afterAll(async () => { + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); + }); + + test('[XAT-17119] Matching phrases should be highlighted in the file name for search results', async ({ searchPage }) => { + await searchPage.searchWithin(fileNameHighlight, 'files'); + expect(await searchPage.dataTable.hasHighlightedText('name')).toBeTruthy(); + }); + + test('[XAT-17120] Matching phrases should be highlighted in the file description for search results', async ({ searchPage }) => { + await searchPage.searchWithin(fileDescription, 'files'); + expect(await searchPage.dataTable.hasHighlightedText('description')).toBeTruthy(); + expect(await searchPage.dataTable.hasHighlightedText('name')).toBeFalsy(); + }); + + test('[XAT-17121] Matching phrases should be highlighted in the file content for search results', async ({ searchPage }) => { + await searchPage.searchWithin(fileContent, 'files'); + expect(await searchPage.dataTable.hasHighlightedText('content')).toBeTruthy(); + expect(await searchPage.dataTable.hasHighlightedText('name')).toBeFalsy(); + }); +}); 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 d14ddbf6ad..05aa1d7b32 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 @@ -58,6 +58,10 @@ export class DataTableComponent extends BaseComponent { lockOwner = this.page.locator('.aca-locked-by--name'); uncheckedCheckbox = this.page.locator('.mat-mdc-checkbox'); checkedCheckbox = this.page.locator('.mat-mdc-checkbox-checked'); + highlightedText = '.aca-highlight'; + searchFileName = '.search-file-name'; + searchFileDescription = '[data-automation-id="search-results-entry-description"]'; + searchFileContent = '.aca-result-content'; /** Locator for row (or rows) */ getRowLocator = this.page.getByRole('rowgroup').nth(1).locator('adf-datatable-row'); @@ -379,4 +383,15 @@ export class DataTableComponent extends BaseComponent { const row = this.getRowByName(itemName); return row.locator(this.lockOwner).innerText(); } + + async hasHighlightedText(location: 'name' | 'description' | 'content'): Promise { + switch (location) { + case 'name': + return this.page.locator(this.searchFileName).locator(this.highlightedText).isVisible(); + case 'description': + return this.page.locator(this.searchFileDescription).locator(this.highlightedText).isVisible(); + case 'content': + return this.page.locator(this.searchFileContent).locator(this.highlightedText).isVisible(); + } + } }