From dea7e169666267153bfa2679d71404d6aac335aa Mon Sep 17 00:00:00 2001 From: datguychen Date: Wed, 28 Feb 2024 10:37:57 +0100 Subject: [PATCH] ACS-6797 search general migrated v1 --- e2e/playwright/search/.eslintrc.json | 26 +++ e2e/playwright/search/exclude.tests.json | 1 + e2e/playwright/search/playwright.config.ts | 44 +++++ e2e/playwright/search/project.json | 22 +++ .../src/tests/search-results-general.spec.ts | 150 ++++++++++++++++++ e2e/playwright/search/tsconfig.e2e.adf.json | 15 ++ e2e/playwright/search/tsconfig.e2e.json | 15 ++ .../dataTable/data-table.component.ts | 1 + .../search/search-input.component.ts | 72 +++++++++ 9 files changed, 346 insertions(+) create mode 100644 e2e/playwright/search/.eslintrc.json create mode 100644 e2e/playwright/search/exclude.tests.json create mode 100644 e2e/playwright/search/playwright.config.ts create mode 100644 e2e/playwright/search/project.json create mode 100644 e2e/playwright/search/src/tests/search-results-general.spec.ts create mode 100644 e2e/playwright/search/tsconfig.e2e.adf.json create mode 100755 e2e/playwright/search/tsconfig.e2e.json diff --git a/e2e/playwright/search/.eslintrc.json b/e2e/playwright/search/.eslintrc.json new file mode 100644 index 0000000000..44c4872a8d --- /dev/null +++ b/e2e/playwright/search/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "extends": "../../../.eslintrc.json", + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "parserOptions": { + "project": [ + "e2e/playwright/search/tsconfig.e2e.json" + ], + "createDefaultProgram": true + }, + "plugins": [ + "rxjs", + "unicorn" + ], + "rules": { + "@typescript-eslint/no-floating-promises": "off" + } + } + ] +} diff --git a/e2e/playwright/search/exclude.tests.json b/e2e/playwright/search/exclude.tests.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/e2e/playwright/search/exclude.tests.json @@ -0,0 +1 @@ +{} diff --git a/e2e/playwright/search/playwright.config.ts b/e2e/playwright/search/playwright.config.ts new file mode 100644 index 0000000000..e5612fef90 --- /dev/null +++ b/e2e/playwright/search/playwright.config.ts @@ -0,0 +1,44 @@ +/*! + * 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 { 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, 'Search'), + projects: [ + { + name: 'Search', + testDir: './src/tests', + use: { + users: [] + } + } + ] +}; + +export default config; diff --git a/e2e/playwright/search/project.json b/e2e/playwright/search/project.json new file mode 100644 index 0000000000..d53fd8db6e --- /dev/null +++ b/e2e/playwright/search/project.json @@ -0,0 +1,22 @@ +{ + "name": "search-e2e", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "e2e/playwright/search", + "projectType": "application", + "targets": { + "e2e": { + "executor": "nx:run-commands", + "options": { + "commands": ["npx playwright test --config=e2e/playwright/search/playwright.config.ts"] + }, + "configurations": { + "production": { + "devServerTarget": "content-ce:serve:production" + } + } + }, + "lint": { + "executor": "@angular-eslint/builder:lint" + } + } +} diff --git a/e2e/playwright/search/src/tests/search-results-general.spec.ts b/e2e/playwright/search/src/tests/search-results-general.spec.ts new file mode 100644 index 0000000000..32a39dbbe9 --- /dev/null +++ b/e2e/playwright/search/src/tests/search-results-general.spec.ts @@ -0,0 +1,150 @@ +/*! + * 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 { expect } from '@playwright/test'; +import { ApiClientFactory, Utils, test, TrashcanApi, NodesApi } from '@alfresco/playwright-shared'; + +test.describe('Info Drawer - General', () => { + let trashcanApi: TrashcanApi; + let nodesApi: NodesApi; + + const username = `user1-${Utils.random()}`; + const random = Utils.random(); + + const file = `test-file-${random}.txt`; + const folder = `test-folder-${random}`; + const site = `test-site-${random}`; + + test.beforeEach(async ({ loginPage }) => { + try { + await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); + } catch (error) { + console.error(`beforeEach failed: ${error}`); + } + }); + + 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); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test.afterAll(async () => { + try { + await trashcanApi.emptyTrashcan(); + await nodesApi.deleteCurrentUserNodes(); + } catch (error) { + console.error(`afterAll failed: ${error}`); + } + }); + + test('[C290005] Only files are returned when Files option is the only one checked', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkOnlyFiles(); + await searchPage.searchInput.searchFor(`*${random}`); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(file)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(folder)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site)).toBeFalsy(); + }); + + test('[C290006] Only folders are returned when Folders option is the only one checked', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkOnlyFolders(); + await searchPage.searchInput.searchFor(`*${random}`); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(file)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(folder)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(site)).toBeFalsy(); + }); + + test('[C290007] Files and folders are returned when both Files and Folders options are checked', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkFilesAndFolders(); + await searchPage.searchInput.searchFor(`*${random}`); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(file)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(folder)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(site)).toBeFalsy(); + }); + + test('[C290008] Only libraries are returned when Libraries option is checked', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(`*${random}`); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(file)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(folder)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site)).toBeTruthy(); + }); + + test('[C279162] Results are updated automatically when changing the search term', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.searchFor(file); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(file)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(folder)).toBeFalsy(); + + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.searchFor(folder); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(file)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(folder)).toBeTruthy(); + }); + + test('[C279178] Results are returned when accessing an URL containing a search query', async ({ searchPage, personalFiles }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(site); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(site)).toBeTruthy(); + + const url = await searchPage.page.url(); + + await personalFiles.navigate(); + await personalFiles.page.goto(url); + await searchPage.dataTable.body.waitFor(); + + expect(await searchPage.dataTable.isItemPresent(site)).toBeTruthy(); + }); +}); diff --git a/e2e/playwright/search/tsconfig.e2e.adf.json b/e2e/playwright/search/tsconfig.e2e.adf.json new file mode 100644 index 0000000000..87cbcf775a --- /dev/null +++ b/e2e/playwright/search/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/search/tsconfig.e2e.json b/e2e/playwright/search/tsconfig.e2e.json new file mode 100755 index 0000000000..c317985239 --- /dev/null +++ b/e2e/playwright/search/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/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 1110404b0b..62addb8c29 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 @@ -37,6 +37,7 @@ export class DataTableComponent extends BaseComponent { } public pagination = new PaginationComponent(this.page); + body = this.getChild('.adf-datatable-body') getEmptyFolderLocator = this.getChild('.adf-empty-folder'); getEmptyContentTitleLocator = this.getChild('adf-empty-content .adf-empty-content__title'); getEmptyContentSubTitleLocator = this.getChild('adf-empty-content .adf-empty-content__subtitle'); diff --git a/projects/aca-playwright-shared/src/page-objects/components/search/search-input.component.ts b/projects/aca-playwright-shared/src/page-objects/components/search/search-input.component.ts index 6adf0d7388..ed218361ad 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/search/search-input.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/search/search-input.component.ts @@ -29,6 +29,13 @@ import { timeouts } from '../../../utils'; export class SearchInputComponent extends BaseComponent { private static rootElement = 'aca-page-layout'; public searchButton = this.getChild('aca-search-input .app-search-button'); + public searchField = this.getChild('aca-search-input .mat-form-field'); + public searchOptionsArea = this.getChild('#search-options'); + public searchCheckboxes = this.searchOptionsArea.locator('.mat-checkbox'); + public searchFilesOption = this.searchCheckboxes.getByText('Files'); + public searchFoldersOption = this.searchCheckboxes.getByText('Folders'); + public searchLibrariesOption = this.searchCheckboxes.getByText('Libraries'); + getIconByName = (name: string): Locator => this.getChild('.mat-icon', { hasText: name }); /** @@ -48,4 +55,69 @@ export class SearchInputComponent extends BaseComponent { await this.getCellLinkByName(name).dblclick(); await this.spinnerWaitForReload(); } + + async clickLibrariesOption() { + await this.searchLibrariesOption.click(); + } + + async clickFoldersOption() { + await this.searchFoldersOption.click(); + } + + async clickFilesOption() { + await this.searchFilesOption.click(); + } + + async isFilesOptionChecked() { + const optClass = await this.searchFilesOption.getAttribute('class'); + return optClass.includes('mat-checkbox-checked'); + } + + async isFoldersOptionChecked() { + const optClass = await this.searchFoldersOption.getAttribute('class'); + return optClass.includes('mat-checkbox-checked'); + } + + async isLibrariesOptionChecked() { + const optClass = await this.searchLibrariesOption.getAttribute('class'); + return optClass.includes('mat-checkbox-checked'); + } + + async clearOptions() { + if (await this.isFilesOptionChecked()) { + await this.clickFilesOption(); + } + if (await this.isFoldersOptionChecked()) { + await this.clickFoldersOption(); + } + if (await this.isLibrariesOptionChecked()) { + await this.clickLibrariesOption(); + } + } + async checkOnlyFiles() { + await this.clearOptions(); + await this.clickFilesOption(); + } + + async checkOnlyFolders() { + await this.clearOptions(); + await this.clickFoldersOption(); + } + + async checkFilesAndFolders() { + await this.clearOptions(); + await this.clickFilesOption(); + await this.clickFoldersOption(); + } + + async checkLibraries() { + await this.clearOptions(); + await this.clickLibrariesOption(); + } + + async searchFor(text: string) { + await this.searchButton.click(); + await this.searchField.type(text); + await this.searchButton.click(); + } }