mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-07-24 17:31:52 +00:00
[ACS-7336] Added Playwright e2e Search - Tags & Deleted Protractor Search tests (#3812)
* ACS-7336 [Added] playwright e2e Search - Tags [Deleted] Protractor Search tests
This commit is contained in:
89
e2e/playwright/search/src/tests/search-filters-tags.e2e.ts
Normal file
89
e2e/playwright/search/src/tests/search-filters-tags.e2e.ts
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*!
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { expect } from '@playwright/test';
|
||||||
|
import { ApiClientFactory, Utils, test, NodesApi, TrashcanApi, TagsApi, FileActionsApi } from '@alfresco/playwright-shared';
|
||||||
|
import { TagEntry, TagPaging } from '@alfresco/js-api';
|
||||||
|
|
||||||
|
test.describe('Search - Filters - Tags', () => {
|
||||||
|
let nodesApi: NodesApi;
|
||||||
|
let trashcanApi: TrashcanApi;
|
||||||
|
let tagsApiAdmin: TagsApi;
|
||||||
|
let fileActionsApi: FileActionsApi;
|
||||||
|
let file1Id: string;
|
||||||
|
let file2Id: string;
|
||||||
|
let tagEntries: TagEntry[];
|
||||||
|
|
||||||
|
const random = Utils.random();
|
||||||
|
const username = `user1-${random}`;
|
||||||
|
const file1 = `${random}-file1`;
|
||||||
|
const file2 = `${random}-file2`;
|
||||||
|
const tags = [{ tag: `${random}-tag1` }, { tag: `${random}-tag2` }];
|
||||||
|
|
||||||
|
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);
|
||||||
|
tagsApiAdmin = await TagsApi.initialize('admin');
|
||||||
|
fileActionsApi = await FileActionsApi.initialize(username, username);
|
||||||
|
const node1 = await nodesApi.createFile(file1);
|
||||||
|
file1Id = node1.entry.id;
|
||||||
|
const node2 = await nodesApi.createFile(file2);
|
||||||
|
file2Id = node2.entry.id;
|
||||||
|
await fileActionsApi.waitForNodes(file1, { expect: 1 });
|
||||||
|
await fileActionsApi.waitForNodes(file2, { expect: 1 });
|
||||||
|
tagEntries = await tagsApiAdmin.createTags(tags);
|
||||||
|
await tagsApiAdmin.assignTagToNode(file1Id, tags[0]);
|
||||||
|
await tagsApiAdmin.assignTagToNode(file2Id, tags[1]);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`beforeAll failed: ${error}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test.afterAll(async () => {
|
||||||
|
await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed');
|
||||||
|
await tagsApiAdmin.deleteTag(`${(tagEntries as TagPaging).list.entries[0].entry.id}`);
|
||||||
|
await tagsApiAdmin.deleteTag(`${(tagEntries as TagPaging).list.entries[1].entry.id}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[C698515] Filter with Tags', async ({ searchPage }) => {
|
||||||
|
await searchPage.searchWithin(random, 'files');
|
||||||
|
await searchPage.searchFiltersTags.filterByTag(searchPage, `${(tagEntries as TagPaging).list.entries[0].entry.tag}`);
|
||||||
|
|
||||||
|
await expect(searchPage.dataTable.getRowByName(file1)).toBeVisible();
|
||||||
|
await expect(searchPage.dataTable.getRowByName(file2)).toBeHidden();
|
||||||
|
|
||||||
|
await searchPage.searchFiltersTags.filterByTag(searchPage, `${(tagEntries as TagPaging).list.entries[1].entry.tag}`);
|
||||||
|
|
||||||
|
await expect(searchPage.dataTable.getRowByName(file1)).toBeVisible();
|
||||||
|
await expect(searchPage.dataTable.getRowByName(file2)).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
@@ -1,530 +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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import {
|
|
||||||
AdminActions,
|
|
||||||
LoginPage,
|
|
||||||
SearchResultsPage,
|
|
||||||
RepoClient,
|
|
||||||
Utils,
|
|
||||||
FILES,
|
|
||||||
SITE_VISIBILITY,
|
|
||||||
SITE_ROLES,
|
|
||||||
SizeOperator,
|
|
||||||
click
|
|
||||||
} from '@alfresco/aca-testing-shared';
|
|
||||||
|
|
||||||
describe('Search filters', () => {
|
|
||||||
const random = Utils.random();
|
|
||||||
|
|
||||||
const user1 = `user1-${random}`;
|
|
||||||
|
|
||||||
const user2 = `user2-${random}`;
|
|
||||||
|
|
||||||
const parent = `parent-${random}`;
|
|
||||||
let parentId: string;
|
|
||||||
|
|
||||||
const site = `site-${Utils.random()}`;
|
|
||||||
let docLibId: string;
|
|
||||||
|
|
||||||
const fileJpgUser1 = {
|
|
||||||
name: `search-filters-file-1-${random}.jpg`,
|
|
||||||
source: FILES.jpgFile
|
|
||||||
};
|
|
||||||
|
|
||||||
const filePdfUser2 = {
|
|
||||||
name: `search-filters-file-2-${random}.pdf`,
|
|
||||||
title: 'search filters title',
|
|
||||||
description: 'search filters',
|
|
||||||
source: FILES.pdfFile
|
|
||||||
};
|
|
||||||
|
|
||||||
const expectedFileTypes = ['pdf', 'wpd'];
|
|
||||||
|
|
||||||
const apis = {
|
|
||||||
user1: new RepoClient(user1, user1),
|
|
||||||
user2: new RepoClient(user2, user2)
|
|
||||||
};
|
|
||||||
|
|
||||||
const loginPage = new LoginPage();
|
|
||||||
const page = new SearchResultsPage();
|
|
||||||
const { searchInput } = page.pageLayoutHeader;
|
|
||||||
const { dataTable, filters, toolbar } = page;
|
|
||||||
|
|
||||||
const fileTypeFilter = filters.fileType;
|
|
||||||
const peopleFilter = filters.people;
|
|
||||||
const locationFilter = filters.location;
|
|
||||||
const modifiedDateFilter = filters.modifiedDate;
|
|
||||||
const adminApiActions = new AdminActions();
|
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
await adminApiActions.createUser({ username: user1 });
|
|
||||||
await adminApiActions.createUser({ username: user2 });
|
|
||||||
parentId = (await apis.user1.nodes.createFolder(parent)).entry.id;
|
|
||||||
await apis.user1.sites.createSite(site, SITE_VISIBILITY.PUBLIC);
|
|
||||||
await apis.user1.sites.addSiteMember(site, user2, SITE_ROLES.SITE_MANAGER.ROLE);
|
|
||||||
docLibId = await adminApiActions.sites.getDocLibId(site);
|
|
||||||
|
|
||||||
await apis.user1.nodes.setGranularPermission(parentId, true, user2, 'Collaborator');
|
|
||||||
|
|
||||||
await apis.user1.upload.uploadFileWithRename(fileJpgUser1.source, docLibId, fileJpgUser1.name);
|
|
||||||
await apis.user2.upload.uploadFileWithRename(filePdfUser2.source, parentId, filePdfUser2.name, filePdfUser2.title, filePdfUser2.description);
|
|
||||||
|
|
||||||
await apis.user1.search.waitForNodes(`search-filters *${random}`, { expect: 2 });
|
|
||||||
|
|
||||||
await loginPage.loginWith(user1);
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await Utils.pressEscape();
|
|
||||||
await page.clickPersonalFilesAndWait();
|
|
||||||
await toolbar.clickSearchIconButton();
|
|
||||||
await searchInput.clickSearchButton();
|
|
||||||
await searchInput.searchFor(`search-filters *${random}`);
|
|
||||||
await dataTable.waitForBody();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await Promise.all([apis.user1.nodes.deleteNodeById(parentId), apis.user1.sites.deleteSite(site)]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279186] Filters are displayed', async () => {
|
|
||||||
expect(await fileTypeFilter.isDisplayed()).toBe(true, 'File type filter panel not displayed');
|
|
||||||
expect(await peopleFilter.isDisplayed()).toBe(true, 'People filter panel not displayed');
|
|
||||||
expect(await locationFilter.isDisplayed()).toBe(true, 'Location filter panel not displayed');
|
|
||||||
expect(await modifiedDateFilter.isDisplayed()).toBe(true, 'Modified date filter panel not displayed');
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Filter by Size', () => {
|
|
||||||
afterEach(async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.clickResetButton();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279199] Filter existing', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.typeFileSize('1024');
|
|
||||||
await fileTypeFilter.selectFileSizeOperator(SizeOperator.AT_MOST);
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, `${fileJpgUser1.name} not in the list`);
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, `${filePdfUser2.name} not in the list`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279199] Filter non existing', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.typeFileSize('512000');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isEmpty()).toBe(true, 'list is not empty');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279198] Clear the Size filter options', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.typeFileSize('1024');
|
|
||||||
await fileTypeFilter.selectFileSizeOperator(SizeOperator.AT_MOST);
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
expect(await fileTypeFilter.getFileSizeValue()).toEqual('1024', 'Incorrect file size');
|
|
||||||
expect(await fileTypeFilter.getFileSizeOperatorValue()).toEqual(SizeOperator.AT_MOST, 'Incorrect file size operator');
|
|
||||||
await fileTypeFilter.clickResetButton();
|
|
||||||
await fileTypeFilter.closeDialog();
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
expect(await fileTypeFilter.getFileSizeValue()).toEqual('', 'Incorrect file size');
|
|
||||||
expect(await fileTypeFilter.getFileSizeOperatorValue()).toEqual(SizeOperator.AT_LEAST, 'Incorrect file size operator');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Filter by File type', () => {
|
|
||||||
afterEach(async () => {
|
|
||||||
await Utils.pressEscape();
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279191] Expand / Collapse the File type filter panel', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
expect(await fileTypeFilter.isDialogPresent()).toBe(true, 'File type filter panel not expanded');
|
|
||||||
expect(await fileTypeFilter.getFileTypesValues('pd')).toEqual(expectedFileTypes, 'Incorrect File type filters facets');
|
|
||||||
|
|
||||||
await fileTypeFilter.closeDialog();
|
|
||||||
expect(await fileTypeFilter.isDialogPresent()).toBe(false, 'File type filter panel is expanded');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279192] Results are filtered by File type', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.selectFileType('pdf');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
expect(await fileTypeFilter.getChipTitle()).toEqual('pdf');
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(false, 'JPG file is displayed');
|
|
||||||
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.selectFileType('jpg');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await fileTypeFilter.getChipTitle()).toEqual(['pdf', 'jpg'].join(', '));
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279193] Clear the File type filter options', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.selectFileType('pdf');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(false, 'JPG file is displayed');
|
|
||||||
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
expect(await fileTypeFilter.getSelectedFileTypeOptions()).toEqual(['pdf']);
|
|
||||||
await fileTypeFilter.clickResetButton();
|
|
||||||
await fileTypeFilter.closeDialog();
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await fileTypeFilter.getChipTitle()).toEqual('');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Filter by People', () => {
|
|
||||||
afterEach(async () => {
|
|
||||||
await Utils.pressEscape();
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279205] Expand / Collapse the People filter panel', async () => {
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
expect(await peopleFilter.isDialogPresent()).toBe(true, 'People filter panel not expanded');
|
|
||||||
|
|
||||||
expect(await peopleFilter.getCurrentTabLabel()).toEqual('Creator', 'Incorrect Creator tab label');
|
|
||||||
expect(await peopleFilter.isChipListDisplayed()).toBe(true, 'Creator chip list is not displayed');
|
|
||||||
|
|
||||||
await peopleFilter.changeTabToModifier();
|
|
||||||
expect(await peopleFilter.getCurrentTabLabel()).toEqual('Modifier', 'Incorrect Modifier tab label');
|
|
||||||
expect(await peopleFilter.isChipListDisplayed()).toBe(true, 'Modifier chip list is not displayed');
|
|
||||||
|
|
||||||
await peopleFilter.closeDialog();
|
|
||||||
expect(await peopleFilter.isDialogPresent()).toBe(false, 'People filter panel is expanded');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279206] Results are filtered by Creator', async () => {
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual(`Created by: ${user1} ${user1} `);
|
|
||||||
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.selectChip(`${user2} ${user2}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(false, 'JPG file not displayed');
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual(`Created by: ${user2} ${user2} `);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279207] Results are filtered by Modifier', async () => {
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.changeTabToModifier();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual(`Modified by: ${user1} ${user1} `);
|
|
||||||
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.changeTabToModifier();
|
|
||||||
await peopleFilter.selectChip(`${user2} ${user2}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(false, 'JPG file not displayed');
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual(`Modified by: ${user2} ${user2} `);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279208] Clear the Creator filter options', async () => {
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
expect(await peopleFilter.getSelectedValues()).toEqual([`${user1} ${user1}`]);
|
|
||||||
await peopleFilter.clickResetButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual('', 'Creator selection not cleared');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279209] Clear the Modifier filter options', async () => {
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.changeTabToModifier();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
expect(await peopleFilter.getSelectedValues()).toEqual([`${user1} ${user1}`]);
|
|
||||||
await peopleFilter.clickResetButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual('', 'Modifier selection not cleared');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Filter by Location', () => {
|
|
||||||
afterEach(async () => {
|
|
||||||
await Utils.pressEscape();
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279230] Expand / Collapse the Location filter panel', async () => {
|
|
||||||
await locationFilter.openDialog();
|
|
||||||
expect(await locationFilter.isDialogPresent()).toBe(true, 'Location filter panel not expanded');
|
|
||||||
|
|
||||||
expect(await locationFilter.isFilterAutocompleteInputDisplayed()).toBe(true, 'Location filter categories not displayed');
|
|
||||||
|
|
||||||
await locationFilter.closeDialog();
|
|
||||||
expect(await locationFilter.isDialogPresent()).toBe(false, 'Location filter panel is expanded');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279231] Results are filtered by Location', async () => {
|
|
||||||
await locationFilter.openDialog();
|
|
||||||
await locationFilter.setAutocompleteInputValue(site);
|
|
||||||
await locationFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await locationFilter.getChipTitle()).toEqual(site, 'Incorrect location filter selected');
|
|
||||||
|
|
||||||
// TODO check this again after ES migration works as expected when tested manually
|
|
||||||
// await locationFilter.openDialog();
|
|
||||||
// await locationFilter.setAutocompleteInputValue('_REPOSITORY_');
|
|
||||||
// await locationFilter.clickApplyButton();
|
|
||||||
// expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
// expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
// expect(await locationFilter.getChipTitle()).toEqual(`${site}, _REPOSITORY_`, 'Incorrect location filter selected');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279232] Clear the Location filter options', async () => {
|
|
||||||
await locationFilter.openDialog();
|
|
||||||
await locationFilter.setAutocompleteInputValue(site);
|
|
||||||
await locationFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
|
|
||||||
expect(await locationFilter.getChipTitle()).toEqual(`${site}`, 'Incorrect location filter selected');
|
|
||||||
await locationFilter.openDialog();
|
|
||||||
expect(await locationFilter.getFiltersSelectedValues()).toEqual([`${site}`]);
|
|
||||||
await locationFilter.clickResetButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await locationFilter.getChipTitle()).toEqual('', 'Location selection not cleared');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279233] Search for a specific location', async () => {
|
|
||||||
await locationFilter.openDialog();
|
|
||||||
expect(await locationFilter.getFiltersSelectedValues()).toEqual([], 'Incorrect Location filters facets');
|
|
||||||
await locationFilter.setAutocompleteInputValue(site);
|
|
||||||
expect(await locationFilter.getFiltersSelectedValues()).toEqual([`${site}`], 'Incorrect Location filters facets');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Filter by Modified date', () => {
|
|
||||||
const expectedDateFilters = ['Today (2)', 'This week (2)', 'This month (2)', 'In the last 6 months (2)', 'This year (2)'];
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
await Utils.pressEscape();
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279219] Expand / Collapse the Modified date filter panel', async () => {
|
|
||||||
await modifiedDateFilter.openDialog();
|
|
||||||
expect(await modifiedDateFilter.isDialogPresent()).toBe(true, 'Modified Date filter panel not expanded');
|
|
||||||
|
|
||||||
expect(await modifiedDateFilter.getFiltersValues()).toEqual(expectedDateFilters, 'Incorrect Modified Date filters facets');
|
|
||||||
expect(await modifiedDateFilter.isFilterCategoryInputDisplayed()).toBe(true, 'Modified Date filter categories not displayed');
|
|
||||||
|
|
||||||
await modifiedDateFilter.closeDialog();
|
|
||||||
expect(await modifiedDateFilter.isDialogPresent()).toBe(false, 'Modified Date filter panel is expanded');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279221] Results are filtered by Modified date', async () => {
|
|
||||||
await modifiedDateFilter.openDialog();
|
|
||||||
await modifiedDateFilter.checkCategory('Today');
|
|
||||||
await modifiedDateFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await modifiedDateFilter.getChipTitle()).toEqual('Today', 'Incorrect Modified DateFilter selected');
|
|
||||||
|
|
||||||
await modifiedDateFilter.openDialog();
|
|
||||||
await modifiedDateFilter.checkCategory('This week');
|
|
||||||
await modifiedDateFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await modifiedDateFilter.getChipTitle()).toEqual('Today, This week', 'Incorrect Modified DateFilter selected');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279220] Clear the Modified date filter options', async () => {
|
|
||||||
await modifiedDateFilter.openDialog();
|
|
||||||
await modifiedDateFilter.checkCategory('Today');
|
|
||||||
await modifiedDateFilter.checkCategory('This week');
|
|
||||||
await modifiedDateFilter.checkCategory('This month');
|
|
||||||
await modifiedDateFilter.checkCategory('In the last 6 months');
|
|
||||||
await modifiedDateFilter.checkCategory('This year');
|
|
||||||
await modifiedDateFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await modifiedDateFilter.getChipTitle()).toEqual(
|
|
||||||
`Today, This week, This month, In the last 6 months, This year`,
|
|
||||||
'Incorrect checked Modified date filters'
|
|
||||||
);
|
|
||||||
await modifiedDateFilter.openDialog();
|
|
||||||
expect(await modifiedDateFilter.getFiltersCheckedValues()).toEqual(expectedDateFilters, 'Incorrect checked Modified date filters');
|
|
||||||
await modifiedDateFilter.clickResetButton();
|
|
||||||
|
|
||||||
expect(await modifiedDateFilter.getChipTitle()).toEqual('', 'Modified date selection not cleared');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C325006] Search for a specific modified date option', async () => {
|
|
||||||
await modifiedDateFilter.openDialog();
|
|
||||||
expect(await modifiedDateFilter.getFiltersValues()).toEqual(expectedDateFilters, 'Incorrect Modified date filters facets');
|
|
||||||
await modifiedDateFilter.filterCategoriesBy('This');
|
|
||||||
expect(await modifiedDateFilter.getFiltersValues()).toEqual(
|
|
||||||
['This week (2)', 'This month (2)', 'This year (2)'],
|
|
||||||
'Incorrect Modified date filters facets'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Multiple filters', () => {
|
|
||||||
afterEach(async () => {
|
|
||||||
await Utils.pressEscape();
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C280051] Multiple filters can be applied', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.typeFileSize('1024');
|
|
||||||
await fileTypeFilter.selectFileSizeOperator(SizeOperator.AT_MOST);
|
|
||||||
await fileTypeFilter.selectFileType('jpg');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
await locationFilter.openDialog();
|
|
||||||
await locationFilter.setAutocompleteInputValue(site);
|
|
||||||
await locationFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(false, 'PDF file is displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
expect(await fileTypeFilter.getChipTitle()).toEqual(`${SizeOperator.AT_MOST} 1024 KB, jpg`);
|
|
||||||
expect(await peopleFilter.getChipTitle()).toEqual(`Created by: ${user1} ${user1} `);
|
|
||||||
expect(await locationFilter.getChipTitle()).toEqual(site);
|
|
||||||
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
|
|
||||||
expect(await dataTable.isItemPresent(filePdfUser2.name)).toBe(true, 'PDF file not displayed');
|
|
||||||
expect(await dataTable.isItemPresent(fileJpgUser1.name)).toBe(true, 'JPG file not displayed');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C280052] Total results is updated correctly', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.selectFileType('jpg');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await dataTable.getRowsCount()).toEqual(1, 'expected 1 result');
|
|
||||||
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
|
|
||||||
expect(await dataTable.getRowsCount()).toEqual(2, 'expected 2 result');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C279188] Pagination is correct when search results are filtered', async () => {
|
|
||||||
await fileTypeFilter.openDialog();
|
|
||||||
await fileTypeFilter.selectFileType('jpg');
|
|
||||||
await fileTypeFilter.clickApplyButton();
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.selectChip(`${user1} ${user1}`);
|
|
||||||
await peopleFilter.clickApplyButton();
|
|
||||||
|
|
||||||
expect(await page.pagination.getRange()).toEqual('Showing 1-1 of 1');
|
|
||||||
|
|
||||||
await click(filters.resetAllButton);
|
|
||||||
|
|
||||||
expect(await page.pagination.getRange()).toEqual('Showing 1-2 of 2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[C308042] The filter facets display is updated when making a new query', async () => {
|
|
||||||
const expectedUsers1 = [`${user1} ${user1}`, `${user2} ${user2}`];
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
expect(await peopleFilter.getAutocompleteOptions(' ')).toEqual(expectedUsers1);
|
|
||||||
await peopleFilter.closeDialog();
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.changeTabToModifier();
|
|
||||||
expect(await peopleFilter.getAutocompleteOptions(' ')).toEqual(expectedUsers1);
|
|
||||||
await peopleFilter.closeDialog();
|
|
||||||
|
|
||||||
await searchInput.clickSearchButton();
|
|
||||||
await searchInput.searchFor(`${fileJpgUser1.name}*`);
|
|
||||||
await dataTable.waitForBody();
|
|
||||||
|
|
||||||
const expectedUsers2 = [`${user1} ${user1}`];
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
await peopleFilter.changeTabToCreator();
|
|
||||||
expect(await peopleFilter.getAutocompleteOptions('')).toEqual(expectedUsers2);
|
|
||||||
await peopleFilter.closeDialog();
|
|
||||||
|
|
||||||
await peopleFilter.openDialog();
|
|
||||||
expect(await peopleFilter.getAutocompleteOptions('')).toEqual(expectedUsers2);
|
|
||||||
await peopleFilter.closeDialog();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@@ -41,7 +41,8 @@ import {
|
|||||||
TrashcanApi,
|
TrashcanApi,
|
||||||
PersonEntry,
|
PersonEntry,
|
||||||
CommentsApi,
|
CommentsApi,
|
||||||
CategoriesApi
|
CategoriesApi,
|
||||||
|
TagsApi
|
||||||
} from '@alfresco/js-api';
|
} from '@alfresco/js-api';
|
||||||
import { ActionTypes, Rule } from './rules-api';
|
import { ActionTypes, Rule } from './rules-api';
|
||||||
import { users } from '../base-config';
|
import { users } from '../base-config';
|
||||||
@@ -88,6 +89,7 @@ export class ApiClientFactory {
|
|||||||
public commentsApi: CommentsApi;
|
public commentsApi: CommentsApi;
|
||||||
public queriesApi: QueriesApi;
|
public queriesApi: QueriesApi;
|
||||||
public categoriesApi: CategoriesApi;
|
public categoriesApi: CategoriesApi;
|
||||||
|
public tagsApi: TagsApi;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.alfrescoApi = new AlfrescoApi(config);
|
this.alfrescoApi = new AlfrescoApi(config);
|
||||||
@@ -113,6 +115,7 @@ export class ApiClientFactory {
|
|||||||
this.commentsApi = new CommentsApi(this.alfrescoApi);
|
this.commentsApi = new CommentsApi(this.alfrescoApi);
|
||||||
this.queriesApi = new QueriesApi(this.alfrescoApi);
|
this.queriesApi = new QueriesApi(this.alfrescoApi);
|
||||||
this.categoriesApi = new CategoriesApi(this.alfrescoApi);
|
this.categoriesApi = new CategoriesApi(this.alfrescoApi);
|
||||||
|
this.tagsApi = new TagsApi(this.alfrescoApi);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@@ -35,3 +35,4 @@ export * from './search-api';
|
|||||||
export * from './trashcan-api';
|
export * from './trashcan-api';
|
||||||
export * from './queries-api';
|
export * from './queries-api';
|
||||||
export * from './categories-api';
|
export * from './categories-api';
|
||||||
|
export * from './tags-api';
|
||||||
|
66
projects/aca-playwright-shared/src/api/tags-api.ts
Normal file
66
projects/aca-playwright-shared/src/api/tags-api.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/*!
|
||||||
|
* 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
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { TagBody, TagEntry } from '@alfresco/js-api';
|
||||||
|
import { ApiClientFactory } from './api-client-factory';
|
||||||
|
|
||||||
|
export class TagsApi {
|
||||||
|
private apiService: ApiClientFactory;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.apiService = new ApiClientFactory();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async initialize(userName: string, password?: string): Promise<TagsApi> {
|
||||||
|
const classObj = new TagsApi();
|
||||||
|
await classObj.apiService.setUpAcaBackend(userName, password);
|
||||||
|
return classObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
async createTags(tags: TagBody[]): Promise<TagEntry[]> {
|
||||||
|
try {
|
||||||
|
return await this.apiService.tagsApi.createTags(tags);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async assignTagToNode(nodeId: string, tag: TagBody): Promise<TagEntry> {
|
||||||
|
try {
|
||||||
|
return await this.apiService.tagsApi.assignTagToNode(nodeId, tag);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async deleteTag(tagId: string): Promise<void> {
|
||||||
|
try {
|
||||||
|
return await this.apiService.tagsApi.deleteTag(tagId);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -34,13 +34,12 @@ export class SearchFiltersLocation extends BaseComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public addOptionInput = this.getChild(`[data-automation-id$='adf-search-chip-autocomplete-input']`);
|
public addOptionInput = this.getChild(`[data-automation-id$='adf-search-chip-autocomplete-input']`);
|
||||||
public applyButton = this.page.locator('#apply-filter-button');
|
|
||||||
|
|
||||||
async filterByLocation(page: SearchPage, location: string): Promise<void> {
|
async filterByLocation(page: SearchPage, location: string): Promise<void> {
|
||||||
await page.searchFilters.locationFilter.click();
|
await page.searchFilters.locationFilter.click();
|
||||||
await page.searchFiltersLocation.addOptionInput.fill(location);
|
await page.searchFiltersLocation.addOptionInput.fill(location);
|
||||||
await page.page.keyboard.press('Enter');
|
await page.page.keyboard.press('Enter');
|
||||||
await page.searchFiltersLocation.applyButton.click();
|
await page.searchFilters.menuCardApply.click();
|
||||||
await page.dataTable.progressBarWaitForReload();
|
await page.dataTable.progressBarWaitForReload();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
|
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { SearchPage } from '@alfresco/playwright-shared';
|
||||||
import { BaseComponent } from '../../base.component';
|
import { BaseComponent } from '../../base.component';
|
||||||
import { Page } from '@playwright/test';
|
import { Page } from '@playwright/test';
|
||||||
|
|
||||||
@@ -33,4 +34,12 @@ export class SearchFiltersTags extends BaseComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public addOptionInput = this.getChild(`[data-automation-id$='adf-search-chip-autocomplete-input']`);
|
public addOptionInput = this.getChild(`[data-automation-id$='adf-search-chip-autocomplete-input']`);
|
||||||
|
|
||||||
|
async filterByTag(page: SearchPage, tag: string): Promise<void> {
|
||||||
|
await page.searchFilters.tagsFilter.click();
|
||||||
|
await page.searchFiltersTags.addOptionInput.fill(tag);
|
||||||
|
await page.page.keyboard.press('Enter');
|
||||||
|
await page.searchFilters.menuCardApply.click();
|
||||||
|
await page.dataTable.progressBarWaitForReload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user