From f4976a194929907ab273ad65ecb35578d1ed9e59 Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Fri, 5 Feb 2021 15:18:30 +0000 Subject: [PATCH] [ADF-4329][ASD-5330] plus Improve e2e (#6580) Improve e2e Fix SSO user avatar Fix Priority for APS1 --- .travis.yml | 3 +- demo-shell/src/app.config.json | 2 +- .../comments/comment-component.e2e.ts | 1 + .../create-library-directive.e2e.ts | 3 +- .../restore-content-directive.e2e.ts | 57 +++--- .../document-list-component.e2e.ts | 1 + .../document-list-permissions.e2e.ts | 1 + e2e/content-services/lock-file.e2e.ts | 140 ++++++++----- .../metadata/metadata-permissions.e2e.ts | 1 + .../metadata/metadata-smoke-tests.e2e.ts | 5 +- e2e/content-services/pages/tag.page.ts | 24 ++- .../permissions/site-permissions.e2e.ts | 2 +- .../share-file/share-file.e2e.ts | 1 + .../share-file/unshare-file.e2e.ts | 64 +++--- .../social/social.component.e2e.ts | 15 -- .../sso-download-directive-component.e2e.ts | 71 +++---- .../upload/user-permission.e2e.ts | 3 +- .../version/version-permissions.e2e.ts | 3 + e2e/core/pages/content-services.page.ts | 4 - .../file-extensions/viewer-component.e2e.ts | 1 + .../viewer-content-services-component.e2e.ts | 1 + .../viewer-custom-toolbar-info-drawer.e2e.ts | 1 + e2e/core/viewer/viewer-properties.e2e.ts | 1 + e2e/core/viewer/viewer-share-content.ts | 1 + e2e/insights/analytics-component.e2e.ts | 1 + .../attach-file-content-service.e2e.ts | 20 +- .../comment-component-tasks.e2e.ts | 16 +- .../custom-process-filters-sorting.e2e.ts | 31 +-- e2e/process-services/info-drawer.e2e.ts | 2 +- .../pages/process-services.page.ts | 12 +- .../pages/task-details.page.ts | 2 +- e2e/process-services/standalone-task.e2e.ts | 2 + .../start-process-component.e2e.ts | 1 + e2e/process-services/task-details-form.e2e.ts | 2 + .../widgets/amount-widget.e2e.ts | 2 + .../widgets/attach-folder-widget.e2e.ts | 9 +- .../widgets/checkbox-widget.e2e.ts | 5 +- .../widgets/date-time-widget.e2e.ts | 9 +- .../widgets/date-widget.e2e.ts | 8 +- .../widgets/document-template-widget.e2e.ts | 9 +- .../widgets/dropdown-widget.e2e.ts | 9 +- .../widgets/dynamic-table-widget.e2e.ts | 18 +- .../widgets/header-widget.e2e.ts | 9 +- .../widgets/hyperlink-widget.e2e.ts | 9 +- .../widgets/multi-line-widget.e2e.ts | 9 +- .../widgets/number-widget.e2e.ts | 9 +- .../widgets/people-widget.e2e.ts | 9 +- .../widgets/radio-buttons-widget.e2e.ts | 9 +- .../widgets/text-widget.e2e.ts | 14 +- .../widget-visibility-condition.e2e.ts | 30 +-- e2e/protractor.conf.js | 9 +- .../components/search-sorting-picker.e2e.ts | 2 +- e2e/search/search-multiselect.e2e.ts | 3 + lib/cli/scripts/docker-publish.ts | 2 +- .../lib/search/base-query-builder.service.ts | 9 +- .../search-header-query-builder.service.ts | 15 +- .../models/card-view-baseitem.model.ts | 1 + .../services/card-view-update.service.ts | 4 +- .../widgets/core/form-field.model.ts | 2 +- .../components/user-info.component.html | 33 ++- .../components/user-info.component.ts | 5 + .../components/task-details.component.ts | 2 +- .../components/task-header.component.ts | 52 +++-- lib/testing/src/lib/core/actions/api.util.ts | 8 - lib/testing/src/lib/core/pages/login.page.ts | 2 +- .../src/lib/core/utils/browser-actions.ts | 2 +- lib/testing/src/lib/core/utils/public-api.ts | 1 + .../src/lib/core/utils/wait-actions.ts | 70 +++++++ package-lock.json | 190 ++++++++---------- package.json | 6 +- scripts/ci/check-env/check-external-cs-env.sh | 9 + scripts/travis/e2e/content-services-e2e.sh | 2 +- 72 files changed, 649 insertions(+), 442 deletions(-) create mode 100644 lib/testing/src/lib/core/utils/wait-actions.ts create mode 100755 scripts/ci/check-env/check-external-cs-env.sh diff --git a/.travis.yml b/.travis.yml index 512a7be85d..b1bc721d93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ env: - REDIRECT_URI=/ - REDIRECT_URI_LOGOUT=/logout/ - BROWSER_RUN=true - - MAXINSTANCES=3 + - MAXINSTANCES=2 branches: only: @@ -121,6 +121,7 @@ jobs: before_script: - ./scripts/ci/job_hooks/before_e2e.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1 + - ./scripts/ci/check-env/check-external-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/process-services-e2e.sh after_script: ./scripts/ci/job_hooks/after_e2e.sh diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index d1beefeda1..26de275cf1 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -155,7 +155,7 @@ { "key": "score", "label": "Relevance", - "type": "FIELD", + "type": "SCORE", "field": "score", "ascending": false } diff --git a/e2e/content-services/comments/comment-component.e2e.ts b/e2e/content-services/comments/comment-component.e2e.ts index 68c57c822c..fb23dea9ad 100644 --- a/e2e/content-services/comments/comment-component.e2e.ts +++ b/e2e/content-services/comments/comment-component.e2e.ts @@ -188,6 +188,7 @@ describe('Comment', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id); await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true }); }); diff --git a/e2e/content-services/directives/create-library-directive.e2e.ts b/e2e/content-services/directives/create-library-directive.e2e.ts index 9dd316bede..2948628f14 100644 --- a/e2e/content-services/directives/create-library-directive.e2e.ts +++ b/e2e/content-services/directives/create-library-directive.e2e.ts @@ -54,8 +54,9 @@ describe('Create library directive', () => { }); afterAll(async () => { - await navigationBarPage.clickLogoutButton(); + await apiService.loginWithProfile('admin'); await apiService.getInstance().core.sitesApi.deleteSite(createSite.entry.id, { permanent: true }); + await navigationBarPage.clickLogoutButton(); }); beforeEach(async () => { diff --git a/e2e/content-services/directives/restore-content-directive.e2e.ts b/e2e/content-services/directives/restore-content-directive.e2e.ts index e82619270f..7976d5d085 100644 --- a/e2e/content-services/directives/restore-content-directive.e2e.ts +++ b/e2e/content-services/directives/restore-content-directive.e2e.ts @@ -16,8 +16,8 @@ */ import { ContentServicesPage } from '../../core/pages/content-services.page'; - import { browser } from 'protractor'; +import { NodeEntry } from '@alfresco/js-api'; import { FileModel } from '../../models/ACS/file.model'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import { TrashcanPage } from '../../core/pages/trashcan.page'; @@ -29,7 +29,8 @@ import { StringUtil, UploadActions, UserModel, - UsersActions + UsersActions, + WaitActions } from '@alfresco/adf-testing'; describe('Restore content directive', () => { @@ -42,8 +43,10 @@ describe('Restore content directive', () => { const trashcanPage = new TrashcanPage(); const breadCrumbPage = new BreadcrumbPage(); const notificationHistoryPage = new NotificationHistoryPage(); + const apiService = new ApiService(); const usersActions = new UsersActions(apiService); + const waitActions = new WaitActions(apiService); const pdfFileModel = new FileModel({ name: browser.params.resources.Files.ADF_DOCUMENTS.PDF.file_name, @@ -60,7 +63,7 @@ describe('Restore content directive', () => { location: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_path }); - const folderName = StringUtil.generateRandomString(5); + let testFolder: NodeEntry; const uploadActions = new UploadActions(apiService); let folderWithContent, folderWithFolder, subFolder, subFile, testFile, restoreFile, publicSite, siteFolder, @@ -72,7 +75,7 @@ describe('Restore content directive', () => { await usersActions.createUser(anotherAcsUser); await apiService.login(acsUser.username, acsUser.password); - await uploadActions.createFolder(folderName, '-my-'); + testFolder = await uploadActions.createFolder(StringUtil.generateRandomString(5), '-my-'); folderWithContent = await uploadActions.createFolder(StringUtil.generateRandomString(5), '-my-'); subFile = await uploadActions.uploadFile(testFileModel.location, testFileModel.name, folderWithContent.entry.id); testFile = await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, '-my-'); @@ -93,12 +96,12 @@ describe('Restore content directive', () => { await loginPage.login(acsUser.username, acsUser.password); await navigationBarPage.navigateToContentServices(); await contentServicesPage.waitForTableBody(); - await contentServicesPage.checkContentIsDisplayed(folderName); - await contentServicesPage.deleteContent(folderName); - await contentServicesPage.checkContentIsNotDisplayed(folderName); + await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name); + await contentServicesPage.deleteContent(testFolder.entry.name); + await contentServicesPage.checkContentIsNotDisplayed(testFolder.entry.name); await navigationBarPage.clickTrashcanButton(); await trashcanPage.waitForTableBody(); - await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(folderName); + await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(testFolder.entry.name); }); afterEach(async () => { @@ -106,26 +109,26 @@ describe('Restore content directive', () => { }); it('[C260227] Should validate when restoring Folders with same name', async () => { - await uploadActions.createFolder(folderName, '-my-'); + await uploadActions.createFolder(testFolder.entry.name, '-my-'); await navigationBarPage.navigateToContentServices(); await contentServicesPage.waitForTableBody(); - await contentServicesPage.checkContentIsDisplayed(folderName); - await contentServicesPage.deleteContent(folderName); - await contentServicesPage.checkContentIsNotDisplayed(folderName); + await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name); + await contentServicesPage.deleteContent(testFolder.entry.name); + await contentServicesPage.checkContentIsNotDisplayed(testFolder.entry.name); await navigationBarPage.clickTrashcanButton(); await trashcanPage.waitForTableBody(); - await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(folderName); + await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(testFolder.entry.name); await trashcanPage.getDocumentList().dataTablePage().checkAllRows(); await trashcanPage.clickRestore(); - await browser.sleep(1000); + await waitActions.nodeIsPresent(testFolder.entry.id); await navigationBarPage.navigateToContentServices(); await contentServicesPage.getDocumentList().dataTablePage().waitTillContentLoaded(); - await contentServicesPage.checkContentIsDisplayed(folderName); + await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name); - await notificationHistoryPage.checkNotifyContains('Can\'t restore, ' + folderName + ' item already exists'); + await notificationHistoryPage.checkNotifyContains('Can\'t restore, ' + testFolder.entry.name + ' item already exists'); }); }); @@ -222,26 +225,26 @@ describe('Restore content directive', () => { }); it('[C260241] Should display restore icon both for file and folder', async () => { - await contentServicesPage.checkContentIsDisplayed(folderName); + await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name); await contentServicesPage.checkContentIsDisplayed(restoreFile.entry.name); - await contentServicesPage.deleteContent(folderName); + await contentServicesPage.deleteContent(testFolder.entry.name); await contentServicesPage.deleteContent(restoreFile.entry.name); await navigationBarPage.clickTrashcanButton(); await trashcanPage.waitForTableBody(); await trashcanPage.checkRestoreButtonIsNotDisplayed(); - await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(folderName); - await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(folderName); + await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(testFolder.entry.name); + await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(testFolder.entry.name); await trashcanPage.checkRestoreButtonIsDisplayed(); - await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(folderName); - await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsNotSelected(folderName); + await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(testFolder.entry.name); + await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsNotSelected(testFolder.entry.name); await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(restoreFile.entry.name); await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(restoreFile.entry.name); await trashcanPage.checkRestoreButtonIsDisplayed(); - await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(folderName); - await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(folderName); + await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(testFolder.entry.name); + await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(testFolder.entry.name); await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(restoreFile.entry.name); await trashcanPage.checkRestoreButtonIsDisplayed(); }); @@ -285,10 +288,11 @@ describe('Restore content directive', () => { await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(publicSite.entry.id); await trashcanPage.clickRestore(); - await browser.sleep(browser.params.testConfig.timeouts.index_search); + await waitActions.nodeIsPresent(publicSite.entry.guid); await navigationBarPage.goToSite(publicSite); await contentServicesPage.waitForTableBody(); + await contentServicesPage.checkContentIsDisplayed(siteFolder.entry.name); await contentServicesPage.openFolder(siteFolder.entry.name); await contentServicesPage.checkContentIsDisplayed(siteFile.entry.name); @@ -301,7 +305,7 @@ describe('Restore content directive', () => { beforeAll(async () => { await apiService.login(anotherAcsUser.username, anotherAcsUser.password); - await uploadActions.createFolder(folderName, '-my-'); + await uploadActions.createFolder(testFolder.entry.name, '-my-'); parentFolder = await uploadActions.createFolder(StringUtil.generateRandomString(5), '-my-'); folderWithin = await uploadActions.createFolder(StringUtil.generateRandomString(5), parentFolder.entry.id); pdfFile = await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, folderWithin.entry.id); @@ -356,4 +360,5 @@ describe('Restore content directive', () => { await contentServicesPage.checkContentIsDisplayed(pngFile.entry.name); }); }); + }); diff --git a/e2e/content-services/document-list/document-list-component.e2e.ts b/e2e/content-services/document-list/document-list-component.e2e.ts index e8d9a2aa86..f95c42b996 100644 --- a/e2e/content-services/document-list/document-list-component.e2e.ts +++ b/e2e/content-services/document-list/document-list-component.e2e.ts @@ -338,6 +338,7 @@ describe('Document List Component', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); for (let i = 0; i < folderCreated.length; i++) { await uploadActions.deleteFileOrFolder(folderCreated[i].entry.id); } diff --git a/e2e/content-services/document-list/document-list-permissions.e2e.ts b/e2e/content-services/document-list/document-list-permissions.e2e.ts index f09513a64e..fe528d79fb 100644 --- a/e2e/content-services/document-list/document-list-permissions.e2e.ts +++ b/e2e/content-services/document-list/document-list-permissions.e2e.ts @@ -47,6 +47,7 @@ describe('Document List Component', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await navigationBarPage.clickLogoutButton(); await apiService.getInstance().core.sitesApi.deleteSite(privateSite.entry.id, { permanent: true }); }); diff --git a/e2e/content-services/lock-file.e2e.ts b/e2e/content-services/lock-file.e2e.ts index e5883b2ad1..27927fb562 100644 --- a/e2e/content-services/lock-file.e2e.ts +++ b/e2e/content-services/lock-file.e2e.ts @@ -15,12 +15,21 @@ * limitations under the License. */ -import { ApiService, LoginPage, StringUtil, UploadActions, UserModel, UsersActions } from '@alfresco/adf-testing'; +import { + ApiService, + LoginPage, + StringUtil, + UploadActions, + UserModel, + UsersActions, + WaitActions +} from '@alfresco/adf-testing'; import { NavigationBarPage } from '../core/pages/navigation-bar.page'; import { ContentServicesPage } from '../core/pages/content-services.page'; import { LockFilePage } from '../content-services/pages/lock-file.page'; import { FileModel } from '../models/ACS/file.model'; import { browser } from 'protractor'; +import { NodeEntry } from '@alfresco/js-api'; import CONSTANTS = require('../util/constants'); describe('Lock File', () => { @@ -29,12 +38,13 @@ describe('Lock File', () => { const navigationBarPage = new NavigationBarPage(); const lockFilePage = new LockFilePage(); const contentServices = new ContentServicesPage(); + const adminUser = new UserModel(); const managerUser = new UserModel(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); - const uploadActions = new UploadActions(apiService); + const waitActions = new WaitActions(apiService); const pngFileModel = new FileModel({ name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name, @@ -46,7 +56,7 @@ describe('Lock File', () => { location: browser.params.resources.Files.ADF_DOCUMENTS.PNG_B.file_path }); - let nodeId, site, documentLibrary, lockedFileNodeId; + let site, documentLibrary; beforeAll(async () => { await apiService.loginWithProfile('admin'); @@ -72,35 +82,54 @@ describe('Lock File', () => { }); afterAll(async () => { - await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true }); + await apiService.loginWithProfile('admin'); + try { + + await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true }); + } catch (e) { + } }); describe('Lock file interaction with the UI', () => { + + let pngLockedUploadedFile: NodeEntry; + let pngUploadedFile: NodeEntry; + beforeAll(async () => { - const pngLockedUploadedFile = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary); + pngLockedUploadedFile = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary); - lockedFileNodeId = pngLockedUploadedFile.entry.id; - }); - - beforeEach(async () => { - const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary); - nodeId = pngUploadedFile.entry.id; await loginPage.login(adminUser.username, adminUser.password); - await navigationBarPage.openContentServicesFolder(documentLibrary); + pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary); + + await navigationBarPage.openContentServicesFolder(documentLibrary); await contentServices.waitForTableBody(); }); afterEach(async () => { await apiService.login(adminUser.username, adminUser.password); - await uploadActions.deleteFileOrFolder(nodeId); - await navigationBarPage.clickLogoutButton(); + try { + await apiService.getInstance().core.nodesApi.unlockNode(pngUploadedFile.entry.id); + await waitActions.nodeIsUnlock(pngUploadedFile.entry.id); + } catch (e) { + } }); afterAll(async () => { - await apiService.login(adminUser.username, adminUser.password); - await apiService.getInstance().core.nodesApi.unlockNode(lockedFileNodeId); - await uploadActions.deleteFileOrFolder(lockedFileNodeId); + await apiService.loginWithProfile('admin'); + try { + await apiService.getInstance().core.nodesApi.unlockNode(pngLockedUploadedFile.entry.id); + } catch (e) { + } + try { + await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id); + } catch (e) { + } + try { + await uploadActions.deleteFileOrFolder(pngLockedUploadedFile.entry.id); + } catch (e) { + } + await navigationBarPage.clickLogoutButton(); }); it('[C286604] Should be able to open Lock file option by clicking the lock image', async () => { @@ -113,7 +142,6 @@ describe('Lock File', () => { it('[C286625] Should be able to click Cancel to cancel lock file operation', async () => { await contentServices.lockContent(pngFileModel.name); - await lockFilePage.lockFileCheckboxText.waitVisible(); await lockFilePage.cancelButton.click(); @@ -149,11 +177,11 @@ describe('Lock File', () => { describe('Locked file without owner permissions', () => { + let pngUploadedFile: NodeEntry; + beforeEach(async () => { await apiService.login(adminUser.username, adminUser.password); - const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary); - - nodeId = pngUploadedFile.entry.id; + pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary); await loginPage.login(managerUser.username, managerUser.password); @@ -164,8 +192,8 @@ describe('Lock File', () => { await apiService.login(adminUser.username, adminUser.password); try { - await apiService.getInstance().core.nodesApi.unlockNode(nodeId); - await uploadActions.deleteFileOrFolder(nodeId); + await apiService.getInstance().core.nodesApi.unlockNode(pngUploadedFile.entry.id); + await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id); } catch (error) { } await navigationBarPage.clickLogoutButton(); @@ -179,7 +207,7 @@ describe('Lock File', () => { await lockFilePage.saveButton.click(); try { - await apiService.getInstance().core.nodesApi.deleteNode(nodeId); + await apiService.getInstance().core.nodesApi.deleteNode(pngUploadedFile.entry.id); } catch (error) { await expect(error.status).toEqual(409); } @@ -193,7 +221,7 @@ describe('Lock File', () => { await lockFilePage.saveButton.click(); try { - await apiService.getInstance().core.nodesApi.updateNode(nodeId, { name: 'My new name' }); + await apiService.getInstance().core.nodesApi.updateNode(pngUploadedFile.entry.id, { name: 'My new name' }); } catch (error) { await expect(error.status).toEqual(409); @@ -208,7 +236,7 @@ describe('Lock File', () => { await lockFilePage.saveButton.click(); try { - await apiService.getInstance().core.nodesApi.moveNode(nodeId, { targetParentId: '-my-' }); + await apiService.getInstance().core.nodesApi.moveNode(pngUploadedFile.entry.id, { targetParentId: '-my-' }); } catch (error) { await expect(error.status).toEqual(409); @@ -223,8 +251,7 @@ describe('Lock File', () => { await lockFilePage.saveButton.click(); try { - await apiService.getInstance().core.nodesApi.updateNodeContent(nodeId, 'NEW FILE CONTENT'); - + await apiService.getInstance().core.nodesApi.updateNodeContent(pngUploadedFile.entry.id, 'NEW FILE CONTENT'); } catch (error) { await expect(error.status).toEqual(409); } @@ -232,39 +259,26 @@ describe('Lock File', () => { }); describe('Locked file with owner permissions', () => { - let pngFileToBeLocked; - - beforeAll(async () => { - pngFileToBeLocked = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary); - lockedFileNodeId = pngFileToBeLocked.entry.id; - }); + let pngFileToBeLocked: NodeEntry; + let pngUploadedFile: NodeEntry; beforeEach(async () => { - const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary); - nodeId = pngUploadedFile.entry.id; + await apiService.login(adminUser.username, adminUser.password); + pngFileToBeLocked = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary); + pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary); await loginPage.login(adminUser.username, adminUser.password); await navigationBarPage.openContentServicesFolder(documentLibrary); + await contentServices.getDocumentList().dataTable.waitTillContentLoaded(); }); afterEach(async () => { await apiService.login(adminUser.username, adminUser.password); - await uploadActions.deleteFileOrFolder(nodeId); - await navigationBarPage.clickLogoutButton(); - }); - - it('[C286614] Owner of the locked file should be able to rename if Allow owner to modify is checked', async () => { - await contentServices.lockContent(pngFileModel.name); - - await lockFilePage.lockFileCheckboxText.waitVisible(); - await lockFilePage.lockFileCheckbox.click(); - await lockFilePage.allowOwnerCheckbox.click(); - await lockFilePage.saveButton.click(); - try { - const response = await apiService.getInstance().core.nodesApi.updateNode(nodeId, { name: 'My new name' }); - await expect(response.entry.name).toEqual('My new name'); - } catch (error) { + await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id); + await uploadActions.deleteFileOrFolder(pngFileToBeLocked.entry.id); + } catch (e) { } + await navigationBarPage.clickLogoutButton(); }); it('[C286615] Owner of the locked file should be able to update a new version if Allow owner to modify is checked', async () => { @@ -276,7 +290,9 @@ describe('Lock File', () => { await lockFilePage.saveButton.click(); try { - const response = await apiService.getInstance().core.nodesApi.updateNodeContent(nodeId, 'NEW FILE CONTENT'); + await apiService.login(adminUser.username, adminUser.password); + + const response = await apiService.getInstance().core.nodesApi.updateNodeContent(pngUploadedFile.entry.id, 'NEW FILE CONTENT'); await expect(response.entry.modifiedAt.getTime()).toBeGreaterThan(response.entry.createdAt.getTime()); } catch (error) { } @@ -291,9 +307,10 @@ describe('Lock File', () => { await lockFilePage.saveButton.click(); try { - await apiService.getInstance().core.nodesApi.moveNode(nodeId, { targetParentId: '-my-' }); + await apiService.login(adminUser.username, adminUser.password); + await apiService.getInstance().core.nodesApi.moveNode(pngUploadedFile.entry.id, { targetParentId: '-my-' }); - const movedFile = await apiService.getInstance().core.nodesApi.getNode(nodeId); + const movedFile = await apiService.getInstance().core.nodesApi.getNode(pngUploadedFile.entry.id); await expect(movedFile.entry.parentId).not.toEqual(documentLibrary); } catch (error) { @@ -311,5 +328,20 @@ describe('Lock File', () => { await contentServices.deleteContent(pngFileToBeLocked.entry.name); await contentServices.checkContentIsNotDisplayed(pngFileToBeLocked.entry.name); }); + + it('[C286614] Owner of the locked file should be able to rename if Allow owner to modify is checked', async () => { + await contentServices.lockContent(pngFileModel.name); + + await lockFilePage.lockFileCheckboxText.waitVisible(); + await lockFilePage.lockFileCheckbox.click(); + await lockFilePage.allowOwnerCheckbox.click(); + await lockFilePage.saveButton.click(); + + try { + const response = await apiService.getInstance().core.nodesApi.updateNode(pngUploadedFile.entry.id, { name: 'My new name' }); + await expect(response.entry.name).toEqual('My new name'); + } catch (error) { + } + }); }); }); diff --git a/e2e/content-services/metadata/metadata-permissions.e2e.ts b/e2e/content-services/metadata/metadata-permissions.e2e.ts index ec946cf510..ccf146ca1e 100644 --- a/e2e/content-services/metadata/metadata-permissions.e2e.ts +++ b/e2e/content-services/metadata/metadata-permissions.e2e.ts @@ -95,6 +95,7 @@ describe('permissions', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true }); }); diff --git a/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts b/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts index 41f696eb7c..834bd27730 100644 --- a/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts +++ b/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts @@ -228,9 +228,10 @@ describe('Metadata component', () => { describe('Folder metadata', () => { beforeAll(async () => { - await uploadActions.createFolder(folderName, '-my-'); - + await apiService.login(acsUser.username, acsUser.password); await loginPage.login(acsUser.username, acsUser.password); + + await uploadActions.createFolder(folderName, '-my-'); await navigationBarPage.navigateToContentServices(); await contentServicesPage.waitForTableBody(); }); diff --git a/e2e/content-services/pages/tag.page.ts b/e2e/content-services/pages/tag.page.ts index 0f7e2808a9..fdbd1dd0b4 100644 --- a/e2e/content-services/pages/tag.page.ts +++ b/e2e/content-services/pages/tag.page.ts @@ -65,12 +65,28 @@ export class TagPage { return this.addTagButton.isEnabled(); } - checkTagIsDisplayedInTagList(tagName: string): Promise { - return TestElement.byText('div[id*="tag_name"]', tagName).waitVisible(); + async checkTagIsDisplayedInTagList(tagName: string): Promise { + try { + await TestElement.byText('div[id*="tag_name"]', tagName).waitVisible(); + return true; + } catch (error) { + if (await this.showMoreButton.isDisplayed()) { + await this.showMoreButton.click(); + await this.checkTagIsDisplayedInTagList(tagName); + return true; + } else { + throw new Error('Error'); + } + } } - checkTagIsNotDisplayedInTagList(tagName: string): Promise { - return TestElement.byText('div[id*="tag_name"]', tagName).waitNotVisible(); + async checkTagIsNotDisplayedInTagList(tagName: string): Promise { + try { + await TestElement.byText('div[id*="tag_name"]', tagName).waitNotVisible(); + return true; + } catch (error) { + return false; + } } checkTagIsNotDisplayedInTagListByNodeId(tagName: string): Promise { diff --git a/e2e/content-services/permissions/site-permissions.e2e.ts b/e2e/content-services/permissions/site-permissions.e2e.ts index 16e7fb4ac7..5571458d55 100644 --- a/e2e/content-services/permissions/site-permissions.e2e.ts +++ b/e2e/content-services/permissions/site-permissions.e2e.ts @@ -95,7 +95,7 @@ describe('Permissions Component', () => { await usersActions.createUser(managerUser); await apiService.login(folderOwnerUser.username, folderOwnerUser.password); - await browser.sleep(15000); + await browser.sleep(browser.params.testConfig.timeouts.index_search); const publicSiteName = `PUBLIC_TEST_SITE_${StringUtil.generateRandomString(5)}`; diff --git a/e2e/content-services/share-file/share-file.e2e.ts b/e2e/content-services/share-file/share-file.e2e.ts index bfc0e85cb3..b3a580787d 100644 --- a/e2e/content-services/share-file/share-file.e2e.ts +++ b/e2e/content-services/share-file/share-file.e2e.ts @@ -174,6 +174,7 @@ describe('Share file', () => { }); afterEach(async () => { + await BrowserActions.getUrl('/'); await navigationBarPage.clickLogoutButton(); }); diff --git a/e2e/content-services/share-file/unshare-file.e2e.ts b/e2e/content-services/share-file/unshare-file.e2e.ts index d3d417a76e..28176ba347 100644 --- a/e2e/content-services/share-file/unshare-file.e2e.ts +++ b/e2e/content-services/share-file/unshare-file.e2e.ts @@ -27,6 +27,7 @@ import { UserModel, UsersActions } from '@alfresco/adf-testing'; +import { NodeEntry } from '@alfresco/js-api'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import { ContentServicesPage } from '../../core/pages/content-services.page'; import { ShareDialogPage } from '../../core/pages/dialog/share-dialog.page'; @@ -35,23 +36,23 @@ import { browser } from 'protractor'; describe('Unshare file', () => { - const apiService = new ApiService(); const loginPage = new LoginPage(); const contentServicesPage = new ContentServicesPage(); - const contentListPage = contentServicesPage.getDocumentList(); const navBar = new NavigationBarPage(); const errorPage = new ErrorPage(); const notificationHistoryPage = new NotificationHistoryPage(); const navigationBarPage = new NavigationBarPage(); const shareDialog = new ShareDialogPage(); + const apiService = new ApiService(); const uploadActions = new UploadActions(apiService); const usersActions = new UsersActions(apiService); const siteName = `PRIVATE-TEST-SITE-${StringUtil.generateRandomString(5)}`; let acsUser: UserModel; - let nodeBody, nodeId, testSite; + let nodeBody, shareFilesSite; + let pngUploadedFile: NodeEntry; const pngFileModel = new FileModel({ name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name, @@ -76,7 +77,7 @@ describe('Unshare file', () => { } }; - testSite = await apiService.getInstance().core.sitesApi.createSite(site); + shareFilesSite = await apiService.getInstance().core.sitesApi.createSite(site); const docLibId = (await apiService.getInstance().core.sitesApi.getSiteContainers(siteName)).list.entries[0].entry.id; const testFile1Id = (await apiService.getInstance().core.nodesApi.addNode(docLibId, nodeBody)).entry.id; @@ -97,38 +98,33 @@ describe('Unshare file', () => { } }); await apiService.getInstance().core.sharedlinksApi.addSharedLink({ nodeId: testFile1Id }); - await apiService.login(acsUser.username, acsUser.password); - - const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, '-my-'); - nodeId = pngUploadedFile.entry.id; - - await loginPage.login(acsUser.username, acsUser.password); - await navBar.navigateToContentServices(); - await contentServicesPage.waitForTableBody(); }); afterAll(async () => { await navigationBarPage.clickLogoutButton(); - await apiService.getInstance().core.sitesApi.deleteSite(testSite.entry.id, { permanent: true }); + await apiService.getInstance().core.sitesApi.deleteSite(shareFilesSite.entry.id, { permanent: true }); }); describe('with permission', () => { - afterAll(async () => { + + afterEach(async () => { await apiService.loginWithProfile('admin'); - await uploadActions.deleteFileOrFolder(nodeId); + await navigationBarPage.clickLogoutButton(); + await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id); }); - it('[C286550] Should display unshare confirmation dialog', async () => { - await contentListPage.selectRow(pngFileModel.name); - await contentServicesPage.clickShareButton(); - await shareDialog.checkDialogIsDisplayed(); - await browser.sleep(2000); - await shareDialog.clickUnShareFile(); - await shareDialog.confirmationDialogIsDisplayed(); + beforeEach(async () => { + await apiService.login(acsUser.username, acsUser.password); + + pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, '-my-'); + + await loginPage.login(acsUser.username, acsUser.password); + await navBar.navigateToContentServices(); + await contentServicesPage.waitForTableBody(); }); it('[C286551] Should be able to cancel unshare action', async () => { - await contentListPage.selectRow(pngFileModel.name); + await contentServicesPage.getDocumentList().selectRow(pngFileModel.name); await contentServicesPage.clickShareButton(); await shareDialog.checkDialogIsDisplayed(); await shareDialog.clickUnShareFile(); @@ -137,8 +133,17 @@ describe('Unshare file', () => { await shareDialog.shareToggleButtonIsChecked(); }); + it('[C286550] Should display unshare confirmation dialog', async () => { + await contentServicesPage.getDocumentList().selectRow(pngFileModel.name); + await contentServicesPage.clickShareButton(); + await shareDialog.checkDialogIsDisplayed(); + await browser.sleep(2000); + await shareDialog.clickUnShareFile(); + await shareDialog.confirmationDialogIsDisplayed(); + }); + it('[C286552] Should be able to confirm unshare action', async () => { - await contentListPage.selectRow(pngFileModel.name); + await contentServicesPage.getDocumentList().selectRow(pngFileModel.name); await contentServicesPage.clickShareButton(); await shareDialog.checkDialogIsDisplayed(); await shareDialog.clickUnShareFile(); @@ -148,7 +153,7 @@ describe('Unshare file', () => { }); it('[C280556] Should redirect to 404 when trying to access an unshared file', async () => { - await contentListPage.selectRow(pngFileModel.name); + await contentServicesPage.getDocumentList().selectRow(pngFileModel.name); await contentServicesPage.clickShareButton(); await shareDialog.checkDialogIsDisplayed(); await browser.sleep(2000); @@ -165,15 +170,14 @@ describe('Unshare file', () => { describe('without permission', () => { - afterAll(async () => { - await apiService.loginWithProfile('admin'); - await apiService.getInstance().core.sitesApi.deleteSite(siteName, { permanent: true }); + beforeEach(async () => { + await loginPage.login(acsUser.username, acsUser.password); }); it('[C286555] Should NOT be able to unshare file without permission', async () => { - await navBar.goToSite(testSite); + await navBar.goToSite(shareFilesSite); await contentServicesPage.openFolder('documentLibrary'); - await contentListPage.selectRow(nodeBody.name); + await contentServicesPage.getDocumentList().selectRow(nodeBody.name); await contentServicesPage.clickShareButton(); await shareDialog.checkDialogIsDisplayed(); diff --git a/e2e/content-services/social/social.component.e2e.ts b/e2e/content-services/social/social.component.e2e.ts index dd9d3afcab..27746168cb 100644 --- a/e2e/content-services/social/social.component.e2e.ts +++ b/e2e/content-services/social/social.component.e2e.ts @@ -128,21 +128,6 @@ describe('Social component', () => { await navigationBarPage.clickLogoutButton(); }); - it('[C260324] Should be able to like and unlike a component', async () => { - await socialPage.writeCustomNodeId(emptyFile.entry.id); - await expect(await socialPage.getNodeIdFieldValue()).toEqual(emptyFile.entry.id); - await likePage.checkLikeCounter(0); - await expect(await likePage.getUnLikedIconColor()).toBe(greyLikeColor); - await likePage.clickLike(); - await likePage.checkLikeCounter(1); - await likePage.removeHoverFromLikeButton(); - await expect(await likePage.getLikedIconColor()).toBe(blueLikeColor); - await likePage.clickUnlike(); - await likePage.checkLikeCounter(0); - await likePage.removeHoverFromLikeButton(); - await expect(await likePage.getUnLikedIconColor()).toBe(greyLikeColor); - }); - it('[C310198] Should be able to rate and unRate a component', async () => { await socialPage.writeCustomNodeId(emptyFile.entry.id); await expect(await socialPage.getNodeIdFieldValue()).toEqual(emptyFile.entry.id); diff --git a/e2e/content-services/sso/sso-download-directive-component.e2e.ts b/e2e/content-services/sso/sso-download-directive-component.e2e.ts index 548deab32f..5db1ea07bc 100644 --- a/e2e/content-services/sso/sso-download-directive-component.e2e.ts +++ b/e2e/content-services/sso/sso-download-directive-component.e2e.ts @@ -58,42 +58,43 @@ describe('SSO in ADF using ACS and AIS, Download Directive, Viewer, DocumentList let pdfUploadedFile, pngUploadedFile, folder, acsUser; const folderName = StringUtil.generateRandomString(5); + beforeAll(async () => { + await apiService.login(browser.params.testConfig.users.admin.username, browser.params.testConfig.users.admin.password); + + acsUser = await usersActions.createUser(); + + await apiService.login(acsUser.username, acsUser.password); + + folder = await uploadActions.createFolder(folderName, '-my-'); + + pdfUploadedFile = await uploadActions.uploadFile(firstPdfFileModel.location, firstPdfFileModel.name, folder.entry.id); + pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, folder.entry.id); + + await settingsPage.setProviderEcmSso(browser.params.testConfig.appConfig.ecmHost, + browser.params.testConfig.appConfig.oauth2.host, + browser.params.testConfig.appConfig.identityHost, false, true, browser.params.testConfig.appConfig.oauth2.clientId); + + await loginSsoPage.loginSSOIdentityService(acsUser.username, acsUser.password); + + await navigationBarPage.navigateToContentServices(); + await contentServicesPage.checkAcsContainer(); + await contentServicesPage.openFolder(folderName); + await contentListPage.waitForTableBody(); + }); + + afterAll(async () => { + try { + await apiService.loginWithProfile('admin'); + await uploadActions.deleteFileOrFolder(folder.entry.id); + await identityService.deleteIdentityUser(acsUser.email); + } catch (error) { + } + await apiService.getInstance().logout(); + await browser.executeScript('window.sessionStorage.clear();'); + await browser.executeScript('window.localStorage.clear();'); + }); + describe('SSO in ADF using ACS and AIS, implicit flow set', () => { - beforeAll(async () => { - await apiService.login(browser.params.testConfig.users.admin.username, browser.params.testConfig.users.admin.password); - - acsUser = await usersActions.createUser(); - - await apiService.login(acsUser.username, acsUser.password); - - folder = await uploadActions.createFolder(folderName, '-my-'); - - pdfUploadedFile = await uploadActions.uploadFile(firstPdfFileModel.location, firstPdfFileModel.name, folder.entry.id); - pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, folder.entry.id); - - await settingsPage.setProviderEcmSso(browser.params.testConfig.appConfig.ecmHost, - browser.params.testConfig.appConfig.oauth2.host, - browser.params.testConfig.appConfig.identityHost, false, true, browser.params.testConfig.appConfig.oauth2.clientId); - - await loginSsoPage.loginSSOIdentityService(acsUser.username, acsUser.password); - - await navigationBarPage.navigateToContentServices(); - await contentServicesPage.checkAcsContainer(); - await contentServicesPage.openFolder(folderName); - await contentListPage.waitForTableBody(); - }); - - afterAll(async () => { - try { - await apiService.loginWithProfile('admin'); - await uploadActions.deleteFileOrFolder(folder.entry.id); - await identityService.deleteIdentityUser(acsUser.email); - } catch (error) { - } - await apiService.getInstance().logout(); - await browser.executeScript('window.sessionStorage.clear();'); - await browser.executeScript('window.localStorage.clear();'); - }); afterEach(async () => { await browser.refresh(); diff --git a/e2e/content-services/upload/user-permission.e2e.ts b/e2e/content-services/upload/user-permission.e2e.ts index 2513b6c53d..dc07d52d6a 100644 --- a/e2e/content-services/upload/user-permission.e2e.ts +++ b/e2e/content-services/upload/user-permission.e2e.ts @@ -125,14 +125,13 @@ describe('Upload - User permission', () => { describe('full permissions', () => { beforeEach(async () => { + await apiService.loginWithProfile('admin'); await navigationBarPage.openContentServicesFolder(managerSite.entry.guid); - await contentServicesPage.goToDocumentList(); }); it('[C279917] Should be allowed to upload a file in a folder with manager permissions', async () => { await contentServicesPage.uploadFile(emptyFile.location); - await uploadDialog.fileIsUploaded(emptyFile.name); }); }); diff --git a/e2e/content-services/version/version-permissions.e2e.ts b/e2e/content-services/version/version-permissions.e2e.ts index 9a4a502c03..ab5d4168c6 100644 --- a/e2e/content-services/version/version-permissions.e2e.ts +++ b/e2e/content-services/version/version-permissions.e2e.ts @@ -144,6 +144,7 @@ describe('Version component permissions', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiService.getInstance().nodes.deleteNode(sameCreatorFile.id); await navigationBarPage.clickLogoutButton(); }); @@ -215,6 +216,7 @@ describe('Version component permissions', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiService.getInstance().nodes.deleteNode(sameCreatorFile.id); await navigationBarPage.clickLogoutButton(); }); @@ -269,6 +271,7 @@ describe('Version component permissions', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiService.getInstance().nodes.deleteNode(sameCreatorFile.id); await navigationBarPage.clickLogoutButton(); }); diff --git a/e2e/core/pages/content-services.page.ts b/e2e/core/pages/content-services.page.ts index d497d874c4..ca237681e9 100644 --- a/e2e/core/pages/content-services.page.ts +++ b/e2e/core/pages/content-services.page.ts @@ -640,10 +640,6 @@ export class ContentServicesPage { await this.siteListDropdown.checkOptionIsSelected(siteName); } - async selectSite(siteName: string): Promise { - await this.siteListDropdown.selectDropdownOption(siteName); - } - async clickDownloadButton(): Promise { await BrowserActions.closeMenuAndDialogs(); await BrowserActions.click(this.downloadButton); diff --git a/e2e/core/viewer/file-extensions/viewer-component.e2e.ts b/e2e/core/viewer/file-extensions/viewer-component.e2e.ts index 228d823c5f..8eff189d50 100644 --- a/e2e/core/viewer/file-extensions/viewer-component.e2e.ts +++ b/e2e/core/viewer/file-extensions/viewer-component.e2e.ts @@ -112,6 +112,7 @@ describe('Viewer', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await uploadActions.deleteFileOrFolder(otherFolderUploaded.entry.id); }); diff --git a/e2e/core/viewer/viewer-content-services-component.e2e.ts b/e2e/core/viewer/viewer-content-services-component.e2e.ts index a577b8b898..53b22f3269 100644 --- a/e2e/core/viewer/viewer-content-services-component.e2e.ts +++ b/e2e/core/viewer/viewer-content-services-component.e2e.ts @@ -121,6 +121,7 @@ describe('Content Services Viewer', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await uploadActions.deleteFileOrFolder(pdfFile.getId()); await uploadActions.deleteFileOrFolder(protectedFile.getId()); await uploadActions.deleteFileOrFolder(docxFile.getId()); diff --git a/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts b/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts index 80781c1f1e..260c843f4e 100644 --- a/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts +++ b/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts @@ -59,6 +59,7 @@ describe('Viewer', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await uploadActions.deleteFileOrFolder(txtFileUploaded.entry.id); await navigationBarPage.clickLogoutButton(); }); diff --git a/e2e/core/viewer/viewer-properties.e2e.ts b/e2e/core/viewer/viewer-properties.e2e.ts index d5e44e3491..37ccc2ba1e 100644 --- a/e2e/core/viewer/viewer-properties.e2e.ts +++ b/e2e/core/viewer/viewer-properties.e2e.ts @@ -70,6 +70,7 @@ describe('Viewer', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await uploadActions.deleteFileOrFolder(pngFile.getId()); await navigationBarPage.clickLogoutButton(); }); diff --git a/e2e/core/viewer/viewer-share-content.ts b/e2e/core/viewer/viewer-share-content.ts index dabf12651d..fb50110376 100644 --- a/e2e/core/viewer/viewer-share-content.ts +++ b/e2e/core/viewer/viewer-share-content.ts @@ -87,6 +87,7 @@ describe('Viewer', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true }); await apiService.login(acsUser.username, acsUser.password); await uploadActions.deleteFileOrFolder(wordFileUploaded.entry.id); diff --git a/e2e/insights/analytics-component.e2e.ts b/e2e/insights/analytics-component.e2e.ts index e76cdac109..aa84da9c62 100644 --- a/e2e/insights/analytics-component.e2e.ts +++ b/e2e/insights/analytics-component.e2e.ts @@ -44,6 +44,7 @@ describe('Analytics Smoke Test', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiService.getInstance().activiti.adminTenantsApi.deleteTenant(procUserModel.tenantId); }); diff --git a/e2e/process-services/attach-file-content-service.e2e.ts b/e2e/process-services/attach-file-content-service.e2e.ts index c3e7ed9554..ee5246a454 100644 --- a/e2e/process-services/attach-file-content-service.e2e.ts +++ b/e2e/process-services/attach-file-content-service.e2e.ts @@ -144,25 +144,7 @@ describe('Attach File - Content service', () => { await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id); }); - it('[C299040] Should display the login screen right, when user has access to 2 alfresco repositiories', async () => { - const name = 'Attach file'; - await taskPage.createTask({ name, formName: app.UPLOAD_FILE_FORM_CS.formName }); - - await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id); - await widget.attachFileWidget().selectUploadSource(csIntegrations[1]); - - await externalNodeSelector.waitForLogInDialog(); - await expect(await externalNodeSelector.getTitle()).toEqual(`Sign into '${browser.params.testConfig.adf_external_acs.host}'`); - await externalNodeSelector.login(user.username, user.password); - - await externalNodeSelector.checkDialogIsDisplayed(); - await searchService.isSearchable(externalFile); - await externalNodeSelector.searchAndSelectResult(externalFile, externalFile); - await externalNodeSelector.clickMoveCopyButton(); - await widget.attachFileWidget().checkFileIsAttached(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, externalFile); - }); - - it('[C286516] Able to upload a file when user has more than two alfresco repositories', async () => { + it('[C286516][C299040] Able to upload a file when user has more than two alfresco repositories', async () => { const name = 'Attach file - multiple repo'; await taskPage.createTask({ name, formName: app.UPLOAD_FILE_FORM_CS.formName }); diff --git a/e2e/process-services/comment-component-tasks.e2e.ts b/e2e/process-services/comment-component-tasks.e2e.ts index a1a754793d..e0112c1095 100644 --- a/e2e/process-services/comment-component-tasks.e2e.ts +++ b/e2e/process-services/comment-component-tasks.e2e.ts @@ -37,7 +37,7 @@ describe('Comment component for Processes', () => { const apiService = new ApiService(); const usersActions = new UsersActions(apiService); - let user, appId, secondUser, newTaskId; + let user, appId, secondUser; const taskName = { completed_task: 'Test Completed', @@ -82,15 +82,13 @@ describe('Comment component for Processes', () => { it('[C212864] Should be able to add multiple comments on a single task using different users', async () => { const newTask = await apiService.getInstance().activiti.taskApi.createNewTask(new TaskRepresentation({ name: taskName.multiple_users })); - newTaskId = newTask.id; - - await apiService.getInstance().activiti.taskApi.involveUser(newTaskId, { email: secondUser.email }); + await apiService.getInstance().activiti.taskApi.involveUser(newTask.id, { email: secondUser.email }); const taskComment = { message: 'Task Comment' }; const secondTaskComment = { message: 'Second Task Comment' }; - await apiService.getInstance().activiti.taskApi.addTaskComment(taskComment, newTaskId); - await apiService.getInstance().activiti.taskApi.addTaskComment(secondTaskComment, newTaskId); + await apiService.getInstance().activiti.taskApi.addTaskComment(taskComment, newTask.id); + await apiService.getInstance().activiti.taskApi.addTaskComment(secondTaskComment, newTask.id); await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickTasksButton(); @@ -98,7 +96,7 @@ describe('Comment component for Processes', () => { await taskPage.tasksListPage().selectRow(taskName.multiple_users); await taskPage.taskDetails().selectActivityTab(); - const totalCommentsLatest = await apiService.getInstance().activiti.taskApi.getTaskComments(newTaskId, { 'latestFirst': true }); + const totalCommentsLatest = await apiService.getInstance().activiti.taskApi.getTaskComments(newTask.id, { 'latestFirst': true }); const thirdTaskComment = { message: 'Third Task Comment' }; @@ -119,7 +117,7 @@ describe('Comment component for Processes', () => { await navigationBarPage.clickLogoutButton(); await loginPage.login(secondUser.username, secondUser.password); - await apiService.getInstance().activiti.taskApi.addTaskComment(thirdTaskComment, newTaskId); + await apiService.getInstance().activiti.taskApi.addTaskComment(thirdTaskComment, newTask.id); await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickTasksButton(); @@ -127,7 +125,7 @@ describe('Comment component for Processes', () => { await taskPage.tasksListPage().selectRow(taskName.multiple_users); await taskPage.taskDetails().selectActivityTab(); - const totalComments = await apiService.getInstance().activiti.taskApi.getTaskComments(newTaskId, { 'latestFirst': true }); + const totalComments = await apiService.getInstance().activiti.taskApi.getTaskComments(newTask.id, { 'latestFirst': true }); await commentsPage.checkUserIconIsDisplayed(); await commentsPage.checkUserIconIsDisplayed(); diff --git a/e2e/process-services/custom-process-filters-sorting.e2e.ts b/e2e/process-services/custom-process-filters-sorting.e2e.ts index a23c40a73d..6f94903a40 100644 --- a/e2e/process-services/custom-process-filters-sorting.e2e.ts +++ b/e2e/process-services/custom-process-filters-sorting.e2e.ts @@ -62,14 +62,15 @@ describe('Sorting for process filters', () => { appId = importedApp.id; await loginPage.login(user.username, user.password); - }); + }); afterEach(async () => { - await apiService.getInstance().activiti.modelsApi.deleteModel(appId); - - await apiService.loginWithProfile('admin'); - - await apiService.getInstance().activiti.adminTenantsApi.deleteTenant(tenantId); + try { + await apiService.getInstance().activiti.modelsApi.deleteModel(appId); + await apiService.loginWithProfile('admin'); + await apiService.getInstance().activiti.adminTenantsApi.deleteTenant(tenantId); + } catch (e) { + } await navigationBarPage.clickLogoutButton(); }); @@ -80,9 +81,9 @@ describe('Sorting for process filters', () => { 'filter': { 'sort': 'created-asc', 'name': '', 'state': 'running' } }); const processUtil = new ProcessUtil(apiService); - const firstProc = await processUtil.startProcessOfApp(importedApp.name); - const secondProc = await processUtil.startProcessOfApp(importedApp.name); - const thirdProc = await processUtil.startProcessOfApp(importedApp.name); + const firstProc = await processUtil.startProcessOfApp(importedApp.name); + const secondProc = await processUtil.startProcessOfApp(importedApp.name); + const thirdProc = await processUtil.startProcessOfApp(importedApp.name); await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickProcessButton(); @@ -103,9 +104,9 @@ describe('Sorting for process filters', () => { }); const processUtil = new ProcessUtil(apiService); - const firstProc = await processUtil.startProcessOfApp(importedApp.name); - const secondProc = await processUtil.startProcessOfApp(importedApp.name); - const thirdProc = await processUtil.startProcessOfApp(importedApp.name); + const firstProc = await processUtil.startProcessOfApp(importedApp.name); + const secondProc = await processUtil.startProcessOfApp(importedApp.name); + const thirdProc = await processUtil.startProcessOfApp(importedApp.name); await apiService.getInstance().activiti.processInstancesApi.deleteProcessInstance(firstProc.id); await apiService.getInstance().activiti.processInstancesApi.deleteProcessInstance(secondProc.id); @@ -132,9 +133,9 @@ describe('Sorting for process filters', () => { }); const processUtil = new ProcessUtil(apiService); - const firstProc = await processUtil.startProcessOfApp(importedApp.name); - const secondProc = await processUtil.startProcessOfApp(importedApp.name); - const thirdProc = await processUtil.startProcessOfApp(importedApp.name); + const firstProc = await processUtil.startProcessOfApp(importedApp.name); + const secondProc = await processUtil.startProcessOfApp(importedApp.name); + const thirdProc = await processUtil.startProcessOfApp(importedApp.name); const deleteFirstProc = await processUtil.startProcessOfApp(importedApp.name); const deleteSecondProc = await processUtil.startProcessOfApp(importedApp.name); diff --git a/e2e/process-services/info-drawer.e2e.ts b/e2e/process-services/info-drawer.e2e.ts index 757ee259b6..e92ef2e689 100644 --- a/e2e/process-services/info-drawer.e2e.ts +++ b/e2e/process-services/info-drawer.e2e.ts @@ -139,7 +139,7 @@ describe('Info Drawer', () => { await expect(await taskPage.taskDetails().getPriority()).toEqual('40'); await taskPage.taskDetails().updatePriority(); await taskPage.taskDetails().checkTaskDetailsDisplayed(); - await expect(await taskPage.taskDetails().getPriority()).toEqual('0'); + await expect(await taskPage.taskDetails().getPriority()).toEqual(''); await taskPage.taskDetails().clickCompleteFormTask(); }); diff --git a/e2e/process-services/pages/process-services.page.ts b/e2e/process-services/pages/process-services.page.ts index 123b0d065e..bc8fa23698 100644 --- a/e2e/process-services/pages/process-services.page.ts +++ b/e2e/process-services/pages/process-services.page.ts @@ -17,8 +17,9 @@ import { ProcessServiceTabBarPage } from './process-service-tab-bar.page'; -import { Locator, element, by } from 'protractor'; +import { Locator, element, by, browser } from 'protractor'; import { BrowserVisibility, BrowserActions } from '@alfresco/adf-testing'; +import { TasksPage } from './tasks.page'; export class ProcessServicesPage { @@ -34,6 +35,8 @@ export class ProcessServicesPage { async goToApp(applicationName: string): Promise { const app = element(by.css('mat-card[title="' + applicationName + '"]')); await BrowserActions.click(app); + const taskPage = new TasksPage(); + await taskPage.tasksListPage().checkTaskListIsLoaded(); return new ProcessServiceTabBarPage(); } @@ -42,6 +45,13 @@ export class ProcessServicesPage { return new ProcessServiceTabBarPage(); } + async goToAppByAppId(appId: string): Promise { + const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${appId}/tasks/`; + await BrowserActions.getUrl(urlToNavigateTo); + const taskPage = new TasksPage(); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + } + async getAppIconType(applicationName: string): Promise { const app = element(by.css('mat-card[title="' + applicationName + '"]')); await BrowserVisibility.waitUntilElementIsVisible(app); diff --git a/e2e/process-services/pages/task-details.page.ts b/e2e/process-services/pages/task-details.page.ts index 203cb7c9a0..b28bb6512f 100644 --- a/e2e/process-services/pages/task-details.page.ts +++ b/e2e/process-services/pages/task-details.page.ts @@ -220,7 +220,7 @@ export class TaskDetailsPage { async updatePriority(priority?: string): Promise { await BrowserActions.click(this.priority); await BrowserActions.clearWithBackSpace(this.priority); - await BrowserActions.clearSendKeys(element(by.css('input[data-automation-id="card-textitem-value-priority"]')), priority ? priority : ' ', 500); + await BrowserActions.clearSendKeys(element(by.css('input[data-automation-id="card-textitem-value-priority"]')), priority, 500); await this.priority.sendKeys(Key.TAB); await browser.sleep(1000); } diff --git a/e2e/process-services/standalone-task.e2e.ts b/e2e/process-services/standalone-task.e2e.ts index 9d76c87b4a..598100e0c9 100644 --- a/e2e/process-services/standalone-task.e2e.ts +++ b/e2e/process-services/standalone-task.e2e.ts @@ -57,6 +57,7 @@ describe('Start Task - Task App', () => { }); beforeEach(async () => { + await browser.refresh(); await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickTasksButton(); await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); }); @@ -108,6 +109,7 @@ describe('Start Task - Task App', () => { await taskPage.formFields().checkFormIsDisplayed(); await taskPage.taskDetails().checkCompleteFormButtonIsDisplayed(); + await taskPage.taskDetails().waitFormNameEqual(app.formName); }); diff --git a/e2e/process-services/start-process-component.e2e.ts b/e2e/process-services/start-process-component.e2e.ts index 0b88aaee18..29e1308884 100644 --- a/e2e/process-services/start-process-component.e2e.ts +++ b/e2e/process-services/start-process-component.e2e.ts @@ -98,6 +98,7 @@ describe('Start Process Component', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await apiServiceUserTwo.getInstance().activiti.modelsApi.deleteModel(appCreated.id); await apiServiceUserTwo.getInstance().activiti.modelsApi.deleteModel(simpleAppCreated.id); await apiServiceUserTwo.getInstance().activiti.modelsApi.deleteModel(dateFormAppCreated.id); diff --git a/e2e/process-services/task-details-form.e2e.ts b/e2e/process-services/task-details-form.e2e.ts index 38498f2b8b..60cb1fd184 100644 --- a/e2e/process-services/task-details-form.e2e.ts +++ b/e2e/process-services/task-details-form.e2e.ts @@ -36,6 +36,7 @@ import { TaskRepresentation } from '@alfresco/js-api'; import CONSTANTS = require('../util/constants'); describe('Task Details - Form', () => { + const loginPage = new LoginPage(); const tasksListPage = new TasksListPage(); const taskDetailsPage = new TaskDetailsPage(); @@ -187,6 +188,7 @@ describe('Task Details - Form', () => { const form = await formActions.getFormByName(app.visibilityProcess.formName); await apiService.getInstance().activiti.taskApi.attachForm(newTask.id, { 'formId': form.id }); + await browser.refresh(); await (await new NavigationBarPage().navigateToProcessServicesPage()).goToTaskApp(); await tasksListPage.checkTaskListIsLoaded(); await filtersPage.goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); diff --git a/e2e/process-services/widgets/amount-widget.e2e.ts b/e2e/process-services/widgets/amount-widget.e2e.ts index 0190407ed6..b76044e6a1 100644 --- a/e2e/process-services/widgets/amount-widget.e2e.ts +++ b/e2e/process-services/widgets/amount-widget.e2e.ts @@ -56,6 +56,8 @@ describe('Amount Widget', () => { beforeEach(async() => { const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; await BrowserActions.getUrl(urlToNavigateTo); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/attach-folder-widget.e2e.ts b/e2e/process-services/widgets/attach-folder-widget.e2e.ts index a305b0bec7..cbd3c918f3 100644 --- a/e2e/process-services/widgets/attach-folder-widget.e2e.ts +++ b/e2e/process-services/widgets/attach-folder-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Attach Folder widget', () => { @@ -35,6 +36,7 @@ describe('Attach Folder widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); let appModel; let deployedApp, process; @@ -62,8 +64,9 @@ describe('Attach Folder widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/checkbox-widget.e2e.ts b/e2e/process-services/widgets/checkbox-widget.e2e.ts index a79bdde48b..4c6ed331bb 100644 --- a/e2e/process-services/widgets/checkbox-widget.e2e.ts +++ b/e2e/process-services/widgets/checkbox-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,7 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; describe('Checkbox Widget', () => { @@ -61,8 +61,7 @@ describe('Checkbox Widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/date-time-widget.e2e.ts b/e2e/process-services/widgets/date-time-widget.e2e.ts index 573ae498da..2fa724ce93 100644 --- a/e2e/process-services/widgets/date-time-widget.e2e.ts +++ b/e2e/process-services/widgets/date-time-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Date and time widget', () => { @@ -35,6 +36,7 @@ describe('Date and time widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('Date and time widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/date-widget.e2e.ts b/e2e/process-services/widgets/date-widget.e2e.ts index beb4c0309a..f224460942 100644 --- a/e2e/process-services/widgets/date-widget.e2e.ts +++ b/e2e/process-services/widgets/date-widget.e2e.ts @@ -30,6 +30,8 @@ import { browser } from 'protractor'; import { FormDemoPage } from '.././pages/form-demo.page'; import { customDateFormAPS1 } from '../../resources/forms/custom-date-form'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Date widget', () => { @@ -38,6 +40,7 @@ describe('Date widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const dateWidget = widget.dateWidget(); let appModel; @@ -72,8 +75,9 @@ describe('Date widget', () => { describe('Simple App', () => { beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/document-template-widget.e2e.ts b/e2e/process-services/widgets/document-template-widget.e2e.ts index 3aa865cd59..3d1f7683fb 100644 --- a/e2e/process-services/widgets/document-template-widget.e2e.ts +++ b/e2e/process-services/widgets/document-template-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Document Template widget', () => { @@ -35,6 +36,7 @@ describe('Document Template widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('Document Template widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/dropdown-widget.e2e.ts b/e2e/process-services/widgets/dropdown-widget.e2e.ts index afd3a1f9eb..927cd02dad 100644 --- a/e2e/process-services/widgets/dropdown-widget.e2e.ts +++ b/e2e/process-services/widgets/dropdown-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Dropdown widget', () => { const app = browser.params.resources.Files.WIDGET_CHECK_APP.DROPDOWN; @@ -34,6 +35,7 @@ describe('Dropdown widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -60,8 +62,9 @@ describe('Dropdown widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/dynamic-table-widget.e2e.ts b/e2e/process-services/widgets/dynamic-table-widget.e2e.ts index dae1bdaacb..53e28b3c56 100644 --- a/e2e/process-services/widgets/dynamic-table-widget.e2e.ts +++ b/e2e/process-services/widgets/dynamic-table-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -28,6 +27,7 @@ import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; describe('Dynamic Table widget ', () => { @@ -62,8 +62,9 @@ describe('Dynamic Table widget ', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); @@ -118,8 +119,9 @@ describe('Dynamic Table widget ', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.tasksListPage().checkTaskListIsLoaded(); await taskPage.formFields().checkFormIsDisplayed(); @@ -172,8 +174,10 @@ describe('Dynamic Table widget ', () => { beforeEach(async () => { await loginPage.login(processUserModel.username, processUserModel.password); - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks`; - await BrowserActions.getUrl(urlToNavigateTo); + + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.tasksListPage().checkTaskListIsLoaded(); await taskPage.formFields().checkFormIsDisplayed(); diff --git a/e2e/process-services/widgets/header-widget.e2e.ts b/e2e/process-services/widgets/header-widget.e2e.ts index a52c300617..45e9b4d042 100644 --- a/e2e/process-services/widgets/header-widget.e2e.ts +++ b/e2e/process-services/widgets/header-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Header widget', async () => { @@ -35,6 +36,7 @@ describe('Header widget', async () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('Header widget', async () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/hyperlink-widget.e2e.ts b/e2e/process-services/widgets/hyperlink-widget.e2e.ts index 6099fa1094..00406613a8 100644 --- a/e2e/process-services/widgets/hyperlink-widget.e2e.ts +++ b/e2e/process-services/widgets/hyperlink-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Hyperlink widget', () => { @@ -35,6 +36,7 @@ describe('Hyperlink widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('Hyperlink widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/multi-line-widget.e2e.ts b/e2e/process-services/widgets/multi-line-widget.e2e.ts index 2867db92c8..0ac32e12ca 100644 --- a/e2e/process-services/widgets/multi-line-widget.e2e.ts +++ b/e2e/process-services/widgets/multi-line-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Multi-line Widget', () => { const app = browser.params.resources.Files.WIDGET_CHECK_APP.MULTILINE_TEXT; @@ -34,6 +35,7 @@ describe('Multi-line Widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -60,8 +62,9 @@ describe('Multi-line Widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/number-widget.e2e.ts b/e2e/process-services/widgets/number-widget.e2e.ts index 2f68aa2b9b..fc93c6c2a8 100644 --- a/e2e/process-services/widgets/number-widget.e2e.ts +++ b/e2e/process-services/widgets/number-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Number widget', () => { @@ -35,6 +36,7 @@ describe('Number widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('Number widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/people-widget.e2e.ts b/e2e/process-services/widgets/people-widget.e2e.ts index 855bb6b781..6e4821862b 100644 --- a/e2e/process-services/widgets/people-widget.e2e.ts +++ b/e2e/process-services/widgets/people-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('People widget', () => { @@ -35,6 +36,7 @@ describe('People widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('People widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/radio-buttons-widget.e2e.ts b/e2e/process-services/widgets/radio-buttons-widget.e2e.ts index 221a5a6aba..6db7bb4ea9 100644 --- a/e2e/process-services/widgets/radio-buttons-widget.e2e.ts +++ b/e2e/process-services/widgets/radio-buttons-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; +import { ProcessServicesPage } from '../pages/process-services.page'; describe('Radio Buttons Widget', () => { @@ -35,6 +36,7 @@ describe('Radio Buttons Widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -62,8 +64,9 @@ describe('Radio Buttons Widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); diff --git a/e2e/process-services/widgets/text-widget.e2e.ts b/e2e/process-services/widgets/text-widget.e2e.ts index cfa54eaadd..447848b955 100644 --- a/e2e/process-services/widgets/text-widget.e2e.ts +++ b/e2e/process-services/widgets/text-widget.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { TasksPage } from '../pages/tasks.page'; import { browser } from 'protractor'; import CONSTANTS = require('../../util/constants'); +import { ProcessServicesPage } from '../pages/process-services.page'; +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Text widget', () => { @@ -35,6 +36,7 @@ describe('Text widget', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -61,8 +63,9 @@ describe('Text widget', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); @@ -84,12 +87,15 @@ describe('Text widget', () => { }); it('[C268170] Min-max length properties', async () => { + await widget.textWidget().setValue(app.FIELD.simpleText, 'TEST'); await widget.textWidget().setValue(app.FIELD.textMinMax, 'A'); await expect(await widget.textWidget().getErrorMessage(app.FIELD.textMinMax)).toContain('Enter at least 4 characters'); await expect(await taskPage.formFields().isCompleteFormButtonEnabled()).toEqual(false); - await widget.textWidget().setValue(app.FIELD.textMinMax, 'AAAAAAAAAAA'); + await widget.textWidget().setValue(app.FIELD.textMinMax, '01234567890'); await expect(await widget.textWidget().getErrorMessage(app.FIELD.textMinMax)).toContain('Enter no more than 10 characters'); await expect(await taskPage.formFields().isCompleteFormButtonEnabled()).toEqual(false); + await widget.textWidget().setValue(app.FIELD.textMinMax, '123456789'); + await expect(await taskPage.formFields().isCompleteFormButtonEnabled()).toEqual(true); }); it('[C268171] Input mask reversed checkbox properties', async () => { diff --git a/e2e/process-services/widgets/widget-visibility-condition.e2e.ts b/e2e/process-services/widgets/widget-visibility-condition.e2e.ts index ef6591eb61..88d983188e 100644 --- a/e2e/process-services/widgets/widget-visibility-condition.e2e.ts +++ b/e2e/process-services/widgets/widget-visibility-condition.e2e.ts @@ -18,7 +18,6 @@ import { ApiService, ApplicationsUtil, - BrowserActions, LoginPage, ProcessUtil, UsersActions, @@ -27,6 +26,8 @@ import { import { browser } from 'protractor'; import { TasksPage } from '../pages/tasks.page'; import CONSTANTS = require('../../util/constants'); +import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; +import { ProcessServicesPage } from '../pages/process-services.page'; const widgets = { textOneId: 'text1', @@ -57,6 +58,7 @@ describe('Process-Services - Visibility conditions', () => { const loginPage = new LoginPage(); const taskPage = new TasksPage(); const widget = new Widget(); + const navigationBarPage = new NavigationBarPage(); const apiService = new ApiService(); const usersActions = new UsersActions(apiService); @@ -83,8 +85,8 @@ describe('Process-Services - Visibility conditions', () => { }); beforeEach(async () => { - const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`; - await BrowserActions.getUrl(urlToNavigateTo); + await navigationBarPage.clickHomeButton(); + await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id); await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); await taskPage.formFields().checkFormIsDisplayed(); }); @@ -113,17 +115,6 @@ describe('Process-Services - Visibility conditions', () => { await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxVariableField); }); - it('[C309649] Should be able to see Checkbox widget when visibility condition refers to a field and a form variable', async () => { - await widget.textWidget().isWidgetVisible(widgets.textOneId); - await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable); - - await widget.textWidget().setValue(widgets.textOneId, value.displayFieldVariableCheckbox); - await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldVariable); - - await widget.textWidget().setValue(widgets.textOneId, value.notDisplayCheckbox); - await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable); - }); - it('[C311425] Should be able to see Checkbox widget when visibility condition refers to a field and another field', async () => { await widget.textWidget().isWidgetVisible(widgets.textOneId); await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldField); @@ -135,6 +126,17 @@ describe('Process-Services - Visibility conditions', () => { await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldField); }); + it('[C309649] Should be able to see Checkbox widget when visibility condition refers to a field and a form variable', async () => { + await widget.textWidget().isWidgetVisible(widgets.textOneId); + await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable); + + await widget.textWidget().setValue(widgets.textOneId, value.displayFieldVariableCheckbox); + await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldVariable); + + await widget.textWidget().setValue(widgets.textOneId, value.notDisplayCheckbox); + await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable); + }); + it('[C311424] Should be able to see Checkbox widget when visibility condition refers to a variable with specific value', async () => { await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxVariableValue); }); diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js index 119c04bc77..c74b02806c 100644 --- a/e2e/protractor.conf.js +++ b/e2e/protractor.conf.js @@ -34,15 +34,16 @@ const LOG = !!process.env.LOG; let arraySpecs = []; +console.log('Parallel e2e : ' + MAXINSTANCES); +console.log('Max fail Retry: ', MAX_RETRIES); + if (LOG) { console.log('======= PROTRACTOR CONFIGURATION ====== '); console.log('HOST: ', HOST); console.log('BROWSER_RUN : ' + BROWSER_RUN); console.log('SAVE_SCREENSHOT : ' + SAVE_SCREENSHOT); console.log('FOLDER : ' + FOLDER); - console.log('MAXINSTANCES : ' + MAXINSTANCES); console.log('LIST_SPECS : ' + LIST_SPECS); - console.log('MAX_RETRIES: ', MAX_RETRIES); console.log('SELENIUM_SERVER : ' + SELENIUM_SERVER); } @@ -191,7 +192,9 @@ exports.config = { }], onCleanUp(results) { - retry.onCleanUp(results); + if (process.env.CI) { + retry.onCleanUp(results); + } }, async onPrepare() { diff --git a/e2e/search/components/search-sorting-picker.e2e.ts b/e2e/search/components/search-sorting-picker.e2e.ts index 01ebd8faf2..fe9c11b235 100644 --- a/e2e/search/components/search-sorting-picker.e2e.ts +++ b/e2e/search/components/search-sorting-picker.e2e.ts @@ -70,7 +70,7 @@ describe('Search Sorting Picker', () => { pngA = await uploadActions.uploadFile(pngAModel.location, pngAModel.name, '-my-'); pngD = await uploadActions.uploadFile(pngDModel.location, pngDModel.name, '-my-'); - await browser.sleep(12000); + await browser.sleep(browser.params.testConfig.timeouts.index_search); await loginPage.login(acsUser.username, acsUser.password); }); diff --git a/e2e/search/search-multiselect.e2e.ts b/e2e/search/search-multiselect.e2e.ts index 17c005cd44..55a17bf4e9 100644 --- a/e2e/search/search-multiselect.e2e.ts +++ b/e2e/search/search-multiselect.e2e.ts @@ -87,6 +87,8 @@ describe('Search Component - Multi-Select Facet', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); + await Promise.all([ uploadActions.deleteFileOrFolder(jpgFile.entry.id), uploadActions.deleteFileOrFolder(jpgFileSite.entry.id), @@ -228,6 +230,7 @@ describe('Search Component - Multi-Select Facet', () => { }); afterAll(async () => { + await apiService.loginWithProfile('admin'); await uploadActions.deleteFileOrFolder(txtFile.entry.id); await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true }); }); diff --git a/lib/cli/scripts/docker-publish.ts b/lib/cli/scripts/docker-publish.ts index 27b1ba739e..f525b73cb3 100644 --- a/lib/cli/scripts/docker-publish.ts +++ b/lib/cli/scripts/docker-publish.ts @@ -79,7 +79,7 @@ function main(args) { .requiredOption('--dockerRepo [type]', 'docker repo') .requiredOption('--dockerTags [type]', ' tags') .requiredOption('--buildArgs [type]', ' buildArgs') - .requiredOption('--pathProject [type]', 'path ptojrct') + .requiredOption('--pathProject [type]', 'path project') .parse(process.argv); if (process.argv.includes('-h') || process.argv.includes('--help')) { diff --git a/lib/content-services/src/lib/search/base-query-builder.service.ts b/lib/content-services/src/lib/search/base-query-builder.service.ts index f683d66201..360aa162af 100644 --- a/lib/content-services/src/lib/search/base-query-builder.service.ts +++ b/lib/content-services/src/lib/search/base-query-builder.service.ts @@ -259,6 +259,7 @@ export abstract class BaseQueryBuilderService { } if (query) { + const result: QueryBody = { query: { query: query, @@ -336,13 +337,11 @@ export abstract class BaseQueryBuilderService { * @returns True if defined, false otherwise */ get hasFacetIntervals(): boolean { - if (this.config + return this.config && this.config.facetIntervals && this.config.facetIntervals.intervals - && this.config.facetIntervals.intervals.length > 0) { - return true; - } - return false; + && this.config.facetIntervals.intervals.length > 0; + } get hasFacetHighlight(): boolean { diff --git a/lib/content-services/src/lib/search/search-header-query-builder.service.ts b/lib/content-services/src/lib/search/search-header-query-builder.service.ts index d0ac6268f4..249eb8eeb0 100644 --- a/lib/content-services/src/lib/search/search-header-query-builder.service.ts +++ b/lib/content-services/src/lib/search/search-header-query-builder.service.ts @@ -42,8 +42,8 @@ export class SearchHeaderQueryBuilderService extends BaseQueryBuilderService { this.updated.pipe( filter((query: QueryBody) => !!query)).subscribe(() => { - this.execute(); - }); + this.execute(); + }); } public isFilterServiceActive(): boolean { @@ -99,8 +99,15 @@ export class SearchHeaderQueryBuilderService extends BaseQueryBuilderService { dataSorting.forEach((columnSorting: DataSorting) => { const fieldValue = this.getSortingFieldFromColumnName(columnSorting.key); if (fieldValue) { - const optionAscending = columnSorting.direction.toLocaleLowerCase() === 'asc' ? true : false; - const currentSort: SearchSortingDefinition = { key: columnSorting.key, label: 'current', type: 'FIELD', field: fieldValue, ascending: optionAscending }; + const optionAscending = columnSorting.direction.toLocaleLowerCase() === 'asc'; + const type = fieldValue === 'score' ? 'SCORE' : 'FIELD'; + const currentSort: SearchSortingDefinition = { + key: columnSorting.key, + label: 'current', + type: type, + field: fieldValue, + ascending: optionAscending + }; this.sorting.push(currentSort); } }); diff --git a/lib/core/card-view/models/card-view-baseitem.model.ts b/lib/core/card-view/models/card-view-baseitem.model.ts index 87eccf25f2..d5fa3bc73b 100644 --- a/lib/core/card-view/models/card-view-baseitem.model.ts +++ b/lib/core/card-view/models/card-view-baseitem.model.ts @@ -28,6 +28,7 @@ export abstract class CardViewBaseItemModel { icon?: string; validators?: CardViewItemValidator[]; data?: any; + type?: string; constructor(cardViewItemProperties: CardViewItemProperties) { this.label = cardViewItemProperties.label || ''; diff --git a/lib/core/card-view/services/card-view-update.service.ts b/lib/core/card-view/services/card-view-update.service.ts index 94ae7b7477..c64b19300e 100644 --- a/lib/core/card-view/services/card-view-update.service.ts +++ b/lib/core/card-view/services/card-view-update.service.ts @@ -20,7 +20,7 @@ import { Subject } from 'rxjs'; import { CardViewBaseItemModel } from '../models/card-view-baseitem.model'; export interface UpdateNotification { - target: any; + target: CardViewBaseItemModel; changed: any; } @@ -60,7 +60,7 @@ export class CardViewUpdateService { /** * Updates the cardview items property - * @param CardViewBaseItemModel + * @param notification */ updateElement(notification: CardViewBaseItemModel) { this.updateItem$.next(notification); diff --git a/lib/core/form/components/widgets/core/form-field.model.ts b/lib/core/form/components/widgets/core/form-field.model.ts index 5dd787af12..b6f0cc0b71 100644 --- a/lib/core/form/components/widgets/core/form-field.model.ts +++ b/lib/core/form/components/widgets/core/form-field.model.ts @@ -327,7 +327,7 @@ export class FormFieldModel extends FormWidgetModel { } if (this.isCheckboxField(json)) { - value = json.value === 'true' || json.value === true ? true : false; + value = json.value === 'true' || json.value === true; } return value; diff --git a/lib/core/userinfo/components/user-info.component.html b/lib/core/userinfo/components/user-info.component.html index 29f7a109ac..62a865fcd0 100644 --- a/lib/core/userinfo/components/user-info.component.html +++ b/lib/core/userinfo/components/user-info.component.html @@ -19,7 +19,15 @@ data-automation-id="adf-user-profile">
-
+
+
+ user-info-profile-button +
+
+ +
+
@@ -50,7 +58,7 @@ + *ngIf="mode==='CONTENT' || mode==='ALL'"> @@ -76,7 +84,8 @@
{{ 'USER_PROFILE.LABELS.ECM.JOB_TITLE' | translate }} - {{ ecmUser.jobTitle ? ecmUser.jobTitle : 'N/A' }} + {{ ecmUser.jobTitle ? ecmUser.jobTitle : 'N/A' }}
@@ -107,7 +116,8 @@
{{ 'USER_PROFILE.LABELS.BPM.TENANT' | translate }} - {{ bpmUser.tenantName ? bpmUser.tenantName : '' }} + {{ bpmUser.tenantName ? bpmUser.tenantName : '' }}
@@ -118,15 +128,24 @@ -
+
+
+ ecm-profile-image +
+ +
+
{{identityUser | fullName}}
- {{identityUser | fullName}} + {{identityUser | fullName}} {{identityUser.email}}
diff --git a/lib/core/userinfo/components/user-info.component.ts b/lib/core/userinfo/components/user-info.component.ts index b6a9db9f77..2d253b1d85 100644 --- a/lib/core/userinfo/components/user-info.component.ts +++ b/lib/core/userinfo/components/user-info.component.ts @@ -83,6 +83,11 @@ export class UserInfoComponent implements OnInit { if (this.authService.isOauth()) { this.loadIdentityUserInfo(); this.mode = 'SSO'; + + if (this.authService.isEcmLoggedIn()) { + this.loadEcmUserInfo(); + } + } else if (this.authService.isEcmLoggedIn() && this.authService.isBpmLoggedIn()) { this.loadEcmUserInfo(); this.loadBpmUserInfo(); diff --git a/lib/process-services/src/lib/task-list/components/task-details.component.ts b/lib/process-services/src/lib/task-list/components/task-details.component.ts index 99dc1ded74..70d1700a31 100644 --- a/lib/process-services/src/lib/task-list/components/task-details.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-details.component.ts @@ -267,7 +267,6 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy { */ private loadDetails(taskId: string) { this.taskPeople = []; - this.taskFormName = null; if (taskId) { this.taskListService.getTaskDetails(taskId).subscribe( @@ -339,6 +338,7 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy { } onCompleteAttachForm() { + this.taskFormName = null; this.showAttachForm = false; this.taskFormComponent.loadTask(this.taskId); this.loadDetails(this.taskId); diff --git a/lib/process-services/src/lib/task-list/components/task-header.component.ts b/lib/process-services/src/lib/task-list/components/task-header.component.ts index d9b3aed822..01551b8ca1 100644 --- a/lib/process-services/src/lib/task-list/components/task-header.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-header.component.ts @@ -15,16 +15,17 @@ * limitations under the License. */ -import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; import { BpmUserService, CardViewDateItemModel, - CardViewItem, CardViewMapItemModel, CardViewTextItemModel, CardViewBaseItemModel, TranslationService, - AppConfigService + AppConfigService, + CardViewIntItemModel, + CardViewItemLengthValidator } from '@alfresco/adf-core'; import { TaskDetailsModel } from '../models/task-details.model'; import { TaskDescriptionValidator } from '../validators/task-description.validator'; @@ -52,13 +53,13 @@ export class TaskHeaderComponent implements OnChanges, OnInit { @Output() claim: EventEmitter = new EventEmitter(); - /** Emitted when the task is unclaimed (ie, requeued). */ + /** Emitted when the task is unclaimed (ie, requeue). */ @Output() unclaim: EventEmitter = new EventEmitter(); private currentUserId: number; - properties: CardViewItem []; + properties: any [] = []; inEdit: boolean = false; displayDateClearAction = false; dateFormat: string; @@ -73,13 +74,19 @@ export class TaskHeaderComponent implements OnChanges, OnInit { ngOnInit() { this.loadCurrentBpmUserId(); + this.initData(); } - ngOnChanges() { - this.refreshData(); + ngOnChanges(changes: SimpleChanges) { + const taskDetailsChange = changes['taskDetails']; + if (taskDetailsChange?.currentValue?.id !== taskDetailsChange?.previousValue?.id) { + this.initData(); + } else { + this.refreshData(); + } } - private initDefaultProperties(parentInfoMap) { + private initDefaultProperties(parentInfoMap): any[] { return [ new CardViewTextItemModel( { @@ -98,12 +105,13 @@ export class TaskHeaderComponent implements OnChanges, OnInit { key: 'status' } ), - new CardViewTextItemModel( + new CardViewIntItemModel( { label: 'ADF_TASK_LIST.PROPERTIES.PRIORITY', value: this.taskDetails.priority, key: 'priority', - editable: true + editable: true, + validators: [new CardViewItemLengthValidator(1, 10)] } ), new CardViewDateItemModel( @@ -200,7 +208,7 @@ export class TaskHeaderComponent implements OnChanges, OnInit { /** * Refresh the card data */ - refreshData() { + initData() { if (this.taskDetails) { const parentInfoMap = this.getParentInfo(); const defaultProperties = this.initDefaultProperties(parentInfoMap); @@ -209,6 +217,26 @@ export class TaskHeaderComponent implements OnChanges, OnInit { } } + /** + * Refresh the card data + */ + refreshData() { + this.properties = this.properties.map((cardItem) => { + if (cardItem.key === 'formName' && cardItem.value !== this.formName) { + return new CardViewTextItemModel({ + label: 'ADF_TASK_LIST.PROPERTIES.FORM_NAME', + value: this.formName, + key: 'formName', + default: this.translationService.instant('ADF_TASK_LIST.PROPERTIES.FORM_NAME_DEFAULT'), + clickable: this.isFormClickable(), + icon: 'create' + }); + } else { + return cardItem; + } + }); + } + private isValidSelection(filteredProperties: string[], cardItem: CardViewBaseItemModel): boolean { return filteredProperties ? filteredProperties.indexOf(cardItem.key) >= 0 : true; } @@ -236,7 +264,7 @@ export class TaskHeaderComponent implements OnChanges, OnInit { * Does the task have an assignee */ public hasAssignee(): boolean { - return !!this.taskDetails.assignee ? true : false; + return !!this.taskDetails.assignee; } /** diff --git a/lib/testing/src/lib/core/actions/api.util.ts b/lib/testing/src/lib/core/actions/api.util.ts index 8c4edae9db..3972005ae2 100644 --- a/lib/testing/src/lib/core/actions/api.util.ts +++ b/lib/testing/src/lib/core/actions/api.util.ts @@ -15,14 +15,6 @@ * limitations under the License. */ -/* - * Copyright 2005-2019 Alfresco Software, Ltd. All rights reserved. - * - * License rights for this program may be obtained from Alfresco Software, Ltd. - * pursuant to a written agreement and any use of this program without such an - * agreement is prohibited. - */ - export type ApiResultPredicate = (result: T) => boolean; export type ApiCall = () => Promise; diff --git a/lib/testing/src/lib/core/pages/login.page.ts b/lib/testing/src/lib/core/pages/login.page.ts index 09c1044229..5cff1769d5 100644 --- a/lib/testing/src/lib/core/pages/login.page.ts +++ b/lib/testing/src/lib/core/pages/login.page.ts @@ -94,7 +94,7 @@ export class LoginPage { await this.enterPassword(password); await this.clickLoginButton(); await browser.actions().sendKeys(protractor.Key.ENTER).perform(); - await BrowserVisibility.waitUntilElementIsVisible(this.header); + await BrowserVisibility.waitUntilElementIsVisible(this.header, BrowserVisibility.DEFAULT_TIMEOUT * 2); } async loginBasicAuth(username: string, password: string): Promise { diff --git a/lib/testing/src/lib/core/utils/browser-actions.ts b/lib/testing/src/lib/core/utils/browser-actions.ts index bcd3ad765f..45daafee16 100644 --- a/lib/testing/src/lib/core/utils/browser-actions.ts +++ b/lib/testing/src/lib/core/utils/browser-actions.ts @@ -43,7 +43,7 @@ export class BrowserActions { } }; - return ApiUtil.waitForApi(apiCall, predicate, 5, 2000); + return ApiUtil.waitForApi(apiCall, predicate, 10, 2000); } static async click(elementToClick: ElementFinder): Promise { diff --git a/lib/testing/src/lib/core/utils/public-api.ts b/lib/testing/src/lib/core/utils/public-api.ts index dd11b67674..d0933365cc 100644 --- a/lib/testing/src/lib/core/utils/public-api.ts +++ b/lib/testing/src/lib/core/utils/public-api.ts @@ -24,4 +24,5 @@ export * from './local-storage.util'; export * from './file-browser.util'; export * from './form.util'; export * from './date-util'; +export * from './wait-actions'; export * from './logger'; diff --git a/lib/testing/src/lib/core/utils/wait-actions.ts b/lib/testing/src/lib/core/utils/wait-actions.ts new file mode 100644 index 0000000000..cc052ed60e --- /dev/null +++ b/lib/testing/src/lib/core/utils/wait-actions.ts @@ -0,0 +1,70 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodeEntry } from '@alfresco/js-api'; +import { ApiService } from '../actions/api.service'; +import { ApiUtil } from '../actions/api.util'; +import { Logger } from './logger'; + +export class WaitActions { + + DELAY_API_CALL = 5000; + apiService: ApiService; + + constructor(apiService: ApiService) { + this.apiService = apiService; + } + + async nodeIsPresent(nodeId: string): Promise { + + const predicate = (result) => { + return result.entry.id === nodeId; + }; + + const apiCall = async () => { + + try { + return this.apiService.getInstance().core.nodesApi.getNode(nodeId); + } catch (error) { + Logger.error('Node not present'); + return null; + } + }; + + return ApiUtil.waitForApi(apiCall, predicate, this.DELAY_API_CALL); + } + + async nodeIsUnlock(nodeId: string): Promise { + + const predicate = (result) => { + return result.entry.isLocked === false; + }; + + const apiCall = async () => { + + try { + return this.apiService.getInstance().core.nodesApi.getNode(nodeId); + } catch (error) { + Logger.error('Node not present'); + return null; + } + }; + + return ApiUtil.waitForApi(apiCall, predicate, this.DELAY_API_CALL); + } + +} diff --git a/package-lock.json b/package-lock.json index c35c5145ca..8a5330057b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@alfresco/js-api": { - "version": "4.3.0-2e84309af123ae96cc85bd9683cb1ab9a7119c33", - "resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-4.3.0-2e84309af123ae96cc85bd9683cb1ab9a7119c33.tgz", - "integrity": "sha512-D655f7pIzecQ+dN2hN8g/MrI0ToRuqO2EddOSs5g6d1fRwA4I32rpH62R2+5oXsdvgkLCuPJ8xoLamz3QVcajQ==", + "version": "4.3.0-386fb73751610a15094a0d0938ab19456325d7c8", + "resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-4.3.0-386fb73751610a15094a0d0938ab19456325d7c8.tgz", + "integrity": "sha512-vzrIiXxWkaFOhRgXrtbmnVSwwuDXxr3bVcZto3z1u2EAjs2Sg3DxtQmG73NdIYoUqemfDc6DDVdT5zxin6A4sw==", "requires": { "event-emitter": "^0.3.5", "minimatch": "3.0.4", @@ -7796,18 +7796,18 @@ } }, "browserstack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", - "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", "dev": true, "requires": { "https-proxy-agent": "^2.2.1" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -11823,9 +11823,9 @@ }, "dependencies": { "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", "dev": true } } @@ -16567,14 +16567,13 @@ "dev": true }, "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", + "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", "dev": true, "requires": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", @@ -16645,9 +16644,9 @@ } }, "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -20463,9 +20462,9 @@ } }, "webdriver-manager": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", - "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", "dev": true, "requires": { "adm-zip": "^0.4.9", @@ -20499,12 +20498,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -20520,9 +20518,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yargs": { @@ -22128,9 +22126,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -24690,9 +24688,9 @@ } }, "stylelint": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.9.0.tgz", - "integrity": "sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg==", + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz", + "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==", "dev": true, "requires": { "@stylelint/postcss-css-in-js": "^0.37.2", @@ -24701,14 +24699,14 @@ "balanced-match": "^1.0.0", "chalk": "^4.1.0", "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", + "debug": "^4.2.0", "execall": "^2.0.0", - "fast-glob": "^3.2.5", + "fast-glob": "^3.2.4", "fastest-levenshtein": "^1.0.12", "file-entry-cache": "^6.0.0", "get-stdin": "^8.0.0", "global-modules": "^2.0.0", - "globby": "^11.0.2", + "globby": "^11.0.1", "globjoin": "^0.1.4", "html-tags": "^3.1.0", "ignore": "^5.1.8", @@ -24718,7 +24716,7 @@ "lodash": "^4.17.20", "log-symbols": "^4.0.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", + "meow": "^8.0.0", "micromatch": "^4.0.2", "normalize-selector": "^0.2.0", "postcss": "^7.0.35", @@ -24740,7 +24738,7 @@ "style-search": "^0.1.0", "sugarss": "^2.0.0", "svg-tags": "^1.0.0", - "table": "^6.0.7", + "table": "^6.0.3", "v8-compile-cache": "^2.2.0", "write-file-atomic": "^3.0.3" }, @@ -24831,9 +24829,9 @@ "dev": true }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { "ms": "2.1.2" @@ -24845,38 +24843,10 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -24904,9 +24874,9 @@ "dev": true }, "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -25188,26 +25158,26 @@ "dev": true }, "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz", + "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==", "dev": true, "requires": { - "ajv": "^7.0.2", + "ajv": "^6.12.4", "lodash": "^4.17.20", "slice-ansi": "^4.0.0", "string-width": "^4.2.0" }, "dependencies": { "ajv": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", - "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, @@ -25247,12 +25217,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -26338,9 +26302,9 @@ } }, "typedoc": { - "version": "0.20.18", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.18.tgz", - "integrity": "sha512-AX4WgbVI7k3IoFmUFcAGhNBSjAHbQ8lE/EVVFkYDWIUAcxtLHlpF761Bbasniv5F9bwwxBuyAlLpJRJW/zIy4Q==", + "version": "0.20.14", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.14.tgz", + "integrity": "sha512-9bsZp5/qkl+gDSv9DRvHbfbY8Sr0tD8fKx7hNIvcluxeAFzBCEo9o0qDCdLUZw+/axbfd9TaqHvSuCVRu+YH6Q==", "dev": true, "requires": { "colors": "^1.4.0", @@ -26353,19 +26317,19 @@ "progress": "^2.0.3", "shelljs": "^0.8.4", "shiki": "^0.2.7", - "typedoc-default-themes": "^0.12.5" + "typedoc-default-themes": "0.12.1" }, "dependencies": { "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "universalify": "^1.0.0" } }, "jsonfile": { @@ -26376,20 +26340,28 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true } } }, "typedoc-default-themes": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.5.tgz", - "integrity": "sha512-JQ2O9laZ/EhfWUWYp/8EyuShYhtXLhIa6DU8eZNUfaurMhEgKdffbadKNv6HMmTfOxAcgiePg06OCxNX8EyP3g==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.1.tgz", + "integrity": "sha512-6PEvV+/kWAJeUwEtrKgIsZQSbybW5DGCr6s2mMjHsDplpgN8iBHI52UbA+2C+c2TMCxBNMK9TMS6pdeIdwsLSw==", "dev": true }, "typescript": { @@ -26411,9 +26383,9 @@ "dev": true }, "uglify-js": { - "version": "3.12.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.5.tgz", - "integrity": "sha512-SgpgScL4T7Hj/w/GexjnBHi3Ien9WS1Rpfg5y91WXMj9SY997ZCQU76mH4TpLwwfmMvoOU8wiaRkIf6NaH3mtg==", + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.4.tgz", + "integrity": "sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index cf3e419e8d..e1cf5a5d58 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "process services-cloud" ], "dependencies": { - "@alfresco/js-api": "4.3.0-2e84309af123ae96cc85bd9683cb1ab9a7119c33", + "@alfresco/js-api": "^4.3.0-386fb73751610a15094a0d0938ab19456325d7c8", "@angular/animations": "^10.0.4", "@angular/cdk": "10.1.3", "@angular/common": "^10.0.4", @@ -166,11 +166,11 @@ "sass-loader": "10.1.1", "scss-bundle": "2.3.2", "selenium-webdriver": "4.0.0-alpha.7", - "stylelint": "^13.9.0", + "stylelint": "^13.8.0", "ts-node": "^9.0.0", "tsconfig-paths": "^3.9.0", "tslint": "6.1.3", - "typedoc": "^0.20.18", + "typedoc": "^0.20.14", "typescript": "3.9.7", "unist-util-select": "^3.0.2", "webpack-cli": "^3.3.12" diff --git a/scripts/ci/check-env/check-external-cs-env.sh b/scripts/ci/check-env/check-external-cs-env.sh new file mode 100755 index 0000000000..e2e6bcd6ab --- /dev/null +++ b/scripts/ci/check-env/check-external-cs-env.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +cd $DIR/../../../ + +echo "====== Check External ACS is UP =====" + +./node_modules/@alfresco/adf-cli/bin/adf-cli check-cs-env --host "$EXTERNAL_ACS_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 diff --git a/scripts/travis/e2e/content-services-e2e.sh b/scripts/travis/e2e/content-services-e2e.sh index 8bac93a815..bebbc34616 100755 --- a/scripts/travis/e2e/content-services-e2e.sh +++ b/scripts/travis/e2e/content-services-e2e.sh @@ -20,7 +20,7 @@ if [ "${TRAVIS_EVENT_TYPE}" == "pull_request" ]; then fi; #-b is needed to run the Folder upload test that are not workin in Headless chrome -RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --use-dist || exit 1) +RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --use-dist -m 4 || exit 1) if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" || "${TRAVIS_EVENT_TYPE}" == "api" ]]; then echo "Run all e2e $CONTEXT_ENV" $RUN_CHECK