diff --git a/.travis.yml b/.travis.yml index 453161a096..05bb0fd9bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,19 +43,20 @@ jobs: include: - stage: Warm Up Cache & Lint & Build Dist script: - if [[ $TRAVIS_PULL_REQUEST == "false" ]]; + - if [[ $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/npm-build-all.sh || exit 1); + ./scripts/lint.sh || exit 1; + ./scripts/npm-build-all.sh || exit 1; else - (./scripts/update-version.sh -gnu -alpha || exit 1); + ./scripts/update-version.sh -gnu -alpha || exit 1; npm install; - (./scripts/lint.sh || exit 1); - (rm -rf tmp && mkdir tmp); - (git merge-base origin/$TRAVIS_BRANCH HEAD > ./tmp/devhead.txt); - (./scripts/smart-build.sh -b $TRAVIS_BRANCH -gnu || exit 1); + ./scripts/lint.sh || exit 1; + rm -rf tmp && mkdir tmp; + git merge-base origin/$TRAVIS_BRANCH HEAD > ./tmp/devhead.txt; + ./scripts/smart-build.sh -b $TRAVIS_BRANCH -gnu || exit 1; fi; - (npm run build:dist || exit 1); - (./scripts/license-list-generator.sh || exit 1); + npm run build:dist || exit 1; + ./scripts/license-list-generator.sh || exit 1; - stage: Unit test name: core and extensions script: @@ -108,23 +109,31 @@ jobs: - stage: Update children projects dependency #Update generator-ng2-alfresco-app name: Update Generator if: tag =~ .*beta.* - script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n generator-ng2-alfresco-app + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n 'Alfresco/generator-ng2-alfresco-app' - stage: Update children projects dependency # Test Update alfresco-content-app name: Update ACA if: tag =~ .*beta.* - script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-content-app + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n 'Alfresco/alfresco-content-app' - stage: Update children projects dependency # Test Update adf-app-manager-ui name: Update adf-app-manager-ui if: tag =~ .*beta.* - script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n adf-app-manager-ui + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n 'Alfresco/adf-app-manager-ui' - stage: Update children projects dependency # Test Update alfresco-ng2-components name: Update alfresco-ng2-components if: tag =~ .*beta.* - script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-ng2-components + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n 'Alfresco/alfresco-ng2-components' - stage: Update children projects dependency # Test Update alfresco-modeler-app name: Update alfresco modeler app if: tag =~ .*beta.* - script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-modeler-app + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n 'Alfresco/alfresco-modeler-app' + - stage: Update children projects dependency # Test Update activiti-modeling-app + name: Update alfresco modeler activiti app + if: tag =~ .*beta.* + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n Activiti/activiti-modeling-app' + - stage: Update children projects dependency # Test alfresco-admin-app + name: Update alfresco modeler activiti app + if: tag =~ .*beta.* + script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n 'Alfresco/alfresco-admin-app' - stage: e2e Test # Test core name: core script: @@ -168,7 +177,8 @@ jobs: AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "process-services-cloud$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder process-services-cloud --skip-lint --use-dist || exit 1;); + node ./scripts/check-activiti-env.js --host "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --client 'activiti' || exit 1; + ./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder process-services-cloud --skip-lint --use-dist -timeout 8000 || exit 1; fi; - stage: e2e Test # Test insights name: insights diff --git a/cspell.json b/cspell.json index dcde13fef3..62f2f884db 100644 --- a/cspell.json +++ b/cspell.json @@ -125,7 +125,8 @@ "filedata", "uncheck", "subfolders", - "ECMBPM" + "ECMBPM", + "candidateuserapp" ], "dictionaries": [ "html", diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index 96bfb02028..5d1cc26da5 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -8,6 +8,7 @@ "contextRootBpm": "activiti-app", "authType" : "BASIC", "locale" : "en", + "notificationDefaultDuration" : 6000, "auth": { "withCredentials": false }, diff --git a/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts index 23e847942b..162ca97369 100644 --- a/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts @@ -82,10 +82,7 @@ export class FormCloudDemoComponent implements OnInit, OnDestroy { try { this.parseForm(); } catch (error) { - this.notificationService.openSnackMessage( - 'Wrong form configuration', - 4000 - ); + this.notificationService.openSnackMessage('Wrong form configuration'); } } diff --git a/demo-shell/src/app/components/cloud/start-process-cloud-demo.component.ts b/demo-shell/src/app/components/cloud/start-process-cloud-demo.component.ts index 9fff604ef6..47def2087a 100644 --- a/demo-shell/src/app/components/cloud/start-process-cloud-demo.component.ts +++ b/demo-shell/src/app/components/cloud/start-process-cloud-demo.component.ts @@ -55,9 +55,6 @@ export class StartProcessCloudDemoComponent implements OnInit { } openSnackMessage(event: any) { - this.notificationService.openSnackMessage( - event.response.body.message, - 4000 - ); + this.notificationService.openSnackMessage(event.response.body.message); } } diff --git a/demo-shell/src/app/components/cloud/start-task-cloud-demo.component.ts b/demo-shell/src/app/components/cloud/start-task-cloud-demo.component.ts index 516bd9bda2..25abc786ff 100644 --- a/demo-shell/src/app/components/cloud/start-task-cloud-demo.component.ts +++ b/demo-shell/src/app/components/cloud/start-task-cloud-demo.component.ts @@ -19,6 +19,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { NotificationService } from '@alfresco/adf-core'; import { CloudLayoutService } from './services/cloud-layout.service'; + @Component({ templateUrl: './start-task-cloud-demo.component.html', styleUrls: ['./start-task-cloud-demo.component.scss'] @@ -41,19 +42,16 @@ export class StartTaskCloudDemoComponent implements OnInit { } onStartTaskSuccess() { - this.cloudLayoutService.setCurrentTaskFilterParam({key: 'my-tasks'}); + this.cloudLayoutService.setCurrentTaskFilterParam({ key: 'my-tasks' }); this.router.navigate([`/cloud/${this.appName}/tasks`]); } onCancelStartTask() { - this.cloudLayoutService.setCurrentTaskFilterParam({key: 'my-tasks'}); + this.cloudLayoutService.setCurrentTaskFilterParam({ key: 'my-tasks' }); this.router.navigate([`/cloud/${this.appName}/tasks`]); } openSnackMessage(event: any) { - this.notificationService.openSnackMessage( - event.response.body.message, - 4000 - ); + this.notificationService.openSnackMessage(event.response.body.message); } } diff --git a/demo-shell/src/app/components/config-editor/config-editor.component.ts b/demo-shell/src/app/components/config-editor/config-editor.component.ts index 0c5de2da75..e83410d3c6 100644 --- a/demo-shell/src/app/components/config-editor/config-editor.component.ts +++ b/demo-shell/src/app/components/config-editor/config-editor.component.ts @@ -16,7 +16,12 @@ */ import { Component } from '@angular/core'; -import { AppConfigService, NotificationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core'; +import { + AppConfigService, + NotificationService, + UserPreferencesService, + UserPreferenceValues +} from '@alfresco/adf-core'; @Component({ selector: 'app-config-editor', @@ -60,16 +65,10 @@ export class ConfigEditorComponent { } } catch (error) { this.invalidJson = true; - this.notificationService.openSnackMessage( - 'Wrong Code configuration ' + error, - 1000 - ); + this.notificationService.openSnackMessage('Wrong Code configuration ' + error); } finally { if (!this.invalidJson) { - this.notificationService.openSnackMessage( - 'Saved', - 1000 - ); + this.notificationService.openSnackMessage('Saved'); } } } @@ -89,7 +88,7 @@ export class ConfigEditorComponent { this.isUserPreference = true; this.userPreferenceProperty = 'textOrientation'; - this.userPreferencesService.select( this.userPreferenceProperty).subscribe((textOrientation: number) => { + this.userPreferencesService.select(this.userPreferenceProperty).subscribe((textOrientation: number) => { this.code = JSON.stringify(textOrientation); this.field = 'textOrientation'; this.indentCode(); @@ -147,7 +146,7 @@ export class ConfigEditorComponent { this.indentCode(); } - editTaskFilterConfClick() { + editTaskFilterConfClick() { this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-edit-task-filter']); this.field = 'adf-edit-task-filter'; diff --git a/demo-shell/src/app/components/files/files.component.ts b/demo-shell/src/app/components/files/files.component.ts index ca3caef9b2..ef9fcc77d4 100644 --- a/demo-shell/src/app/components/files/files.component.ts +++ b/demo-shell/src/app/components/files/files.component.ts @@ -349,10 +349,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { } openSnackMessage(event: any) { - this.notificationService.openSnackMessage( - event, - 4000 - ); + this.notificationService.openSnackMessage(event); } emitReadyEvent(event: NodePaging) { @@ -579,10 +576,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { }); dialogInstance.componentInstance.error.subscribe((message) => { - this.notificationService.openSnackMessage( - message, - 6000 - ); + this.notificationService.openSnackMessage(message); }); } diff --git a/demo-shell/src/app/components/form/form.component.ts b/demo-shell/src/app/components/form/form.component.ts index f56a72baec..91335db20b 100644 --- a/demo-shell/src/app/components/form/form.component.ts +++ b/demo-shell/src/app/components/form/form.component.ts @@ -26,7 +26,7 @@ import { Subscription } from 'rxjs'; templateUrl: 'form.component.html', styleUrls: ['form.component.scss'], providers: [ - {provide: FormService, useClass: InMemoryFormService} + { provide: FormService, useClass: InMemoryFormService } ], encapsulation: ViewEncapsulation.None }) @@ -87,10 +87,7 @@ export class FormComponent implements OnInit, OnDestroy { try { this.parseForm(); } catch (error) { - this.notificationService.openSnackMessage( - 'Wrong form configuration', - 4000 - ); + this.notificationService.openSnackMessage('Wrong form configuration'); } } diff --git a/demo-shell/src/app/components/permissions/demo-permissions.component.ts b/demo-shell/src/app/components/permissions/demo-permissions.component.ts index c0bf66d7e2..d40bc426e0 100644 --- a/demo-shell/src/app/components/permissions/demo-permissions.component.ts +++ b/demo-shell/src/app/components/permissions/demo-permissions.component.ts @@ -70,10 +70,7 @@ export class DemoPermissionComponent implements OnInit { showErrorMessage(error) { const message = error.message ? error.message : error; - this.notificationService.openSnackMessage( - message, - 4000 - ); + this.notificationService.openSnackMessage(message); } } diff --git a/docs/core/services/notification.service.md b/docs/core/services/notification.service.md index e72c2070e6..676af8ef51 100644 --- a/docs/core/services/notification.service.md +++ b/docs/core/services/notification.service.md @@ -93,3 +93,11 @@ export class MyComponent implements OnInit { } } ``` +The default message duration is 5000 ms that is used only if you don't pass a custom duration in the parameters of openSnackMessageAction/openSnackMessage methods. +You can also change the default 5000 ms adding the following configuration in the app.config.json: + +```json + + "notificationDefaultDuration" : "7000" + +``` diff --git a/e2e/content-services/document-list/document-list-actions.e2e.ts b/e2e/content-services/document-list/document-list-actions.e2e.ts index fe1252430a..6cf7c63857 100644 --- a/e2e/content-services/document-list/document-list-actions.e2e.ts +++ b/e2e/content-services/document-list/document-list-actions.e2e.ts @@ -91,12 +91,11 @@ describe('Document List Component - Actions', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - browser.driver.sleep(15000); + browser.driver.sleep(10000); done(); }); beforeEach(async (done) => { - navigationBarPage.clickAboutButton(); navigationBarPage.clickContentServicesButton(); done(); }); diff --git a/e2e/content-services/permissions/site-permissions.e2e.ts b/e2e/content-services/permissions/site-permissions.e2e.ts index 57559bdb67..62ee1d85b1 100644 --- a/e2e/content-services/permissions/site-permissions.e2e.ts +++ b/e2e/content-services/permissions/site-permissions.e2e.ts @@ -99,9 +99,9 @@ describe('Permissions Component', function () { folderName = `MEESEEKS_${StringUtil.generateRandomString(5)}`; - const publicSiteBody = {visibility: 'PUBLIC', title: publicSiteName}; + const publicSiteBody = { visibility: 'PUBLIC', title: publicSiteName }; - const privateSiteBody = {visibility: 'PRIVATE', title: privateSiteName}; + const privateSiteBody = { visibility: 'PRIVATE', title: privateSiteName }; publicSite = await alfrescoJsApi.core.sitesApi.createSite(publicSiteBody); privateSite = await alfrescoJsApi.core.sitesApi.createSite(privateSiteBody); @@ -136,7 +136,6 @@ describe('Permissions Component', function () { privateSiteFile = await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'privateSite' + fileModel.name, privateSite.entry.guid); await alfrescoJsApi.core.nodesApi.updateNode(privateSiteFile.entry.id, - { permissions: { locallySet: [{ @@ -148,9 +147,7 @@ describe('Permissions Component', function () { }); await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'Site' + fileModel.name, siteFolder.entry.id); - done(); - }); afterAll(async (done) => { @@ -182,6 +179,9 @@ describe('Permissions Component', function () { permissionsPage.clickAddPermissionButton(); permissionsPage.checkAddPermissionDialogIsDisplayed(); permissionsPage.checkSearchUserInputIsDisplayed(); + + browser.sleep(7000); + permissionsPage.searchUserOrGroup(consumerUser.getId()); permissionsPage.clickUserOrGroup(consumerUser.getFirstName()); permissionsPage.checkUserOrGroupIsAdded(consumerUser.getId()); diff --git a/e2e/pages/adf/content-services/search/components/search-checkList.ts b/e2e/pages/adf/content-services/search/components/search-checkList.ts index 57c51e5660..635ec46dae 100644 --- a/e2e/pages/adf/content-services/search/components/search-checkList.ts +++ b/e2e/pages/adf/content-services/search/components/search-checkList.ts @@ -32,7 +32,7 @@ export class SearchCheckListPage { clickCheckListOption(option) { BrowserVisibility.waitUntilElementIsVisible(this.filter); - const result = this.filter.all(by.css(`mat-checkbox[data-automation-id*='-${option}'] .mat-checkbox-inner-container`)).first(); + const result = this.filter.all(by.css(`mat-checkbox[data-automation-id*='${option}'] .mat-checkbox-inner-container`)).first(); BrowserVisibility.waitUntilElementIsVisible(result); BrowserVisibility.waitUntilElementIsClickable(result); result.click(); diff --git a/e2e/pages/adf/notificationPage.ts b/e2e/pages/adf/notificationPage.ts index c52902a363..6a1dd33d29 100644 --- a/e2e/pages/adf/notificationPage.ts +++ b/e2e/pages/adf/notificationPage.ts @@ -28,7 +28,6 @@ export class NotificationPage { actionToggle = element(by.css('mat-slide-toggle[data-automation-id="notification-action-toggle"]')); notificationSnackBar = element.all(by.css('simple-snack-bar')).first(); actionOutput = element(by.css('div[data-automation-id="notification-action-output"]')); - customNotificationButton = element(by.css('button[data-automation-id="notification-custom-config-button"]')); selectionDropDown = element.all(by.css('.mat-select-panel')).first(); notificationsPage = element(by.css('a[data-automation-id="Notifications"]')); notificationConfig = element(by.css('p[data-automation-id="notification-custom-object"]')); @@ -98,8 +97,6 @@ export class NotificationPage { } clickNotificationButton() { - // BrowserVisibility.waitUntilElementIsVisible(this.customNotificationButton); - // this.customNotificationButton.click(); const button = browser.wait(until.elementLocated(by.css('button[data-automation-id="notification-custom-config-button"]'))); button.click(); } diff --git a/e2e/pages/adf/viewerPage.ts b/e2e/pages/adf/viewerPage.ts index 38b37971fc..74c511a6c5 100644 --- a/e2e/pages/adf/viewerPage.ts +++ b/e2e/pages/adf/viewerPage.ts @@ -132,7 +132,7 @@ export class ViewerPage { } checkFileIsLoaded() { - BrowserVisibility.waitUntilElementIsOnPage(this.pdfPageLoaded, 15000); + BrowserVisibility.waitUntilElementIsOnPage(this.pdfPageLoaded, 10000); } checkImgViewerIsDisplayed() { diff --git a/e2e/process-services-cloud/apps-section-cloud.e2e.ts b/e2e/process-services-cloud/apps-section-cloud.e2e.ts index 6d0db57d14..cac06b0c86 100644 --- a/e2e/process-services-cloud/apps-section-cloud.e2e.ts +++ b/e2e/process-services-cloud/apps-section-cloud.e2e.ts @@ -19,7 +19,6 @@ import { LoginSSOPage, SettingsPage } from '@alfresco/adf-testing'; import { AppListCloudPage } from '@alfresco/adf-testing'; import TestConfig = require('../test.config'); import { NavigationBarPage } from '../pages/adf/navigationBarPage'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Applications list', () => { @@ -28,11 +27,10 @@ describe('Applications list', () => { const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); const appListCloudPage = new AppListCloudPage(); - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; it('[C289910] Should the app be displayed on dashboard when is deployed on APS', () => { settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); navigationBarPage.navigateToProcessServicesCloudPage(); appListCloudPage.checkApsContainer(); diff --git a/e2e/process-services-cloud/edit-process-filters-component.e2e.ts b/e2e/process-services-cloud/edit-process-filters-component.e2e.ts index 97cf7bd761..faa07087ec 100644 --- a/e2e/process-services-cloud/edit-process-filters-component.e2e.ts +++ b/e2e/process-services-cloud/edit-process-filters-component.e2e.ts @@ -22,7 +22,6 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { AppListCloudPage } from '@alfresco/adf-testing'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Edit process filters cloud', () => { @@ -35,15 +34,13 @@ describe('Edit process filters cloud', () => { const tasksCloudDemoPage = new TasksCloudDemoPage(); const processCloudDemoPage = new ProcessCloudDemoPage(); - let silentLogin; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; - beforeAll(async () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + done(); }); beforeEach((done) => { diff --git a/e2e/process-services-cloud/edit-task-filters-component.e2e.ts b/e2e/process-services-cloud/edit-task-filters-component.e2e.ts index 60ec7ceb9e..e0d1194971 100644 --- a/e2e/process-services-cloud/edit-task-filters-component.e2e.ts +++ b/e2e/process-services-cloud/edit-task-filters-component.e2e.ts @@ -21,7 +21,6 @@ import { AppListCloudPage, StringUtil, ApiService, LoginSSOPage, TasksService, S import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Edit task filters cloud', () => { @@ -34,16 +33,13 @@ describe('Edit task filters cloud', () => { const tasksCloudDemoPage = new TasksCloudDemoPage(); let tasksService: TasksService; - let silentLogin; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); let assignedTask; - beforeAll(async () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); @@ -53,6 +49,7 @@ describe('Edit task filters cloud', () => { assignedTask = await tasksService.createStandaloneTask(assignedTaskName, simpleApp); await tasksService.claimTask(assignedTask.entry.id, simpleApp); await tasksService.createAndCompleteTask(completedTaskName, simpleApp); + done(); }); beforeEach((done) => { diff --git a/e2e/process-services-cloud/people-group-cloud-component.e2e.ts b/e2e/process-services-cloud/people-group-cloud-component.e2e.ts index ab2a36a925..6c523cded3 100644 --- a/e2e/process-services-cloud/people-group-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/people-group-cloud-component.e2e.ts @@ -39,7 +39,6 @@ describe('People Groups Cloud Component', () => { let groupIdentityService: GroupIdentityService; let rolesService: RolesService; - let silentLogin; let apsUser; let activitiUser; let noRoleUser; @@ -55,14 +54,14 @@ describe('People Groups Cloud Component', () => { let groups = []; let clientId; - beforeAll(async () => { + beforeAll(async (done) => { const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); await apiService.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); identityService = new IdentityService(apiService); rolesService = new RolesService(apiService); groupIdentityService = new GroupIdentityService(apiService); - clientId = await groupIdentityService.getClientIdByApplicationName(resources.ACTIVITI7_APPS.SIMPLE_APP); + clientId = await groupIdentityService.getClientIdByApplicationName(resources.ACTIVITI7_APPS.SIMPLE_APP.name); groupActiviti = await groupIdentityService.createIdentityGroup(); clientActivitiAdminRoleId = await rolesService.getClientRoleIdByRoleName(groupActiviti.id, clientId, CONSTANTS.ROLES.ACTIVITI_ADMIN); clientActivitiUserRoleId = await rolesService.getClientRoleIdByRoleName(groupActiviti.id, clientId, CONSTANTS.ROLES.ACTIVITI_USER); @@ -88,12 +87,11 @@ describe('People Groups Cloud Component', () => { await groupIdentityService.addClientRole(groupActiviti.id, clientId, clientActivitiAdminRoleId, CONSTANTS.ROLES.ACTIVITI_ADMIN ); users = [`${apsUser.idIdentityService}`, `${activitiUser.idIdentityService}`, `${noRoleUser.idIdentityService}`]; groups = [`${groupAps.id}`, `${groupActiviti.id}`, `${groupNoRole.id}`]; - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); navigationBarPage.navigateToPeopleGroupCloudPage(); + done(); }); afterAll(async () => { @@ -106,11 +104,14 @@ describe('People Groups Cloud Component', () => { }); beforeEach(() => { - browser.refresh(); peopleGroupCloudComponentPage.checkGroupsCloudComponentTitleIsDisplayed(); peopleGroupCloudComponentPage.checkPeopleCloudComponentTitleIsDisplayed(); }); + afterEach(() => { + browser.refresh(); + }); + it('[C297674] Add role filtering to PeopleCloudComponent', () => { peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); peopleGroupCloudComponentPage.clickPeopleCloudFilterRole(); @@ -188,7 +189,6 @@ describe('People Groups Cloud Component', () => { peopleGroupCloudComponentPage.clickPreselectValidation(); expect(peopleGroupCloudComponentPage.getPreselectValidationStatus()).toBe('true'); peopleGroupCloudComponentPage.enterPeoplePreselect(`[{"id":"${noRoleUser.idIdentityService}"}]`); - browser.sleep(100); expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); peopleGroupCloudComponentPage.clickPreselectValidation(); @@ -196,7 +196,6 @@ describe('People Groups Cloud Component', () => { peopleGroupCloudComponentPage.clickPreselectValidation(); expect(peopleGroupCloudComponentPage.getPreselectValidationStatus()).toBe('true'); peopleGroupCloudComponentPage.enterPeoplePreselect(`[{"email":"${apsUser.email}"}]`); - browser.sleep(100); expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); peopleGroupCloudComponentPage.clickPreselectValidation(); @@ -204,7 +203,6 @@ describe('People Groups Cloud Component', () => { peopleGroupCloudComponentPage.clickPreselectValidation(); expect(peopleGroupCloudComponentPage.getPreselectValidationStatus()).toBe('true'); peopleGroupCloudComponentPage.enterPeoplePreselect(`[{"username":"${activitiUser.username}"}]`); - browser.sleep(100); expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); peopleGroupCloudComponentPage.enterPeoplePreselect('[{"id":"12345","username":"someUsername","email":"someEmail"}]'); @@ -212,7 +210,6 @@ describe('People Groups Cloud Component', () => { expect(peopleGroupCloudComponentPage.getPreselectValidationStatus()).toBe('false'); peopleGroupCloudComponentPage.clickPreselectValidation(); expect(peopleGroupCloudComponentPage.getPreselectValidationStatus()).toBe('true'); - browser.sleep(100); expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(''); }); @@ -262,68 +259,11 @@ describe('People Groups Cloud Component', () => { expect(peopleGroupCloudComponentPage.getPreselectValidationStatus()).toBe('true'); peopleGroupCloudComponentPage.enterPeoplePreselect(`[{"firstName":"${apsUser.firstName}","lastName":"${apsUser.lastName},"` + `{"firstName":"${activitiUser.firstName}","lastName":"${activitiUser.lastName}",{"firstName":"${noRoleUser.firstName}","lastName":"${noRoleUser.lastName}"]`); - browser.sleep(100); + browser.sleep(200); expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(''); }); - it('[C305041] Should filter the People Single Selection with the Application name filter', () => { - peopleGroupCloudComponentPage.checkPeopleCloudSingleSelectionIsSelected(); - peopleGroupCloudComponentPage.clickPeopleFilerByApp(); - peopleGroupCloudComponentPage.enterPeopleAppName(resources.ACTIVITI7_APPS.SIMPLE_APP); - peopleCloudComponent.searchAssignee(`${activitiUser.firstName}`); - peopleCloudComponent.checkUserIsDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); - peopleCloudComponent.selectAssigneeFromList(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); - browser.sleep(100); - expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); - }); - - it('[C305041] Should filter the People Multiple Selection with the Application name filter', () => { - peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); - peopleGroupCloudComponentPage.clickPeopleFilerByApp(); - peopleGroupCloudComponentPage.enterPeopleAppName(resources.ACTIVITI7_APPS.SIMPLE_APP); - peopleCloudComponent.searchAssignee(`${apsUser.firstName}`); - peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); - peopleCloudComponent.selectAssigneeFromList(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); - peopleCloudComponent.checkSelectedPeople(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); - - peopleCloudComponent.searchAssigneeToExisting(`${activitiUser.firstName}`); - peopleCloudComponent.checkUserIsDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); - peopleCloudComponent.selectAssigneeFromList(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); - peopleCloudComponent.checkSelectedPeople(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); - - peopleCloudComponent.searchAssigneeToExisting(`${noRoleUser.firstName}`); - peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); - }); - - it('[C305041] Should filter the Groups Single Selection with the Application name filter', () => { - peopleGroupCloudComponentPage.clickGroupCloudSingleSelection(); - peopleGroupCloudComponentPage.clickGroupFilerByApp(); - peopleGroupCloudComponentPage.enterGroupAppName(resources.ACTIVITI7_APPS.SIMPLE_APP); - groupCloudComponentPage.searchGroups(`${groupActiviti.name}`); - groupCloudComponentPage.checkGroupIsDisplayed(`${groupActiviti.name}`); - groupCloudComponentPage.selectGroupFromList(`${groupActiviti.name}`); - expect(groupCloudComponentPage.getGroupsFieldContent()).toBe(`${groupActiviti.name}`); - }); - - it('[C305041] Should filter the Groups Multiple Selection with the Application name filter', () => { - peopleGroupCloudComponentPage.clickGroupCloudMultipleSelection(); - peopleGroupCloudComponentPage.clickGroupFilerByApp(); - peopleGroupCloudComponentPage.enterGroupAppName(resources.ACTIVITI7_APPS.SIMPLE_APP); - groupCloudComponentPage.searchGroups(`${groupAps.name}`); - groupCloudComponentPage.checkGroupIsDisplayed(`${groupAps.name}`); - groupCloudComponentPage.selectGroupFromList(`${groupAps.name}`); - groupCloudComponentPage.checkSelectedGroup(`${groupAps.name}`); - - groupCloudComponentPage.searchGroupsToExisting(`${groupActiviti.name}`); - groupCloudComponentPage.checkGroupIsDisplayed(`${groupActiviti.name}`); - groupCloudComponentPage.selectGroupFromList(`${groupActiviti.name}`); - groupCloudComponentPage.checkSelectedGroup(`${groupActiviti.name}`); - - groupCloudComponentPage.searchGroupsToExisting(`${groupNoRole.name}`); - groupCloudComponentPage.checkGroupIsNotDisplayed(`${groupNoRole.name}`); - }); - }); }); diff --git a/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts b/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts new file mode 100644 index 0000000000..58f2b5a6a0 --- /dev/null +++ b/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts @@ -0,0 +1,174 @@ +/*! + * @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 TestConfig = require('../test.config'); + +import { SettingsPage } from '@alfresco/adf-testing'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { PeopleGroupCloudComponentPage } from '../pages/adf/demo-shell/process-services/peopleGroupCloudComponentPage'; +import { GroupCloudComponentPage, PeopleCloudComponentPage } from '@alfresco/adf-testing'; +import { browser } from 'protractor'; +import { LoginSSOPage, IdentityService, GroupIdentityService, RolesService, ApiService } from '@alfresco/adf-testing'; +import CONSTANTS = require('../util/constants'); +import resources = require('../util/resources'); + +describe('People Groups Cloud Component', () => { + + describe('People Groups Cloud Component', () => { + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const peopleGroupCloudComponentPage = new PeopleGroupCloudComponentPage(); + const peopleCloudComponent = new PeopleCloudComponentPage(); + const groupCloudComponentPage = new GroupCloudComponentPage(); + let identityService: IdentityService; + let groupIdentityService: GroupIdentityService; + let rolesService: RolesService; + + let apsUser; + let activitiUser; + let noRoleUser; + let groupAps; + let groupActiviti; + let groupNoRole; + let apsUserRoleId; + let activitiUserRoleId; + let apsAdminRoleId; + let activitiAdminRoleId; + let clientActivitiAdminRoleId, clientActivitiUserRoleId; + let users = []; + let groups = []; + let clientId; + + beforeAll(async (done) => { + + const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); + await apiService.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + identityService = new IdentityService(apiService); + rolesService = new RolesService(apiService); + groupIdentityService = new GroupIdentityService(apiService); + clientId = await groupIdentityService.getClientIdByApplicationName(resources.ACTIVITI7_APPS.SIMPLE_APP.name); + groupActiviti = await groupIdentityService.createIdentityGroup(); + clientActivitiAdminRoleId = await rolesService.getClientRoleIdByRoleName(groupActiviti.id, clientId, CONSTANTS.ROLES.ACTIVITI_ADMIN); + clientActivitiUserRoleId = await rolesService.getClientRoleIdByRoleName(groupActiviti.id, clientId, CONSTANTS.ROLES.ACTIVITI_USER); + + apsUser = await identityService.createIdentityUser(); + apsUserRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.APS_USER); + await identityService.assignRole(apsUser.idIdentityService, apsUserRoleId, CONSTANTS.ROLES.APS_USER); + activitiUser = await identityService.createIdentityUser(); + activitiUserRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.ACTIVITI_USER); + await identityService.assignRole(activitiUser.idIdentityService, activitiUserRoleId, CONSTANTS.ROLES.ACTIVITI_USER); + noRoleUser = await identityService.createIdentityUser(); + await identityService.deleteClientRole(noRoleUser.idIdentityService, clientId, clientActivitiAdminRoleId, CONSTANTS.ROLES.ACTIVITI_ADMIN); + await identityService.deleteClientRole(noRoleUser.idIdentityService, clientId, clientActivitiUserRoleId, CONSTANTS.ROLES.ACTIVITI_USER); + + groupAps = await groupIdentityService.createIdentityGroup(); + apsAdminRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.APS_ADMIN); + await groupIdentityService.assignRole(groupAps.id, apsAdminRoleId, CONSTANTS.ROLES.APS_ADMIN); + activitiAdminRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.ACTIVITI_ADMIN); + await groupIdentityService.assignRole(groupActiviti.id, activitiAdminRoleId, CONSTANTS.ROLES.ACTIVITI_ADMIN); + groupNoRole = await groupIdentityService.createIdentityGroup(); + + await groupIdentityService.addClientRole(groupAps.id, clientId, clientActivitiAdminRoleId, CONSTANTS.ROLES.ACTIVITI_ADMIN ); + await groupIdentityService.addClientRole(groupActiviti.id, clientId, clientActivitiAdminRoleId, CONSTANTS.ROLES.ACTIVITI_ADMIN ); + users = [`${apsUser.idIdentityService}`, `${activitiUser.idIdentityService}`, `${noRoleUser.idIdentityService}`]; + groups = [`${groupAps.id}`, `${groupActiviti.id}`, `${groupNoRole.id}`]; + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); + loginSSOPage.clickOnSSOButton(); + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + navigationBarPage.navigateToPeopleGroupCloudPage(); + done(); + }); + + afterAll(async () => { + for (let i = 0; i < users.length; i++) { + await identityService.deleteIdentityUser(users[i]); + } + for (let i = 0; i < groups.length; i++) { + await groupIdentityService.deleteIdentityGroup(groups[i]); + } + }); + + beforeEach(() => { + peopleGroupCloudComponentPage.checkGroupsCloudComponentTitleIsDisplayed(); + peopleGroupCloudComponentPage.checkPeopleCloudComponentTitleIsDisplayed(); + }); + + afterEach(() => { + browser.refresh(); + }); + + it('[C305041] Should filter the People Single Selection with the Application name filter', () => { + peopleGroupCloudComponentPage.checkPeopleCloudSingleSelectionIsSelected(); + peopleGroupCloudComponentPage.clickPeopleFilerByApp(); + peopleGroupCloudComponentPage.enterPeopleAppName(resources.ACTIVITI7_APPS.SIMPLE_APP.name); + peopleCloudComponent.searchAssignee(`${activitiUser.firstName}`); + peopleCloudComponent.checkUserIsDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.selectAssigneeFromList(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + browser.sleep(100); + expect(peopleCloudComponent.getAssigneeFieldContent()).toBe(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + }); + + it('[C305041] Should filter the People Multiple Selection with the Application name filter', () => { + peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickPeopleFilerByApp(); + peopleGroupCloudComponentPage.enterPeopleAppName(resources.ACTIVITI7_APPS.SIMPLE_APP.name); + peopleCloudComponent.searchAssignee(`${apsUser.firstName}`); + peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + peopleCloudComponent.selectAssigneeFromList(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + peopleCloudComponent.checkSelectedPeople(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + + peopleCloudComponent.searchAssigneeToExisting(`${activitiUser.firstName}`); + peopleCloudComponent.checkUserIsDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.selectAssigneeFromList(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.checkSelectedPeople(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + + peopleCloudComponent.searchAssigneeToExisting(`${noRoleUser.firstName}`); + peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); + }); + + it('[C305041] Should filter the Groups Single Selection with the Application name filter', () => { + peopleGroupCloudComponentPage.clickGroupCloudSingleSelection(); + peopleGroupCloudComponentPage.clickGroupFilerByApp(); + peopleGroupCloudComponentPage.enterGroupAppName(resources.ACTIVITI7_APPS.SIMPLE_APP.name); + groupCloudComponentPage.searchGroups(`${groupActiviti.name}`); + groupCloudComponentPage.checkGroupIsDisplayed(`${groupActiviti.name}`); + groupCloudComponentPage.selectGroupFromList(`${groupActiviti.name}`); + expect(groupCloudComponentPage.getGroupsFieldContent()).toBe(`${groupActiviti.name}`); + }); + + it('[C305041] Should filter the Groups Multiple Selection with the Application name filter', () => { + peopleGroupCloudComponentPage.clickGroupCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickGroupFilerByApp(); + peopleGroupCloudComponentPage.enterGroupAppName(resources.ACTIVITI7_APPS.SIMPLE_APP.name); + groupCloudComponentPage.searchGroups(`${groupAps.name}`); + groupCloudComponentPage.checkGroupIsDisplayed(`${groupAps.name}`); + groupCloudComponentPage.selectGroupFromList(`${groupAps.name}`); + groupCloudComponentPage.checkSelectedGroup(`${groupAps.name}`); + + groupCloudComponentPage.searchGroupsToExisting(`${groupActiviti.name}`); + groupCloudComponentPage.checkGroupIsDisplayed(`${groupActiviti.name}`); + groupCloudComponentPage.selectGroupFromList(`${groupActiviti.name}`); + groupCloudComponentPage.checkSelectedGroup(`${groupActiviti.name}`); + + groupCloudComponentPage.searchGroupsToExisting(`${groupNoRole.name}`); + groupCloudComponentPage.checkGroupIsNotDisplayed(`${groupNoRole.name}`); + }); + + }); + +}); diff --git a/e2e/process-services-cloud/process-custom-filters.e2e.ts b/e2e/process-services-cloud/process-custom-filters.e2e.ts index 59e81da33e..f8f47655e8 100644 --- a/e2e/process-services-cloud/process-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/process-custom-filters.e2e.ts @@ -44,15 +44,12 @@ describe('Process list cloud', () => { let processInstancesService: ProcessInstancesService; let queryService: QueryService; - let silentLogin; let completedProcess, runningProcessInstance, switchProcessInstance, noOfApps; - const candidateuserapp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP; + const candidateuserapp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP.name; - beforeAll(async () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); navigationBarPage.clickConfigEditorButton(); @@ -87,8 +84,10 @@ describe('Process list cloud', () => { processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService.getProcessDefinitions(candidateuserapp); + processInstancesService = new ProcessInstancesService(apiService); await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, candidateuserapp); + runningProcessInstance = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, candidateuserapp); switchProcessInstance = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, candidateuserapp); @@ -99,9 +98,10 @@ describe('Process list cloud', () => { tasksService = new TasksService(apiService); const claimedTask = await tasksService.claimTask(task.list.entries[0].entry.id, candidateuserapp); await tasksService.completeTask(claimedTask.entry.id, candidateuserapp); + done(); }); - beforeEach((done) => { + beforeEach(async(done) => { navigationBarPage.navigateToProcessServicesCloudPage(); appListCloudComponent.checkApsContainer(); appListCloudComponent.goToApp(candidateuserapp); @@ -128,7 +128,7 @@ describe('Process list cloud', () => { }); }); - it('[C291783] Should display processes ordered by id when Id is selected from sort dropdown', async () => { + xit('[C291783] Should display processes ordered by id when Id is selected from sort dropdown', async () => { processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().setStatusFilterDropDown('RUNNING') .setSortFilterDropDown('Id').setOrderFilterDropDown('ASC'); processCloudDemoPage.processListCloudComponent().getDataTable().checkSpinnerIsDisplayed().checkSpinnerIsNotDisplayed(); diff --git a/e2e/process-services-cloud/process-filters-cloud.e2e.ts b/e2e/process-services-cloud/process-filters-cloud.e2e.ts index d345e942d7..c6625021c7 100644 --- a/e2e/process-services-cloud/process-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-filters-cloud.e2e.ts @@ -23,7 +23,6 @@ import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/p import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; import { AppListCloudPage } from '@alfresco/adf-testing'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Process filters cloud', () => { @@ -41,16 +40,13 @@ describe('Process filters cloud', () => { let processInstancesService: ProcessInstancesService; let queryService: QueryService; - let silentLogin; let runningProcess, completedProcess; - const simpleApp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP; + const simpleApp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP.name; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; - beforeAll(async () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); @@ -67,6 +63,7 @@ describe('Process filters cloud', () => { tasksService = new TasksService(apiService); const claimedTask = await tasksService.claimTask(task.list.entries[0].entry.id, simpleApp); await tasksService.completeTask(claimedTask.entry.id, simpleApp); + done(); }); beforeEach((done) => { diff --git a/e2e/process-services-cloud/process-header-cloud.e2e.ts b/e2e/process-services-cloud/process-header-cloud.e2e.ts index ba178a3b51..a28a9c25e7 100644 --- a/e2e/process-services-cloud/process-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-header-cloud.e2e.ts @@ -26,15 +26,14 @@ import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tas import { ProcessHeaderCloudPage } from '@alfresco/adf-testing'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Process Header cloud component', () => { describe('Process Header cloud component', () => { - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; - const subProcessApp = resources.ACTIVITI7_APPS.SUB_PROCESS_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const subProcessApp = resources.ACTIVITI7_APPS.SUB_PROCESS_APP.name; const formatDate = 'DD-MM-YYYY'; const processHeaderCloudPage = new ProcessHeaderCloudPage(); @@ -50,14 +49,11 @@ describe('Process Header cloud component', () => { let processInstancesService: ProcessInstancesService; let queryService: QueryService; - let silentLogin; let runningProcess, runningCreatedDate, parentCompleteProcess, childCompleteProcess, completedCreatedDate; beforeAll(async (done) => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); diff --git a/e2e/process-services-cloud/processList-cloud-component.e2e.ts b/e2e/process-services-cloud/processList-cloud-component.e2e.ts index 635d306e09..79521a5c27 100644 --- a/e2e/process-services-cloud/processList-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/processList-cloud-component.e2e.ts @@ -16,7 +16,13 @@ */ import TestConfig = require('../test.config'); -import { ProcessDefinitionsService, ProcessInstancesService, LoginSSOPage, ApiService, SettingsPage } from '@alfresco/adf-testing'; +import { + ProcessDefinitionsService, + ProcessInstancesService, + LoginSSOPage, + ApiService, + SettingsPage +} from '@alfresco/adf-testing'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { AppListCloudPage } from '@alfresco/adf-testing'; @@ -24,7 +30,6 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { ConfigEditorPage } from '../pages/adf/configEditorPage'; import { ProcessListCloudConfiguration } from './processListCloud.config'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Process list cloud', () => { @@ -40,16 +45,13 @@ describe('Process list cloud', () => { let processDefinitionService: ProcessDefinitionsService; let processInstancesService: ProcessInstancesService; - let silentLogin; - const candidateuserapp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP; + const candidateuserapp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP.name; let jsonFile; let runningProcess; - beforeAll(async () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); @@ -59,7 +61,7 @@ describe('Process list cloud', () => { const processDefinition = await processDefinitionService.getProcessDefinitions(candidateuserapp); processInstancesService = new ProcessInstancesService(apiService); runningProcess = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, candidateuserapp); - + done(); }); beforeEach(async (done) => { diff --git a/e2e/process-services-cloud/start-process-cloud.e2e.ts b/e2e/process-services-cloud/start-process-cloud.e2e.ts index e64d1d5476..b85c4ead48 100644 --- a/e2e/process-services-cloud/start-process-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-process-cloud.e2e.ts @@ -21,7 +21,6 @@ import TestConfig = require('../test.config'); import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { StringUtil } from '@alfresco/adf-testing'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Start Process', () => { @@ -37,16 +36,13 @@ describe('Start Process', () => { const processNameBiggerThen255Characters = StringUtil.generateRandomString(256); const lengthValidationError = 'Length exceeded, 255 characters max.'; const requiredError = 'Process Name is required', requiredProcessError = 'Process Definition is required'; - const processDefinition = 'processwithvariables'; + const processWithVariables = resources.ACTIVITI7_APPS.SIMPLE_APP.processes.processwithvariables; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; - let silentLogin; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; beforeAll((done) => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); navigationBarPage.navigateToProcessServicesCloudPage(); appListCloudComponent.checkApsContainer(); @@ -70,6 +66,7 @@ describe('Start Process', () => { }); it('[C291842] Should be displayed an error message if process name exceed 255 characters', () => { + appListCloudComponent.checkAppIsDisplayed(simpleApp); appListCloudComponent.goToApp(simpleApp); processCloudDemoPage.openNewProcessForm(); startProcessPage.enterProcessName(processName255Characters); @@ -110,7 +107,7 @@ describe('Start Process', () => { startProcessPage.blur(startProcessPage.processDefinition); startProcessPage.checkValidationErrorIsDisplayed(requiredProcessError); - startProcessPage.selectFromProcessDropdown(processDefinition); + startProcessPage.selectFromProcessDropdown(processWithVariables); startProcessPage.checkStartProcessButtonIsEnabled(); startProcessPage.clickStartProcessButton(); processCloudDemoPage.clickOnProcessFilters(); diff --git a/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts b/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts index 8f90db8838..d83a059f21 100644 --- a/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts @@ -22,7 +22,6 @@ import { LoginSSOPage, SettingsPage, AppListCloudPage, StringUtil, TaskHeaderCloudPage, StartTasksCloudPage, PeopleCloudComponentPage, TasksService, ApiService, IdentityService } from '@alfresco/adf-testing'; -import { browser } from 'protractor'; import { TaskDetailsCloudDemoPage } from '../pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage'; import resources = require('../util/resources'); @@ -46,9 +45,9 @@ describe('Start Task', () => { const requiredError = 'Field required'; const dateValidationError = 'Date format DD/MM/YYYY'; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; - let silentLogin, activitiUser; + let activitiUser; let tasksService: TasksService; let identityService: IdentityService; @@ -59,10 +58,8 @@ describe('Start Task', () => { tasksService = new TasksService(apiService); activitiUser = await identityService.createIdentityUser(); - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); done(); }); diff --git a/e2e/process-services-cloud/task-filters-cloud.e2e.ts b/e2e/process-services-cloud/task-filters-cloud.e2e.ts index 2faf69a557..7265805446 100644 --- a/e2e/process-services-cloud/task-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-filters-cloud.e2e.ts @@ -20,7 +20,6 @@ import TestConfig = require('../test.config'); import { LoginSSOPage, TasksService, ApiService, SettingsPage, AppListCloudPage, StringUtil } from '@alfresco/adf-testing'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Task filters cloud', () => { @@ -34,15 +33,12 @@ describe('Task filters cloud', () => { let tasksService: TasksService; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; - let silentLogin; const newTask = StringUtil.generateRandomString(5), completedTask = StringUtil.generateRandomString(5); - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; beforeAll(() => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); }); diff --git a/e2e/process-services-cloud/task-header-cloud.e2e.ts b/e2e/process-services-cloud/task-header-cloud.e2e.ts index 793931c7f1..3f80507399 100644 --- a/e2e/process-services-cloud/task-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-header-cloud.e2e.ts @@ -23,7 +23,6 @@ import moment = require('moment'); import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { LoginSSOPage, SettingsPage, AppListCloudPage, TaskHeaderCloudPage, TasksService } from '@alfresco/adf-testing'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { browser } from 'protractor'; import { TaskDetailsCloudDemoPage } from '../pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage'; import resources = require('../util/resources'); @@ -32,7 +31,7 @@ describe('Task Header cloud component', () => { const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; const basicCreatedTaskName = StringUtil.generateRandomString(), completedTaskName = StringUtil.generateRandomString(); let basicCreatedTask, basicCreatedDate, completedTask, completedCreatedDate, subTask, subTaskCreatedDate; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; const priority = 30, description = 'descriptionTask', formatDate = 'DD-MM-YYYY'; const taskHeaderCloudPage = new TaskHeaderCloudPage(); @@ -45,13 +44,9 @@ describe('Task Header cloud component', () => { const taskDetailsCloudDemoPage = new TaskDetailsCloudDemoPage(); let tasksService: TasksService; - let silentLogin; - beforeAll(async (done) => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); diff --git a/e2e/process-services-cloud/task-list-properties.e2e.ts b/e2e/process-services-cloud/task-list-properties.e2e.ts index 0643f96da9..cb2b86ff25 100644 --- a/e2e/process-services-cloud/task-list-properties.e2e.ts +++ b/e2e/process-services-cloud/task-list-properties.e2e.ts @@ -30,7 +30,6 @@ import moment = require('moment'); import { DateUtil } from '../util/dateUtil'; import { NotificationPage } from '../pages/adf/notificationPage'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Edit task filters and task list properties', () => { @@ -49,9 +48,8 @@ describe('Edit task filters and task list properties', () => { let processInstancesService: ProcessInstancesService; const notificationPage = new NotificationPage(); - let silentLogin; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; - const candidateUserApp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const candidateUserApp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP.name; const noTasksFoundMessage = 'No Tasks Found'; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; @@ -63,11 +61,9 @@ describe('Edit task filters and task list properties', () => { const afterDate = moment().add(1, 'days').format('DD/MM/YYYY'); beforeAll(async (done) => { - silentLogin = false; const jsonFile = new TaskListCloudConfiguration().getConfiguration(); - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); navigationBarPage.clickConfigEditorButton(); @@ -80,7 +76,7 @@ describe('Edit task filters and task list properties', () => { configEditorPage.clickEditTaskConfiguration(); configEditorPage.clickClearButton(); - browser.driver.sleep(5000); + configEditorPage.enterBigConfigurationText(`{ "filterProperties": [ "appName", @@ -305,7 +301,7 @@ describe('Edit task filters and task list properties', () => { tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); }); - it('[C297691] Task is not displayed when typing into lastModifiedFrom field a date before the task due date ' + + xit('[C297691] Task is not displayed when typing into lastModifiedFrom field a date before the task due date ' + 'and into lastModifiedTo a date before task due date', function () { tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); @@ -316,7 +312,7 @@ describe('Edit task filters and task list properties', () => { expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); }); - it('[C297692] Task is displayed when typing into lastModifiedFrom field a date before the tasks due date ' + + xit('[C297692] Task is displayed when typing into lastModifiedFrom field a date before the tasks due date ' + 'and into lastModifiedTo a date after', function () { tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); diff --git a/e2e/process-services-cloud/task-list-selection.e2e.ts b/e2e/process-services-cloud/task-list-selection.e2e.ts index 0d5ab39efa..f928f85367 100644 --- a/e2e/process-services-cloud/task-list-selection.e2e.ts +++ b/e2e/process-services-cloud/task-list-selection.e2e.ts @@ -36,18 +36,15 @@ describe('Task list cloud - selection', () => { let tasksService: TasksService; - let silentLogin; - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; const noOfTasks = 3; let response; const tasks = []; beforeAll(async (done) => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); diff --git a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts index 34d90047e5..e0b999725b 100644 --- a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts @@ -22,7 +22,6 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; import { AppListCloudPage } from '@alfresco/adf-testing'; -import { browser } from 'protractor'; import resources = require('../util/resources'); describe('Task filters cloud', () => { @@ -38,21 +37,18 @@ describe('Task filters cloud', () => { let processInstancesService: ProcessInstancesService; let queryService: QueryService; - let silentLogin; const createdTaskName = StringUtil.generateRandomString(), completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(), deletedTaskName = StringUtil.generateRandomString(); - const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP; + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; let assignedTask, deletedTask, suspendedTasks; const orderByNameAndPriority = ['cCreatedTask', 'dCreatedTask', 'eCreatedTask']; let priority = 30; const nrOfTasks = 3; - beforeAll(async () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); loginSSOPage.clickOnSSOButton(); - browser.ignoreSynchronization = true; loginSSOPage.loginSSOIdentityService(user, password); const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); @@ -83,6 +79,7 @@ describe('Task filters cloud', () => { await processInstancesService.suspendProcessInstance(processInstance.entry.id, simpleApp); await processInstancesService.deleteProcessInstance(secondProcessInstance.entry.id, simpleApp); await queryService.getProcessInstanceTasks(processInstance.entry.id, simpleApp); + done(); }); beforeEach(async (done) => { diff --git a/e2e/resources/aps2/candidateuserapp .zip b/e2e/resources/activiti7/candidateuserapp.zip similarity index 100% rename from e2e/resources/aps2/candidateuserapp .zip rename to e2e/resources/activiti7/candidateuserapp.zip diff --git a/e2e/resources/activiti7/simpleApp.zip b/e2e/resources/activiti7/simpleApp.zip new file mode 100644 index 0000000000..d27baa2f4e Binary files /dev/null and b/e2e/resources/activiti7/simpleApp.zip differ diff --git a/e2e/resources/activiti7/subProcessApp.zip b/e2e/resources/activiti7/subProcessApp.zip new file mode 100644 index 0000000000..6bf3c95510 Binary files /dev/null and b/e2e/resources/activiti7/subProcessApp.zip differ diff --git a/e2e/resources/aps2/simple_app.zip b/e2e/resources/aps2/simple_app.zip deleted file mode 100644 index 5648e87c20..0000000000 Binary files a/e2e/resources/aps2/simple_app.zip and /dev/null differ diff --git a/e2e/search/components/search-checkList.e2e.ts b/e2e/search/components/search-checkList.e2e.ts index ed7e381289..993ea719e0 100644 --- a/e2e/search/components/search-checkList.e2e.ts +++ b/e2e/search/components/search-checkList.e2e.ts @@ -18,8 +18,6 @@ import { LoginPage } from '@alfresco/adf-testing'; import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; -import { ConfigEditorPage } from '../../pages/adf/configEditorPage'; -import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; @@ -32,13 +30,12 @@ import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; import { StringUtil } from '@alfresco/adf-testing'; +import { setConfigField } from '../../proxy'; describe('Search Checklist Component', () => { const loginPage = new LoginPage(); const searchFiltersPage = new SearchFiltersPage(); - const configEditorPage = new ConfigEditorPage(); - const navigationBarPage = new NavigationBarPage(); const searchDialog = new SearchDialog(); const searchResults = new SearchResultsPage(); @@ -139,18 +136,13 @@ describe('Search Checklist Component', () => { jsonFile = searchConfiguration.getConfiguration(); }); - it('[C277143] Should be able to click show more/less button with pageSize set as default', () => { - navigationBarPage.clickConfigEditorButton(); - + fit('[C277143] Should be able to click show more/less button with pageSize set as default', async() => { for (let numberOfOptions = 0; numberOfOptions < 8; numberOfOptions++) { jsonFile.categories[1].component.settings.options.push({ 'name': 'Folder', 'value': "TYPE:'cm:folder'" }); } - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); - + await setConfigField('search', JSON.stringify(jsonFile)); +browser.sleep(2000); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -176,19 +168,14 @@ describe('Search Checklist Component', () => { browser.refresh(); }); - it('[C277144] Should be able to click show more/less button with pageSize set with a custom value', () => { - navigationBarPage.clickConfigEditorButton(); - + it('[C277144] Should be able to click show more/less button with pageSize set with a custom value', async() => { jsonFile.categories[1].component.settings.pageSize = 10; for (let numberOfOptions = 0; numberOfOptions < 8; numberOfOptions++) { jsonFile.categories[1].component.settings.options.push({ 'name': 'Folder', 'value': "TYPE:'cm:folder'" }); } - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -197,16 +184,9 @@ describe('Search Checklist Component', () => { searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsNotDisplayed(); - browser.refresh(); - - navigationBarPage.clickConfigEditorButton(); - jsonFile.categories[1].component.settings.pageSize = 11; - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -217,14 +197,9 @@ describe('Search Checklist Component', () => { browser.refresh(); - navigationBarPage.clickConfigEditorButton(); - jsonFile.categories[1].component.settings.pageSize = 9; - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -236,19 +211,14 @@ describe('Search Checklist Component', () => { browser.refresh(); }); - it('[C277145] Should be able to click show more/less button with pageSize set to zero', () => { - navigationBarPage.clickConfigEditorButton(); - + it('[C277145] Should be able to click show more/less button with pageSize set to zero', async() => { jsonFile.categories[1].component.settings.pageSize = 0; for (let numberOfOptions = 0; numberOfOptions < 8; numberOfOptions++) { jsonFile.categories[1].component.settings.options.push({ 'name': 'Folder', 'value': "TYPE:'cm:folder'" }); } - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -267,14 +237,9 @@ describe('Search Checklist Component', () => { browser.refresh(); - navigationBarPage.clickConfigEditorButton(); - delete jsonFile.categories[1].component.settings.pageSize; - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -309,15 +274,10 @@ describe('Search Checklist Component', () => { done(); }); - it('[C277018] Should be able to change the operator', () => { - navigationBarPage.clickConfigEditorButton(); - + it('[C277018] Should be able to change the operator', async() => { jsonFile.categories[1].component.settings.operator = 'AND'; - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); @@ -336,15 +296,10 @@ describe('Search Checklist Component', () => { browser.refresh(); }); - it('[C277019] Should be able to add new properties with different types', () => { - navigationBarPage.clickConfigEditorButton(); - + it('[C277019] Should be able to add new properties with different types', async() => { jsonFile.categories[1].component.settings.options.push({ 'name': filterType.custom, 'value': "TYPE:'cm:auditable'" }); - configEditorPage.clickSearchConfiguration(); - configEditorPage.clickClearButton(); - configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditorPage.clickSaveButton(); + await setConfigField('search', JSON.stringify(jsonFile)); searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); diff --git a/e2e/search/components/search-text.e2e.ts b/e2e/search/components/search-text.e2e.ts index 062e366c50..4be3776a00 100644 --- a/e2e/search/components/search-text.e2e.ts +++ b/e2e/search/components/search-text.e2e.ts @@ -68,7 +68,7 @@ describe('Search component - Text widget', () => { } }, {}, {}); - await browser.driver.sleep(10000); + await browser.driver.sleep(15000); loginPage.loginToContentServicesUsingUserModel(acsUser); diff --git a/e2e/search/search-page-component.e2e.ts b/e2e/search/search-page-component.e2e.ts index a684c9bc45..7b5114ab45 100644 --- a/e2e/search/search-page-component.e2e.ts +++ b/e2e/search/search-page-component.e2e.ts @@ -98,7 +98,7 @@ describe('Search component - Search Page', () => { await uploadActions.createEmptyFiles(this.alfrescoJsApi, adminFileNames, newFolderModelUploaded.entry.id); - browser.driver.sleep(15000); + browser.driver.sleep(10000); loginPage.loginToContentServicesUsingUserModel(acsUser); diff --git a/e2e/util/resources.js b/e2e/util/resources.js index 6f33c63c1f..de5bb79f6f 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -36,8 +36,8 @@ exports.Files = { } }, - APP_WITH_PROCESSES:{ - file_location:"/resources/apps/App_with_processes.zip", + APP_WITH_PROCESSES: { + file_location: "/resources/apps/App_with_processes.zip", title: "App_with_processes", description: "Description for app", process_se_name: "process_with_se", @@ -45,15 +45,15 @@ exports.Files = { task_name: "Task Test 2" }, - APP_DYNAMIC_TABLE_DROPDOWN:{ - file_location:"/resources/apps/AppDynamicTableDropdown.zip", + APP_DYNAMIC_TABLE_DROPDOWN: { + file_location: "/resources/apps/AppDynamicTableDropdown.zip", title: "App3576", description: "Description for app", processName: "Process3576" }, - APP_WITH_USER_WIDGET:{ - file_location:"/resources/apps/appWithUser.zip", + APP_WITH_USER_WIDGET: { + file_location: "/resources/apps/appWithUser.zip", title: "appWithUser", description: "Description for app", processName: "ProcessWithUser", @@ -361,7 +361,7 @@ exports.Files = { last_page_number: "8", password: "1q2w3e4r" }, - LARGE_FILE:{ + LARGE_FILE: { file_location: "/resources/adf/BigFile.zip", file_name: "BigFile.zip" }, @@ -454,15 +454,15 @@ exports.Files = { file_location: "/resources/adf/allFileTypes/a_zip_file.mp4.zip", file_name: "a_zip_file.mp4.zip" }, - PAGES:{ + PAGES: { file_location: "/resources/adf/allFileTypes/file_unsupported.pages", file_name: "file_unsupported.pages" }, - UNSUPPORTED:{ + UNSUPPORTED: { file_location: "/resources/adf/allFileTypes/file_unsupported.3DS", file_name: "file_unsupported.3DS" }, - INI:{ + INI: { file_location: "/resources/adf/allFileTypes/desktop.ini", file_name: "desktop.ini" }, @@ -514,7 +514,20 @@ exports.Files = { }; exports.ACTIVITI7_APPS = { - CANDIDATE_USER_APP : "candidateuserapp", - SIMPLE_APP : "simple-app", - SUB_PROCESS_APP : "subprocess-app" + CANDIDATE_USER_APP: { + name: "candidateuserapp", + file_location: "/resources/activiti7/candidateuserapp.zip" + }, + SIMPLE_APP: { + name: "simpleapp", + file_location: "/resources/activiti7/simpleApp.zip", + processes: { + processwithvariables: "processwithvariables", + simpleProcess: "simpleProcess" + } + }, + SUB_PROCESS_APP: { + name: "subprocess-app", + file_location: "/resources/activiti7/subProcessApp.zip", + } }; diff --git a/lib/core/app-config/app-config.service.ts b/lib/core/app-config/app-config.service.ts index e7e08cf4c4..d9f7247701 100644 --- a/lib/core/app-config/app-config.service.ts +++ b/lib/core/app-config/app-config.service.ts @@ -38,7 +38,8 @@ export enum AppConfigValues { LOGIN_ROUTE = 'loginRoute', DISABLECSRF = 'disableCSRF', AUTH_WITH_CREDENTIALS = 'auth.withCredentials', - APPLICATION = 'application' + APPLICATION = 'application', + NOTIFY_DURATION = 'notificationDefaultDuration' } export enum Status { diff --git a/lib/core/clipboard/clipboard.service.spec.ts b/lib/core/clipboard/clipboard.service.spec.ts index dcea0aedae..8c97214ddf 100644 --- a/lib/core/clipboard/clipboard.service.spec.ts +++ b/lib/core/clipboard/clipboard.service.spec.ts @@ -21,6 +21,11 @@ import { AppConfigService } from '../app-config/app-config.service'; import { TestBed } from '@angular/core/testing'; import { ClipboardModule } from './clipboard.module'; import { ClipboardService } from './clipboard.service'; +import { TranslationService } from '../services/translation.service'; +import { AppConfigServiceMock } from '../mock/app-config.service.mock'; +import { HttpClientModule } from '@angular/common/http'; +import { MatSnackBarModule } from '@angular/material'; +import { TranslationMock } from '@alfresco/adf-core'; describe('ClipboardService', () => { let clipboardService: ClipboardService; @@ -30,20 +35,15 @@ describe('ClipboardService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - ClipboardModule + ClipboardModule, + HttpClientModule, + MatSnackBarModule ], providers: [ LogService, - NotificationService, - { - provide: AppConfigService, - useValue: new AppConfigService(null) - - }, - { - provide: NotificationService, - useValue: new NotificationService(null, null) - } + { provide: TranslationService, useClass: TranslationMock }, + { provide: AppConfigService, useClass: AppConfigServiceMock }, + NotificationService ] }); }); diff --git a/lib/core/services/notification.service.spec.ts b/lib/core/services/notification.service.spec.ts index 7d2eb3f3b3..fba92dbce9 100644 --- a/lib/core/services/notification.service.spec.ts +++ b/lib/core/services/notification.service.spec.ts @@ -25,6 +25,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NotificationService } from './notification.service'; import { TranslationMock } from '../mock/translation.service.mock'; import { TranslationService } from './translation.service'; +import { HttpClientModule } from '@angular/common/http'; @Component({ template: '', @@ -76,7 +77,8 @@ describe('NotificationService', () => { imports: [ NoopAnimationsModule, OverlayModule, - MatSnackBarModule + MatSnackBarModule, + HttpClientModule ], declarations: [ProvidesNotificationServiceComponent], providers: [ diff --git a/lib/core/services/notification.service.ts b/lib/core/services/notification.service.ts index bbc7b9d0f4..f71527e4aa 100644 --- a/lib/core/services/notification.service.ts +++ b/lib/core/services/notification.service.ts @@ -18,16 +18,20 @@ import { Injectable } from '@angular/core'; import { MatSnackBar, MatSnackBarRef, MatSnackBarConfig } from '@angular/material'; import { TranslationService } from './translation.service'; +import { AppConfigService, AppConfigValues } from '../app-config/app-config.service'; @Injectable({ providedIn: 'root' }) export class NotificationService { - static DEFAULT_DURATION_MESSAGE: number = 5000; + DEFAULT_DURATION_MESSAGE: number = 5000; constructor(private snackBar: MatSnackBar, - private translationService: TranslationService) { + private translationService: TranslationService, + private appConfigService: AppConfigService) { + this.DEFAULT_DURATION_MESSAGE = this.appConfigService.get(AppConfigValues.NOTIFY_DURATION) || this.DEFAULT_DURATION_MESSAGE; + } /** @@ -36,7 +40,10 @@ export class NotificationService { * @param config Time before notification disappears after being shown or MatSnackBarConfig object * @returns Information/control object for the SnackBar */ - openSnackMessage(message: string, config: number | MatSnackBarConfig = NotificationService.DEFAULT_DURATION_MESSAGE): MatSnackBarRef { + openSnackMessage(message: string, config?: number | MatSnackBarConfig): MatSnackBarRef { + if (!config) { + config = this.DEFAULT_DURATION_MESSAGE; + } const translatedMessage = this.translationService.instant(message); @@ -56,7 +63,10 @@ export class NotificationService { * @param config Time before notification disappears after being shown or MatSnackBarConfig object * @returns Information/control object for the SnackBar */ - openSnackMessageAction(message: string, action: string, config: number | MatSnackBarConfig = NotificationService.DEFAULT_DURATION_MESSAGE): MatSnackBarRef { + openSnackMessageAction(message: string, action: string, config?: number | MatSnackBarConfig): MatSnackBarRef { + if (!config) { + config = this.DEFAULT_DURATION_MESSAGE; + } const translatedMessage = this.translationService.instant(message); diff --git a/lib/process-services-cloud/src/lib/form/form-cloud.module.ts b/lib/process-services-cloud/src/lib/form/form-cloud.module.ts index e64a6dc8f7..b26be954e2 100644 --- a/lib/process-services-cloud/src/lib/form/form-cloud.module.ts +++ b/lib/process-services-cloud/src/lib/form/form-cloud.module.ts @@ -24,7 +24,7 @@ import { FormCloudComponent } from './components/form-cloud.component'; import { UploadCloudWidgetComponent } from './components/upload-cloud.widget'; import { MaterialModule } from '../material.module'; import { TaskFormCloudComponent } from './components/task-form-cloud.component'; -import { TaskModule } from '../task/task.module'; +import { TaskCloudModule } from '../task/task-cloud.module'; @NgModule({ imports: [ @@ -37,7 +37,7 @@ import { TaskModule } from '../task/task.module'; ReactiveFormsModule, FormBaseModule, CoreModule, - TaskModule + TaskCloudModule ], declarations: [FormCloudComponent, UploadCloudWidgetComponent, TaskFormCloudComponent], entryComponents: [ diff --git a/lib/process-services-cloud/src/lib/task/task-cloud.module.ts b/lib/process-services-cloud/src/lib/task/task-cloud.module.ts index 9f7e2882fb..ce53b22747 100644 --- a/lib/process-services-cloud/src/lib/task/task-cloud.module.ts +++ b/lib/process-services-cloud/src/lib/task/task-cloud.module.ts @@ -20,19 +20,22 @@ import { TaskListCloudModule } from './task-list/task-list-cloud.module'; import { TaskFiltersCloudModule } from './task-filters/task-filters-cloud.module'; import { StartTaskCloudModule } from './start-task/start-task-cloud.module'; import { TaskHeaderCloudModule } from './task-header/task-header-cloud.module'; +import { TaskDirectiveModule } from './directives/task-directive.module'; @NgModule({ imports: [ TaskListCloudModule, TaskFiltersCloudModule, StartTaskCloudModule, - TaskHeaderCloudModule + TaskHeaderCloudModule, + TaskDirectiveModule ], exports: [ TaskListCloudModule, TaskFiltersCloudModule, StartTaskCloudModule, - TaskHeaderCloudModule + TaskHeaderCloudModule, + TaskDirectiveModule ] }) export class TaskCloudModule { } diff --git a/lib/testing/src/lib/process-services-cloud/actions/process-definitions.service.ts b/lib/testing/src/lib/process-services-cloud/actions/process-definitions.service.ts index 6a7f83d819..8176bc9c85 100644 --- a/lib/testing/src/lib/process-services-cloud/actions/process-definitions.service.ts +++ b/lib/testing/src/lib/process-services-cloud/actions/process-definitions.service.ts @@ -31,7 +31,17 @@ export class ProcessDefinitionsService { const queryParams = {}; - const data = await this.api.performBpmOperation(path, method, queryParams, {}); - return data; + try { + const data = await this.api.performBpmOperation(path, method, queryParams, {}); + return data; + } catch (error) { + if (error.status === 404) { + // tslint:disable-next-line:no-console + console.log(`${appName} not present`); + } else if (error.status === 403) { + // tslint:disable-next-line:no-console + console.log(`Access to the requested resource has been denied ${appName}`); + } + } } } diff --git a/lib/testing/src/lib/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts index 423f6cd83b..5c56734899 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts @@ -41,7 +41,7 @@ export class EditProcessFilterCloudComponentPage { checkCustomiseFilterHeaderIsExpanded() { const expansionPanelExtended = element.all(by.css('mat-expansion-panel-header[class*="mat-expanded"]')).first(); BrowserVisibility.waitUntilElementIsVisible(expansionPanelExtended); - const content = element(by.css('div[class*="mat-expansion-panel-content "][style*="visible"]')); + const content = element.all(by.css('div[class*="mat-expansion-panel-content "][style*="visible"]')).first(); BrowserVisibility.waitUntilElementIsVisible(content); return this; } diff --git a/lib/testing/src/lib/process-services-cloud/pages/group-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/group-cloud-component.page.ts index 2ee1e1c1f5..2616d7a9d2 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/group-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/group-cloud-component.page.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { by, element, protractor } from 'protractor'; +import { browser, by, element, protractor } from 'protractor'; import { BrowserVisibility } from '../../core/browser-visibility'; export class GroupCloudComponentPage { @@ -24,6 +24,7 @@ export class GroupCloudComponentPage { searchGroups(name) { BrowserVisibility.waitUntilElementIsVisible(this.groupCloudSearch); + browser.sleep(1000); this.groupCloudSearch.clear().then(() => { for (let i = 0; i < name.length; i++) { this.groupCloudSearch.sendKeys(name[i]); @@ -53,6 +54,7 @@ export class GroupCloudComponentPage { selectGroupFromList(name) { const groupRow = element.all(by.cssContainingText('mat-option span', name)).first(); BrowserVisibility.waitUntilElementIsVisible(groupRow); + browser.sleep(1000); groupRow.click(); BrowserVisibility.waitUntilElementIsNotVisible(groupRow); return this; diff --git a/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts index 13f38b45e4..b43495f0aa 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { by, element, protractor } from 'protractor'; +import { browser, by, element, protractor } from 'protractor'; import { BrowserVisibility } from '../../core/browser-visibility'; export class PeopleCloudComponentPage { @@ -34,6 +34,7 @@ export class PeopleCloudComponentPage { searchAssignee(name) { BrowserVisibility.waitUntilElementIsVisible(this.peopleCloudSearch); BrowserVisibility.waitUntilElementIsClickable(this.peopleCloudSearch); + browser.sleep(1000); this.peopleCloudSearch.clear().then(() => { for (let i = 0; i < name.length; i++) { this.peopleCloudSearch.sendKeys(name[i]); @@ -57,6 +58,7 @@ export class PeopleCloudComponentPage { selectAssigneeFromList(name) { const assigneeRow = element(by.cssContainingText('mat-option span.adf-people-label-name', name)); BrowserVisibility.waitUntilElementIsVisible(assigneeRow); + browser.sleep(1000); assigneeRow.click(); BrowserVisibility.waitUntilElementIsNotVisible(assigneeRow); return this; @@ -86,6 +88,7 @@ export class PeopleCloudComponentPage { getAssigneeFieldContent() { BrowserVisibility.waitUntilElementIsVisible(this.assigneeField); + browser.sleep(1000); return this.assigneeField.getAttribute('value'); } diff --git a/lib/testing/src/lib/process-services-cloud/pages/process-header-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/process-header-cloud-component.page.ts index 83579432b9..e741e51973 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/process-header-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/process-header-cloud-component.page.ts @@ -24,8 +24,8 @@ export class ProcessHeaderCloudPage { nameField = element.all(by.css('span[data-automation-id*="name"] span')).first(); statusField = element(by.css('span[data-automation-id*="status"] span')); initiatorField = element(by.css('span[data-automation-id*="initiator"] span')); - startDateField = element(by.css('span[data-automation-id*="startDate"] span')); - lastModifiedField = element(by.css('span[data-automation-id*="lastModified"] span')); + startDateField = element.all(by.css('span[data-automation-id*="startDate"] span')).first(); + lastModifiedField = element.all(by.css('span[data-automation-id*="lastModified"] span')).first(); parentIdField = element(by.css('span[data-automation-id*="parentId"] span')); businessKeyField = element.all(by.css('span[data-automation-id*="businessKey"] span')).first(); diff --git a/lib/testing/src/lib/process-services-cloud/pages/start-process-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/start-process-cloud-component.page.ts index a3ab574fa3..5a48996e8d 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/start-process-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/start-process-cloud-component.page.ts @@ -86,6 +86,7 @@ export class StartProcessCloudPage { } checkStartProcessButtonIsEnabled() { + BrowserVisibility.waitUntilElementIsClickable(this.startProcessButton); expect(this.startProcessButton.isEnabled()).toBe(true); } diff --git a/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts index 47ec6963ea..0d483a62f0 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts @@ -27,7 +27,7 @@ export class StartTasksCloudPage { startButton = element(by.css('button[id="button-start"]')); startButtonEnabled = element(by.css('button[id="button-start"]:not(disabled)')); cancelButton = element(by.css('button[id="button-cancel"]')); - form = element(by.css('adf-cloud-start-task form')); + form = element.all(by.css('adf-cloud-start-task form')).first(); checkFormIsDisplayed() { BrowserVisibility.waitUntilElementIsVisible(this.form); diff --git a/lib/testing/src/lib/process-services-cloud/pages/task-header-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/task-header-cloud-component.page.ts index 34b935ed6e..192361ef68 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/task-header-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/task-header-cloud-component.page.ts @@ -23,7 +23,7 @@ export class TaskHeaderCloudPage { assigneeField = element(by.css('span[data-automation-id*="assignee"] span')); statusField = element(by.css('span[data-automation-id*="status"] span')); priorityField = element(by.css('span[data-automation-id*="priority"] span')); - dueDateField = element(by.css('span[data-automation-id*="dueDate"] span')); + dueDateField = element.all(by.css('span[data-automation-id*="dueDate"] span')).first(); categoryField = element(by.css('span[data-automation-id*="category"] span')); createdField = element(by.css('span[data-automation-id="card-dateitem-created"] span')); parentNameField = element(by.css('span[data-automation-id*="parentName"] span')); diff --git a/package-lock.json b/package-lock.json index 06149ed9bc..8544d55b76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,69 +1,69 @@ { "name": "alfresco-components", - "version": "3.2.0-beta3", + "version": "3.2.0-beta6", "lockfileVersion": 1, "requires": true, "dependencies": { "@alfresco/adf-content-services": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-3.2.0-beta3.tgz", - "integrity": "sha512-OVPpclIBbJjFmRPXD8fGGBk0t7i6Avz3Xuk/DjgxFZfJdJDEb+it2KSPR4wT38NZS95vJHtB6TCfh76rMQJzHQ==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-3.2.0-beta6.tgz", + "integrity": "sha512-ENQKbCZ8p6mOHFijS5gDIoUZHdX7nSQw87I9U1qxZA85/5Y7tOz58ZmRhA6tathN2S/D6nsXgAqql+y6HGCdTw==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-core": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-3.2.0-beta3.tgz", - "integrity": "sha512-lT7c9QYatJS4x3oAupgiASCGvzQyowZWBoYu32YctS/F6876QAPPaegjkRxqitWjfvs7aXRaCYydb5BoDeLkRg==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-3.2.0-beta6.tgz", + "integrity": "sha512-DCe2FLGL3UnRCQ7cnxHKZhmK3inWaERhguTl2WIwEWl2wmyJoDd2tDQrc2cfIdjNrqpz3D6yJQdFtExv4XseKw==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-extensions": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-3.2.0-beta3.tgz", - "integrity": "sha512-TEguuRhzbj6cAeawLJqcK0o8lNzeRO7Pmw9Paxeu9m5RtQEPfvwGydDrlDGWnJ3H5Xx8byxhERIgdOfuK2SWTg==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-3.2.0-beta6.tgz", + "integrity": "sha512-fPN2kf7NyWU9FvmE9KHayKG87RZEUIzhXRAHGgCuXMzjXsJdddPoNF8c9cvb03MfEFuGHU6cHR75x2Td+GL94w==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-insights": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-3.2.0-beta3.tgz", - "integrity": "sha512-19zsI39GREZ6fzvs+4fw0FktMSLz6qSq8P2+QTRUThvtL1KZFLeW76BEZPX19YG/K0OuQvuLTXKt2tsf1CChRw==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-3.2.0-beta6.tgz", + "integrity": "sha512-i3ak+KZFVaNaikoa0hrF+U/v5y/YUuPFJTFGg32wsRtfeJuCC4IhcyRx6VHRO4QIwnhVKSDh1QPx86DjKpW44Q==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-process-services": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-3.2.0-beta3.tgz", - "integrity": "sha512-rwJLBrrRI+ndHa7H+RMMlLtbs44yR4Y1pMOCnfchqtGD1m7G/D2g/n5WHo7fp832rU8RP3yw/ZEz4WzMZuxcfA==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-3.2.0-beta6.tgz", + "integrity": "sha512-QfwhCR6Ykk4ny5NAMwtDAs+UkaGopvmyAwcFglim/RwQJKF3MnFG/gX0K/p6eJDzDRZhoumfzh+I/mBU5DVk9Q==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-process-services-cloud": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services-cloud/-/adf-process-services-cloud-3.2.0-beta3.tgz", - "integrity": "sha512-j0QWbMBvGN/zRfI0L7V+uXQvY8pSBnOsvBpUEh889WPlf/XWacfKC+a08/UHH5l0YRuWdn4H7cenYrMewdzgiA==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services-cloud/-/adf-process-services-cloud-3.2.0-beta6.tgz", + "integrity": "sha512-lhqU/n1AptJm3ALYImdCj1VpvVbllT8qyBCO/yQN9W+GrRNGnapZh8H7sS1JwTgRkfJMqRAUWQpnlWc1sEK/JA==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/adf-testing": { - "version": "3.2.0-beta3", - "resolved": "https://registry.npmjs.org/@alfresco/adf-testing/-/adf-testing-3.2.0-beta3.tgz", - "integrity": "sha512-aB4duKaP4CUms90FrvNyL6xunjTHguwYlTlF+/ImqmEZbS0gIvFajyzEbSv0xbtFJRbuYWVQTh41ad6n2vml9A==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/adf-testing/-/adf-testing-3.2.0-beta6.tgz", + "integrity": "sha512-xweqGzrgK2lvzQONc3ZC4cXWsLXTmesr1oybEu06FbK9MkXf+aUlGvCG3hLueYkU3GwnLRFu9ZsDnRCH8ZIwfA==", "requires": { "tslib": "^1.9.0" } }, "@alfresco/js-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-3.1.0.tgz", - "integrity": "sha512-kjh2vmbZ2LImNVUOfmYz6kZPcv/8IoMFLtOOcL5IrBg6PdYxYlmjAw5Gs/5wlNHuqSnZe6nNfZCPlmYDxsL6aQ==", + "version": "3.2.0-beta6", + "resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-3.2.0-beta6.tgz", + "integrity": "sha512-XWsA5lTcrJ5WOeXvej/TAh9NEyExue4SO07RvLNNU+NKB8lW/3V0N29V8I15daquh4eJWi783SJz+24Pbp6Edw==", "requires": { "event-emitter": "0.3.4", "superagent": "3.8.2" @@ -9534,21 +9534,6 @@ "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", "dev": true }, - "jasmine-fail-fast": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jasmine-fail-fast/-/jasmine-fail-fast-2.0.0.tgz", - "integrity": "sha1-5dguaimiX2YsZA5MMnDC+acTh+c=", - "requires": { - "lodash": "3.10.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.0.tgz", - "integrity": "sha1-k9UcZygopEFqEq9XIguoqHN+L7s=" - } - } - }, "jasmine-reporters": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", @@ -13958,14 +13943,6 @@ } } }, - "protractor-fail-fast": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/protractor-fail-fast/-/protractor-fail-fast-3.1.0.tgz", - "integrity": "sha512-OjuIFmY7hm5R/Msmioyg3aBevySpmpIgtm2TGUvMEqTzviPk/Fqd1HYmMjIQ+NzFMzrK+93LJa4civDvw1+hEg==", - "requires": { - "jasmine-fail-fast": "~2.0.0" - } - }, "protractor-html-reporter-2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/protractor-html-reporter-2/-/protractor-html-reporter-2-1.0.4.tgz", diff --git a/scripts/check-activiti-env.js b/scripts/check-activiti-env.js new file mode 100755 index 0000000000..f87a0078a4 --- /dev/null +++ b/scripts/check-activiti-env.js @@ -0,0 +1,188 @@ +let path = require('path'); +let fs = require('fs'); +let alfrescoApi = require('@alfresco/js-api'); +let program = require('commander'); +let ACTIVITI7_APPS = require('../e2e/util/resources').ACTIVITI7_APPS; + +let config = {}; +let absentApps = []; +let host; + +async function main() { + + program + .version('0.1.0') + .option('--host [type]', 'Remote environment host adf.lab.com ') + .option('--client [type]', 'clientId ') + .option('-p, --password [type]', 'password ') + .option('-u, --username [type]', 'username ') + .parse(process.argv); + + config = { + provider: 'BPM', + hostBpm: `http://${program.host}`, + authType: 'OAUTH', + oauth2: { + host: `http://${program.host}/auth/realms/alfresco`, + clientId: program.client, + scope: 'openid', + secret: '', + implicitFlow: false, + silentLogin: false, + redirectUri: '/', + redirectUriLogout: '/logout' + } + }; + + host = program.host; + + try { + this.alfrescoJsApi = new alfrescoApi.AlfrescoApiCompatibility(config); + await this.alfrescoJsApi.login(program.username, program.password); + } catch (e) { + console.log('Login error' + e); + } + + let appsDeployed = await getDeployedApplicationsByStatus(this.alfrescoJsApi, 'RUNNING'); + + Object.keys(ACTIVITI7_APPS).forEach((key) => { + let isPresent = appsDeployed.find((currentApp) => { + return ACTIVITI7_APPS[key].name === currentApp.entry.name; + }); + + if (!isPresent) { + absentApps.push(ACTIVITI7_APPS[key]); + } + }); + + if (absentApps.length > 0) { + console.log(`The following apps are missing in the target env ${JSON.stringify(absentApps)}`) + + await checkIfAppIsReleased(this.alfrescoJsApi, absentApps); + + process.exit(1); + } +} + +async function checkIfAppIsReleased(apiService, absentApps) { + let listAppsInModeler = await getAppProjects(apiService); + + for (let i = 0; i < absentApps.length; i++) { + let currentAbsentApp = absentApps[i]; + let isPresent = listAppsInModeler.find((currentApp) => { + return currentAbsentApp.name === currentApp.entry.name; + }); + + if (!isPresent) { + console.log(`uplodare ` + currentAbsentApp.name); + let uploadedApp = await importApp(apiService, currentAbsentApp); + if (uploadedApp) { + await releaseApp(apiService, uploadedApp); + await deployApp(apiService, uploadedApp); + } + } + } +} + +async function deployApp(apiService, app) { + const url = `${config.hostBpm}/alfresco-deployment-service/v1/applications`; + + const pathParams = {}, + queryParams = { + "name": "re", + "releaseId": app.entry.id, + "security": [{"role": "APS_ADMIN", "groups": [], "users": ["admin.adf"]}, { + "role": "APS_USER", + "groups": [], + "users": ["admin.adf"] + }] + }; + + const headerParams = {}, formParams = {}, bodyParam = {}, + contentTypes = ['multipart/form-data'], accepts = ['application/json']; + + try { + return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, + contentTypes, accepts); + } catch (error) { + console.log(`Not possible to deploy the project ${app.entry.name} ` + error); + process.exit(1); + } +} + +async function importApp(apiService, app) { + const pathFile = path.join('./e2e/' + app.file_location); + const file = fs.createReadStream(pathFile); + + const url = `${config.hostBpm}/alfresco-modeling-service/v1/projects/import`; + + const pathParams = {}, queryParams = {}, + headerParams = {}, formParams = {'file': file}, bodyParam = {}, + contentTypes = ['multipart/form-data'], accepts = ['application/json']; + + try { + return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, + contentTypes, accepts); + } catch (error) { + console.log(`Not possible to upload the project ${app.name} ` + error); + process.exit(1); + } + +} + +async function releaseApp(apiService, app) { + const url = `${config.hostBpm}alfresco-modeling-service/v1/projects/${app.entry.id}/releases`; + console.log(url); + + const pathParams = {}, queryParams = {}, + headerParams = {}, formParams = {}, bodyParam = {}, + contentTypes = ['application/json'], accepts = ['application/json']; + + try { + return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, + contentTypes, accepts); + } catch (error) { + console.log(`Not possible to release the project ${app.entry.name} ` + error); + process.exit(1); + } + +} + +async function getDeployedApplicationsByStatus(apiService, status) { + const url = `${config.hostBpm}/alfresco-deployment-service/v1/applications`; + + const pathParams = {}, queryParams = {status: status}, + headerParams = {}, formParams = {}, bodyParam = {}, + contentTypes = ['application/json'], accepts = ['application/json']; + + let data; + try { + data = await apiService.oauth2Auth.callCustomApi(url, 'GET', pathParams, queryParams, headerParams, formParams, bodyParam, + contentTypes, accepts); + return data.list.entries; + } catch (error) { + console.log(`Not possible get the application from alfresco-deployment-service` + error); + process.exit(1); + } + +} + +async function getAppProjects(apiService, status) { + const url = `${config.hostBpm}/alfresco-modeling-service/v1/projects`; + + const pathParams = {}, queryParams = {status: status}, + headerParams = {}, formParams = {}, bodyParam = {}, + contentTypes = ['application/json'], accepts = ['application/json']; + + let data; + try { + data = await apiService.oauth2Auth.callCustomApi(url, 'GET', pathParams, queryParams, headerParams, formParams, bodyParam, + contentTypes, accepts); + return data.list.entries; + } catch (error) { + console.log(`Not possible get the application from alfresco-modeling-service` + error); + process.exit(1); + } +} + +main(); diff --git a/scripts/test-e2e-lib.sh b/scripts/test-e2e-lib.sh index 88f4c6c9ae..78c677c9cd 100755 --- a/scripts/test-e2e-lib.sh +++ b/scripts/test-e2e-lib.sh @@ -7,7 +7,7 @@ DEVELOPMENT=false EXECLINT=true LITESERVER=false EXEC_VERSION_JSAPI=false -TIMEOUT=7000 +TIMEOUT=20000 SELENIUM_PROMISE_MANAGER=1 show_help() { diff --git a/scripts/update-project.sh b/scripts/update-project.sh index 126f8e0521..9ed0490cd4 100755 --- a/scripts/update-project.sh +++ b/scripts/update-project.sh @@ -56,6 +56,6 @@ git add . git commit -m "Update ADF packages version $VERSION" git push -u origin $BRANCH -curl -H "Authorization: token $TOKEN" -X POST -d '{"body":"Update ADF packages version '$VERSION'","head":"'$BRANCH'","base":"development","title":"Update ADF packages version '$VERSION'"}' https://api.github.com/repos/alfresco/$NAME_REPO/pulls +curl -H "Authorization: token $TOKEN" -X POST -d '{"body":"Update ADF packages version '$VERSION'","head":"'$BRANCH'","base":"development","title":"Update ADF packages version '$VERSION'"}' https://api.github.com/repos/$NAME_REPO/pulls rm -rf $TEMP_GENERATOR_DIR;