From 941df740d520e0a19572988aecc271e80472dca1 Mon Sep 17 00:00:00 2001 From: Maurizio Vitale Date: Thu, 17 Oct 2019 14:31:58 +0100 Subject: [PATCH] [ADF-4948] Move the resources config in the process cloud lib - Part 2 (#5143) * Move the resources in the cloud lib * Use adf cli * Add missing process definitions * Add debug points * Print new class * Use the resources under the adf-testing * Use the resources from testing package * Fix adf-testing bugs * remove empty row * Remove the npm install * Remove log stuff * Remove the console log * Fix typo on process def names Improve the debug e2e command * Fix lowercase name * Check the process cloud env and content env * Add the new process definitions * Add missing process definitions * Use the latest simpleapp * Rollback the bigFile * Use relative link * Trasnpile the adf-testing before using it --- .../apps-section-cloud.e2e.ts | 7 +- .../edit-process-filters-component.e2e.ts | 2 +- .../edit-task-filters-component.e2e.ts | 2 +- .../form-field/dropdown-widget.e2e.ts | 4 +- ...people-group-cloud-filter-component.e2e.ts | 8 +- .../process-custom-filters.e2e.ts | 6 +- .../process-filter-results.e2e.ts | 10 +- .../process-filters-cloud.e2e.ts | 4 +- .../process-header-cloud.e2e.ts | 4 +- .../process-list-cloud-action-menu.e2e.ts | 4 +- .../process-list-cloud-component.e2e.ts | 4 +- .../process-list-selection-cloud.e2e.ts | 4 +- .../start-process-cloud.e2e.ts | 2 +- .../start-task-form-cloud.e2e.ts | 10 +- .../start-task-custom-app-cloud.e2e.ts | 2 +- .../start-task/start-task-group-cloud.e2e.ts | 2 +- .../task-filters-cloud.e2e.ts | 2 +- .../task-form-cloud-component.e2e.ts | 10 +- .../task-header-cloud.e2e.ts | 2 +- .../task-list-cloud-action-menu.e2e.ts | 4 +- .../task-list-properties.e2e.ts | 6 +- .../task-list-selection.e2e.ts | 2 +- .../tasks-custom-filters.e2e.ts | 4 +- e2e/resources/activiti7/simpleapp.zip | Bin 10874 -> 23166 bytes e2e/util/resources.js | 39 -- lib/cli/scripts/init-aae-env.ts | 53 +- lib/cli/tsconfig.json | 30 +- lib/process-services-cloud/src/public-api.ts | 1 - lib/testing/src/lib/core/models/user.model.ts | 6 +- .../src/lib/core/utils/browser-visibility.ts | 15 +- .../src/lib/core/utils/file-browser.util.ts | 3 +- .../resources/resources.ts | 25 +- protractor.conf.ts | 7 + scripts/check-env/check-activiti-env.js | 489 ------------------ scripts/check-env/delete-all-apps.js | 10 +- scripts/test-e2e-lib.sh | 15 +- .../travis/e2e/process-services-cloud-e2e.sh | 9 +- 37 files changed, 130 insertions(+), 677 deletions(-) delete mode 100755 scripts/check-env/check-activiti-env.js diff --git a/e2e/process-services-cloud/apps-section-cloud.e2e.ts b/e2e/process-services-cloud/apps-section-cloud.e2e.ts index 4553d6870c..faa451e9cf 100644 --- a/e2e/process-services-cloud/apps-section-cloud.e2e.ts +++ b/e2e/process-services-cloud/apps-section-cloud.e2e.ts @@ -33,7 +33,8 @@ describe('Applications list', () => { const navigationBarPage = new NavigationBarPage(); const settingsPage = new SettingsPage(); const appListCloudPage = new AppListCloudPage(); - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; + let identityService: IdentityService; let applicationsService: ApplicationsService; let testUser; @@ -82,8 +83,8 @@ describe('Applications list', () => { await appListCloudPage.checkApsContainer(); await appListCloudPage.checkAppIsDisplayed(simpleApp); - await appListCloudPage.checkAppIsDisplayed(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name); - await appListCloudPage.checkAppIsDisplayed(browser.params.resources.ACTIVITI7_APPS.SUB_PROCESS_APP.name); + await appListCloudPage.checkAppIsDisplayed(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name); + await appListCloudPage.checkAppIsDisplayed(browser.params.resources.ACTIVITI_CLOUD_APPS.SUB_PROCESS_APP.name); await expect(await appListCloudPage.countAllApps()).toEqual(3); }); 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 433d70f08e..2c38e4aeef 100644 --- a/e2e/process-services-cloud/edit-process-filters-component.e2e.ts +++ b/e2e/process-services-cloud/edit-process-filters-component.e2e.ts @@ -32,7 +32,7 @@ describe('Edit process filters cloud', () => { const processCloudDemoPage = new ProcessCloudDemoPage(); const settingsPage = new SettingsPage(); - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; let identityService: IdentityService; let groupIdentityService: GroupIdentityService; let testUser, groupInfo; 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 3705d103b3..e73257c023 100644 --- a/e2e/process-services-cloud/edit-task-filters-component.e2e.ts +++ b/e2e/process-services-cloud/edit-task-filters-component.e2e.ts @@ -43,7 +43,7 @@ describe('Edit task filters cloud', () => { let testUser, groupInfo; const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); diff --git a/e2e/process-services-cloud/form-field/dropdown-widget.e2e.ts b/e2e/process-services-cloud/form-field/dropdown-widget.e2e.ts index ac14c26fdd..939878c159 100644 --- a/e2e/process-services-cloud/form-field/dropdown-widget.e2e.ts +++ b/e2e/process-services-cloud/form-field/dropdown-widget.e2e.ts @@ -59,7 +59,7 @@ describe('Form Field Component - Dropdown Widget', () => { let queryService: QueryService; let runningProcessInstance, testUser, groupInfo, tasklist, task; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; beforeAll(async () => { @@ -74,7 +74,7 @@ describe('Form Field Component - Dropdown Widget', () => { processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); await processInstancesService.createProcessInstance(processDefinition.entry.key, simpleApp); 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 index c3b0671538..ff99e676cd 100644 --- a/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts +++ b/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts @@ -92,7 +92,7 @@ describe('People Groups Cloud Component', () => { it('[C305041] Should filter the People Single Selection with the Application name filter', async () => { await peopleGroupCloudComponentPage.checkPeopleCloudSingleSelectionIsSelected(); await peopleGroupCloudComponentPage.clickPeopleFilerByApp(); - await peopleGroupCloudComponentPage.enterPeopleAppName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name); + await peopleGroupCloudComponentPage.enterPeopleAppName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name); await peopleCloudComponent.searchAssignee(testUser.firstName); await peopleCloudComponent.checkUserIsDisplayed(`${testUser.firstName} ${testUser.lastName}`); await peopleCloudComponent.selectAssigneeFromList(`${testUser.firstName} ${testUser.lastName}`); @@ -103,7 +103,7 @@ describe('People Groups Cloud Component', () => { it('[C305041] Should filter the People Multiple Selection with the Application name filter', async () => { await peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); await peopleGroupCloudComponentPage.clickPeopleFilerByApp(); - await peopleGroupCloudComponentPage.enterPeopleAppName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name); + await peopleGroupCloudComponentPage.enterPeopleAppName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name); await peopleCloudComponent.searchAssignee(testUser.firstName); await peopleCloudComponent.checkUserIsDisplayed(`${testUser.firstName} ${testUser.lastName}`); await peopleCloudComponent.selectAssigneeFromList(`${testUser.firstName} ${testUser.lastName}`); @@ -121,7 +121,7 @@ describe('People Groups Cloud Component', () => { it('[C305041] Should filter the Groups Single Selection with the Application name filter', async () => { await peopleGroupCloudComponentPage.clickGroupCloudSingleSelection(); await peopleGroupCloudComponentPage.clickGroupFilerByApp(); - await peopleGroupCloudComponentPage.enterGroupAppName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name); + await peopleGroupCloudComponentPage.enterGroupAppName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name); await groupCloudComponentPage.searchGroups(hrGroup.name); await groupCloudComponentPage.checkGroupIsDisplayed(hrGroup.name); await groupCloudComponentPage.selectGroupFromList(hrGroup.name); @@ -131,7 +131,7 @@ describe('People Groups Cloud Component', () => { it('[C305041] Should filter the Groups Multiple Selection with the Application name filter', async () => { await peopleGroupCloudComponentPage.clickGroupCloudMultipleSelection(); await peopleGroupCloudComponentPage.clickGroupFilerByApp(); - await peopleGroupCloudComponentPage.enterGroupAppName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name); + await peopleGroupCloudComponentPage.enterGroupAppName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name); await groupCloudComponentPage.searchGroups(testGroup.name); await groupCloudComponentPage.checkGroupIsDisplayed(testGroup.name); await groupCloudComponentPage.selectGroupFromList(testGroup.name); diff --git a/e2e/process-services-cloud/process-custom-filters.e2e.ts b/e2e/process-services-cloud/process-custom-filters.e2e.ts index c29ab0af33..765a1c7456 100644 --- a/e2e/process-services-cloud/process-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/process-custom-filters.e2e.ts @@ -54,7 +54,7 @@ describe('Process list cloud', () => { let completedProcess, runningProcessInstance, switchProcessInstance, noOfApps, testUser, groupInfo, anotherProcessInstance; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; beforeAll(async () => { @@ -69,10 +69,10 @@ describe('Process list cloud', () => { processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); const anotherProcessDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.anotherCandidateGroupProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.anotherCandidateGroupProcess, candidateBaseApp); processInstancesService = new ProcessInstancesService(apiService); await processInstancesService.createProcessInstance(processDefinition.entry.key, candidateBaseApp); diff --git a/e2e/process-services-cloud/process-filter-results.e2e.ts b/e2e/process-services-cloud/process-filter-results.e2e.ts index e386c419ac..4955a904c1 100644 --- a/e2e/process-services-cloud/process-filter-results.e2e.ts +++ b/e2e/process-services-cloud/process-filter-results.e2e.ts @@ -59,8 +59,8 @@ describe('Process filters cloud', () => { let completedProcess, runningProcessInstance, suspendProcessInstance, testUser, anotherUser, groupInfo, anotherProcessInstance, processDefinition, anotherProcessDefinition, differentAppUserProcessInstance, simpleAppProcessDefinition; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; beforeAll(async () => { @@ -78,7 +78,7 @@ describe('Process filters cloud', () => { await apiService.login(anotherUser.email, anotherUser.password); processDefinitionService = new ProcessDefinitionsService(apiService); simpleAppProcessDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); differentAppUserProcessInstance = await processInstancesService.createProcessInstance(simpleAppProcessDefinition.entry.key, simpleApp, { @@ -88,10 +88,10 @@ describe('Process filters cloud', () => { await apiService.login(testUser.email, testUser.password); processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); anotherProcessDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.anotherCandidateGroupProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.anotherCandidateGroupProcess, candidateBaseApp); runningProcessInstance = await processInstancesService.createProcessInstance(processDefinition.entry.key, candidateBaseApp, { 'name': StringUtil.generateRandomString(), diff --git a/e2e/process-services-cloud/process-filters-cloud.e2e.ts b/e2e/process-services-cloud/process-filters-cloud.e2e.ts index d7d7633865..f843c7b93c 100644 --- a/e2e/process-services-cloud/process-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-filters-cloud.e2e.ts @@ -54,7 +54,7 @@ describe('Process filters cloud', () => { let queryService: QueryService; let runningProcess, completedProcess, testUser, groupInfo; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; beforeAll(async () => { await apiService.login(browser.params.identityAdmin.email, browser.params.identityAdmin.password); @@ -68,7 +68,7 @@ describe('Process filters cloud', () => { processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); processInstancesService = new ProcessInstancesService(apiService); runningProcess = await processInstancesService.createProcessInstance(processDefinition.entry.key, candidateBaseApp); diff --git a/e2e/process-services-cloud/process-header-cloud.e2e.ts b/e2e/process-services-cloud/process-header-cloud.e2e.ts index f7ae234b92..0438118216 100644 --- a/e2e/process-services-cloud/process-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-header-cloud.e2e.ts @@ -40,8 +40,8 @@ describe('Process Header cloud component', () => { describe('Process Header cloud component', () => { - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; - const subProcessApp = browser.params.resources.ACTIVITI7_APPS.SUB_PROCESS_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; + const subProcessApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SUB_PROCESS_APP.name; const formatDate = 'MMM D, YYYY'; const processHeaderCloudPage = new ProcessHeaderCloudPage(); diff --git a/e2e/process-services-cloud/process-list-cloud-action-menu.e2e.ts b/e2e/process-services-cloud/process-list-cloud-action-menu.e2e.ts index 38fba4ecc9..4affe23a02 100644 --- a/e2e/process-services-cloud/process-list-cloud-action-menu.e2e.ts +++ b/e2e/process-services-cloud/process-list-cloud-action-menu.e2e.ts @@ -40,7 +40,7 @@ describe('Process list cloud', () => { let groupIdentityService: GroupIdentityService; let testUser, groupInfo, editProcess, deleteProcess; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); beforeAll(async () => { @@ -55,7 +55,7 @@ describe('Process list cloud', () => { await apiService.login(testUser.email, testUser.password); processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); editProcess = await processInstancesService.createProcessInstance(processDefinition.entry.key, simpleApp); diff --git a/e2e/process-services-cloud/process-list-cloud-component.e2e.ts b/e2e/process-services-cloud/process-list-cloud-component.e2e.ts index 800f861af7..1d574edd7f 100644 --- a/e2e/process-services-cloud/process-list-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/process-list-cloud-component.e2e.ts @@ -45,7 +45,7 @@ describe('Process list cloud', () => { let groupIdentityService: GroupIdentityService; let testUser, groupInfo; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; let jsonFile; let runningProcess; @@ -61,7 +61,7 @@ describe('Process list cloud', () => { processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.candidateGroupProcess, candidateBaseApp); processInstancesService = new ProcessInstancesService(apiService); runningProcess = await processInstancesService.createProcessInstance(processDefinition.entry.key, candidateBaseApp); diff --git a/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts b/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts index bcb88c9d8b..6955c3f3a2 100644 --- a/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts @@ -40,7 +40,7 @@ describe('Process list cloud', () => { let groupIdentityService: GroupIdentityService; let testUser, groupInfo; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); const noOfProcesses = 3; const processInstances = []; @@ -57,7 +57,7 @@ describe('Process list cloud', () => { await apiService.login(testUser.email, testUser.password); processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); for (let i = 0; i < noOfProcesses; i++) { diff --git a/e2e/process-services-cloud/start-process-cloud.e2e.ts b/e2e/process-services-cloud/start-process-cloud.e2e.ts index 5dabb25160..e5c9cd36a1 100644 --- a/e2e/process-services-cloud/start-process-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-process-cloud.e2e.ts @@ -40,7 +40,7 @@ describe('Start Process', () => { const processNameBiggerThen255Characters = StringUtil.generateRandomString(256); const lengthValidationError = 'Length exceeded, 255 characters max.'; const requiredError = 'Process Name is required'; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; let identityService: IdentityService; let groupIdentityService: GroupIdentityService; let testUser, groupInfo; diff --git a/e2e/process-services-cloud/start-task-form-cloud.e2e.ts b/e2e/process-services-cloud/start-task-form-cloud.e2e.ts index 0bb1dd159f..5080b7d62c 100644 --- a/e2e/process-services-cloud/start-task-form-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-task-form-cloud.e2e.ts @@ -84,7 +84,7 @@ describe('Start Task Form', () => { let processInstancesService: ProcessInstancesService; let processDefinition, uploadLocalFileProcess, uploadContentFileProcess, uploadDefaultFileProcess, cancelUploadFileProcess, completeUploadFileProcess; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; const pdfFile = new FileModel({ 'name': browser.params.resources.Files.ADF_DOCUMENTS.PDF.file_name }); const pdfFileModel = new FileModel({ 'name': browser.params.resources.Files.ADF_DOCUMENTS.PDF.file_name, @@ -113,7 +113,7 @@ describe('Start Task Form', () => { processDefinitionService = new ProcessDefinitionsService(apiService); processInstancesService = new ProcessInstancesService(apiService); processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.uploadFileProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.uploadFileProcess, candidateBaseApp); await processInstancesService.createProcessInstance(processDefinition.entry.key, candidateBaseApp); @@ -191,7 +191,7 @@ describe('Start Task Form', () => { await tasksCloudDemoPage.openNewTaskForm(); await startTask.checkFormIsDisplayed(); await startTask.addName(standaloneTaskName); - await startTask.selectFormDefinition(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.forms.starteventform); + await startTask.selectFormDefinition(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.forms.starteventform); await startTask.clickStartButton(); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(standaloneTaskName); await tasksCloudDemoPage.taskListCloudComponent().selectRow(standaloneTaskName); @@ -224,8 +224,8 @@ describe('Start Task Form', () => { await tasksCloudDemoPage.openNewTaskForm(); await startTask.checkFormIsDisplayed(); await startTask.checkFormDefinitionIsNotDisplayed('uploadfileform'); - await startTask.checkFormDefinitionIsDisplayed(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.forms.starteventform); - await startTask.checkFormDefinitionIsDisplayed(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.forms.formtotestvalidations); + await startTask.checkFormDefinitionIsDisplayed(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.forms.starteventform); + await startTask.checkFormDefinitionIsDisplayed(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.forms.formtotestvalidations); }); }); diff --git a/e2e/process-services-cloud/start-task/start-task-custom-app-cloud.e2e.ts b/e2e/process-services-cloud/start-task/start-task-custom-app-cloud.e2e.ts index afac75a4c2..69f0c02455 100644 --- a/e2e/process-services-cloud/start-task/start-task-custom-app-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-task/start-task-custom-app-cloud.e2e.ts @@ -56,7 +56,7 @@ describe('Start Task', () => { const requiredError = 'Field required'; const dateValidationError = 'Date format DD/MM/YYYY'; let apsUser, testUser, activitiUser, groupInfo; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; let identityService: IdentityService; let groupIdentityService: GroupIdentityService; diff --git a/e2e/process-services-cloud/start-task/start-task-group-cloud.e2e.ts b/e2e/process-services-cloud/start-task/start-task-group-cloud.e2e.ts index d2c0490538..a8463f348f 100644 --- a/e2e/process-services-cloud/start-task/start-task-group-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-task/start-task-group-cloud.e2e.ts @@ -50,7 +50,7 @@ describe('Start Task - Group Cloud Component', () => { const bothGroupsTaskName = StringUtil.generateRandomString(5); const oneGroupTaskName = StringUtil.generateRandomString(5); let apsUser, testUser, hrGroup, testGroup; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; let identityService: IdentityService; let groupIdentityService: GroupIdentityService; diff --git a/e2e/process-services-cloud/task-filters-cloud.e2e.ts b/e2e/process-services-cloud/task-filters-cloud.e2e.ts index c67d081835..5c86fc9a0b 100644 --- a/e2e/process-services-cloud/task-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-filters-cloud.e2e.ts @@ -35,7 +35,7 @@ describe('Task filters cloud', () => { const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); const newTask = StringUtil.generateRandomString(5), completedTask = StringUtil.generateRandomString(5); - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; beforeAll(async() => { diff --git a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts index 0a6fc3a332..839ea6aef4 100644 --- a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts @@ -51,8 +51,8 @@ describe('Task form cloud component', () => { let groupIdentityService: GroupIdentityService; let completedTask, createdTask, assigneeTask, toBeCompletedTask, formValidationsTask, testUser, formTaskId; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, browser.params.config.providers); @@ -103,13 +103,13 @@ describe('Task form cloud component', () => { for (let i = 0; i < 3; i++) { visibilityConditionTasks[i] = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), - simpleApp, browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.forms.tabVisibilityFields.id); + simpleApp, browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms.tabVisibilityFields.id); await tasksService.claimTask(visibilityConditionTasks[i].entry.id, simpleApp); } for (let i = 3; i < 6; i++) { visibilityConditionTasks[i] = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), - simpleApp, browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.forms.tabVisibilityVars.id); + simpleApp, browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms.tabVisibilityVars.id); await tasksService.claimTask(visibilityConditionTasks[i].entry.id, simpleApp); } @@ -126,7 +126,7 @@ describe('Task form cloud component', () => { processDefinitionService = new ProcessDefinitionsService(apiService); let processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.processes.candidateUserProcess, candidateBaseApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.processes.candidateUserProcess, candidateBaseApp); processInstancesService = new ProcessInstancesService(apiService); await processInstancesService.createProcessInstance(processDefinition.entry.key, candidateBaseApp); diff --git a/e2e/process-services-cloud/task-header-cloud.e2e.ts b/e2e/process-services-cloud/task-header-cloud.e2e.ts index 3dbec184fc..697efcc16b 100644 --- a/e2e/process-services-cloud/task-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-header-cloud.e2e.ts @@ -35,7 +35,7 @@ describe('Task Header cloud component', () => { let completedEndDate; let defaultDate; let groupInfo, testUser; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const priority = 30; const description = 'descriptionTask'; const formatDate = 'MMM D, YYYY'; diff --git a/e2e/process-services-cloud/task-list-cloud-action-menu.e2e.ts b/e2e/process-services-cloud/task-list-cloud-action-menu.e2e.ts index 5de8c3ecd7..604c2a1fe8 100644 --- a/e2e/process-services-cloud/task-list-cloud-action-menu.e2e.ts +++ b/e2e/process-services-cloud/task-list-cloud-action-menu.e2e.ts @@ -41,7 +41,7 @@ describe('Process list cloud', () => { let tasksService: TasksService; let testUser, groupInfo, editProcess, deleteProcess, editTask, deleteTask; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); beforeAll(async () => { @@ -56,7 +56,7 @@ describe('Process list cloud', () => { await apiService.login(testUser.email, testUser.password); processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); editProcess = await processInstancesService.createProcessInstance(processDefinition.entry.key, simpleApp); diff --git a/e2e/process-services-cloud/task-list-properties.e2e.ts b/e2e/process-services-cloud/task-list-properties.e2e.ts index e20094675d..872b77076a 100644 --- a/e2e/process-services-cloud/task-list-properties.e2e.ts +++ b/e2e/process-services-cloud/task-list-properties.e2e.ts @@ -42,8 +42,8 @@ describe('Edit task filters and task list properties', () => { let groupIdentityService: GroupIdentityService; const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, browser.params.config.providers); - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; - const candidateBaseApp = browser.params.resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; + const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; const noTasksFoundMessage = 'No Tasks Found'; let createdTask, notAssigned, notDisplayedTask, processDefinition, processInstance, priorityTask, subTask, otherOwnerTask, testUser, groupInfo; @@ -83,7 +83,7 @@ describe('Edit task filters and task list properties', () => { processDefinitionService = new ProcessDefinitionsService(apiService); processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); processInstance = await processInstancesService.createProcessInstance(processDefinition.entry.key, simpleApp); diff --git a/e2e/process-services-cloud/task-list-selection.e2e.ts b/e2e/process-services-cloud/task-list-selection.e2e.ts index bf8afbee39..d7e2224959 100644 --- a/e2e/process-services-cloud/task-list-selection.e2e.ts +++ b/e2e/process-services-cloud/task-list-selection.e2e.ts @@ -40,7 +40,7 @@ describe('Task list cloud - selection', () => { let identityService: IdentityService; let groupIdentityService: GroupIdentityService; - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; const noOfTasks = 3; let response, testUser, groupInfo; const tasks = []; diff --git a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts index 65f9d69a5d..c1da15c3af 100644 --- a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts @@ -53,7 +53,7 @@ describe('Task filters cloud', () => { const createdTaskName = StringUtil.generateRandomString(), completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(), deletedTaskName = StringUtil.generateRandomString(); - const simpleApp = browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; let assignedTask, deletedTask, testUser, groupInfo; const orderByNameAndPriority = ['cCreatedTask', 'dCreatedTask', 'eCreatedTask']; let priority = 30; @@ -84,7 +84,7 @@ describe('Task filters cloud', () => { processDefinitionService = new ProcessDefinitionsService(apiService); const processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI7_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.simpleProcess, simpleApp); processInstancesService = new ProcessInstancesService(apiService); const processInstance = await processInstancesService.createProcessInstance(processDefinition.entry.key, simpleApp); diff --git a/e2e/resources/activiti7/simpleapp.zip b/e2e/resources/activiti7/simpleapp.zip index b0db6aa09b3c47d1782632abb9e424d0fd23f6fb..450a7732ddcf87c90049458101c9a3428b48a63f 100644 GIT binary patch delta 18138 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 diff --git a/e2e/util/resources.js b/e2e/util/resources.js index 19bbb20a1f..5c043d4d78 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -522,42 +522,3 @@ exports.Files = { }; -exports.ACTIVITI7_APPS = { - CANDIDATE_BASE_APP: { - name: "candidatebaseapp", - file_location: "/resources/activiti7/candidatebaseapp.zip", - processes: { - candidateUserProcess: "candidateuserprocess", - candidateGroupProcess: "candidategroupprocess", - anotherCandidateGroupProcess: "anothercandidategroup", - uploadFileProcess: "uploadfileprocess" - }, - forms: { - starteventform: "starteventform", - formtotestvalidations: "formtotestvalidations" - } - }, - SIMPLE_APP: { - name: "simpleapp", - file_location: "/resources/activiti7/simpleapp.zip", - processes: { - processwithvariables: "processwithvariables", - simpleProcess: "simpleprocess", - dropdownrestprocess: "dropdownrestprocess" - }, - forms: { - tabVisibilityFields: { - name: "tabvisibilitywithfields", - id: "form-26b01063-4fb0-455f-b3ba-90172e013678" - }, - tabVisibilityVars: { - name: "tabvisibilitywithvars", - id: "form-7bf363d2-83c9-4b00-853e-373d0d59963c" - } - } - }, - SUB_PROCESS_APP: { - name: "subprocessapp", - file_location: "/resources/activiti7/subprocessapp.zip", - } -}; diff --git a/lib/cli/scripts/init-aae-env.ts b/lib/cli/scripts/init-aae-env.ts index 88ec3f0675..878cab2849 100644 --- a/lib/cli/scripts/init-aae-env.ts +++ b/lib/cli/scripts/init-aae-env.ts @@ -18,6 +18,8 @@ */ import { logging } from '@angular-devkit/core'; +import { ACTIVITI_CLOUD_APPS } from '@alfresco/adf-testing'; + /* tslint:disable */ const alfrescoApi = require('@alfresco/js-api'); /* tslint:enable */ @@ -27,59 +29,12 @@ import * as fs from 'fs'; export interface ConfigArgs { username: string; password: string; + clientId: string; host: string; oauth: string; identityHost: boolean; } -const ACTIVITI_CLOUD_APPS: any = { - CANDIDATE_BASE_APP: { - name: 'candidatebaseapp', - file_location: 'https://github.com/Alfresco/alfresco-ng2-components/blob/development/e2e/resources/activiti7/candidatebaseapp.zip?raw=true', - processes: { - candidateUserProcess: 'candidateUserProcess', - candidateGroupProcess: 'candidateGroupProcess', - anotherCandidateGroupProcess: 'anotherCandidateGroupProcess', - uploadFileProcess: 'uploadFileProcess' - }, - security: [ - {'role': 'APS_ADMIN', 'groups': [], 'users': ['superadminuser']}, - {'role': 'APS_USER', 'groups': ['hr', 'testgroup'], 'users': ['hruser'] - }] - }, - SIMPLE_APP: { - name: 'simpleapp', - file_location: 'https://github.com/Alfresco/alfresco-ng2-components/blob/development/e2e/resources/activiti7/simpleapp.zip?raw=true', - processes: { - processwithvariables: 'processwithvariables', - simpleProcess: 'simpleprocess', - dropdownrestprocess: 'dropdownrestprocess' - }, - forms: { - tabVisibilityFields: { - name: 'tabvisibilitywithfields', - id: 'form-26b01063-4fb0-455f-b3ba-90172e013678' - }, - tabVisibilityVars: { - name: 'tabvisibilitywithvars', - id: 'form-7bf363d2-83c9-4b00-853e-373d0d59963c' - } - }, - security: [ - {'role': 'APS_ADMIN', 'groups': [], 'users': ['superadminuser']}, - {'role': 'APS_USER', 'groups': ['hr', 'testgroup'], 'users': ['hruser'] - }] - }, - SUB_PROCESS_APP: { - name: 'subprocessapp', - file_location: 'https://github.com/Alfresco/alfresco-ng2-components/blob/development/e2e/resources/activiti7/subprocessapp.zip?raw=true', - security: [ - {'role': 'APS_ADMIN', 'groups': [], 'users': ['superadminuser']}, - {'role': 'APS_USER', 'groups': ['hr', 'testgroup'], 'users': ['hruser'] - }] - } -}; - async function getDeployedApplicationsByStatus(args: ConfigArgs, apiService: any, status: string, logger: logging.Logger) { const url = `${args.host}/deployment-service/v1/applications`; @@ -106,7 +61,7 @@ function getAlfrescoJsApiInstance(args: ConfigArgs) { authType: 'OAUTH', oauth2: { host: `${args.oauth}`, - clientId: 'activiti', + clientId: `${args.clientId}`, scope: 'openid', secret: '', implicitFlow: false, diff --git a/lib/cli/tsconfig.json b/lib/cli/tsconfig.json index 82588ee43a..c97fec6702 100644 --- a/lib/cli/tsconfig.json +++ b/lib/cli/tsconfig.json @@ -1,23 +1,30 @@ { "compilerOptions": { - "declaration": true, + "target": "es2018", "module": "commonjs", "moduleResolution": "node", - "noEmitOnError": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitThis": true, + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "skipLibCheck": false, + "noLib": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "strict": false, "noUnusedParameters": true, "noUnusedLocals": true, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitUseStrict": false, + "noFallthroughCasesInSwitch": true, + "removeComments": true, + "declaration": true, "outDir": "./dist", - "rootDir": ".", - "skipLibCheck": true, - "strictNullChecks": true, - "target": "es2018", "lib": [ - "es2018" + "es2016", + "dom" ], - "baseUrl": ".", + "baseUrl": "./", "typeRoots": [ "./node_modules/@types" ], @@ -32,6 +39,5 @@ "./build.ts", "node_modules/**/*", "**/node_modules/**/*" - ] } diff --git a/lib/process-services-cloud/src/public-api.ts b/lib/process-services-cloud/src/public-api.ts index 39f3f4709a..31eaddc0f6 100644 --- a/lib/process-services-cloud/src/public-api.ts +++ b/lib/process-services-cloud/src/public-api.ts @@ -16,7 +16,6 @@ */ export * from './lib/process-services-cloud.module'; - export * from './lib/app/public-api'; export * from './lib/process/public-api'; export * from './lib/task/public-api'; diff --git a/lib/testing/src/lib/core/models/user.model.ts b/lib/testing/src/lib/core/models/user.model.ts index 50c213d0a5..64d9d7fc68 100644 --- a/lib/testing/src/lib/core/models/user.model.ts +++ b/lib/testing/src/lib/core/models/user.model.ts @@ -18,14 +18,14 @@ import { StringUtil } from '../utils/string.util'; import { browser } from 'protractor'; -const EMAIL_DOMAIN = browser.params.testConfig ? browser.params.testConfig.projectName : 'alfresco'; - export class UserModel { + EMAIL_DOMAIN = browser.params.testConfig ? browser.params.testConfig.projectName : 'alfresco'; + firstName: string = StringUtil.generateRandomString(); lastName: string = StringUtil.generateRandomString(); password: string = StringUtil.generateRandomString(); - email: string = StringUtil.generateRandomEmail(`@${EMAIL_DOMAIN}.com`); + email: string = StringUtil.generateRandomEmail(`@${this.EMAIL_DOMAIN}.com`); username: string = StringUtil.generateRandomString().toLowerCase(); idIdentityService: string; diff --git a/lib/testing/src/lib/core/utils/browser-visibility.ts b/lib/testing/src/lib/core/utils/browser-visibility.ts index dee2a1cf24..f74bdfbc32 100644 --- a/lib/testing/src/lib/core/utils/browser-visibility.ts +++ b/lib/testing/src/lib/core/utils/browser-visibility.ts @@ -17,51 +17,50 @@ import { browser, by, element, ElementFinder, protractor } from 'protractor'; -const until = protractor.ExpectedConditions; const DEFAULT_TIMEOUT = global['TestConfig'] ? global['TestConfig'].main.timeout : 40000; export class BrowserVisibility { static async waitUntilElementIsPresent(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { - return browser.wait(until.presenceOf(elementToCheck), waitTimeout, 'Element is not present ' + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.presenceOf(elementToCheck), waitTimeout, 'Element is not present ' + elementToCheck.locator()); } /* * Wait for element to be visible */ static async waitUntilElementIsVisible(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT, message: string = 'Element is not visible'): Promise { - return browser.wait(until.visibilityOf(elementToCheck), waitTimeout, message + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.visibilityOf(elementToCheck), waitTimeout, message + elementToCheck.locator()); } /* * Wait for element to be clickable */ static async waitUntilElementIsClickable(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { - return browser.wait(until.elementToBeClickable(elementToCheck), waitTimeout, 'Element is not Clickable ' + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.elementToBeClickable(elementToCheck), waitTimeout, 'Element is not Clickable ' + elementToCheck.locator()); } /* * Wait for element to not be present on the page */ static async waitUntilElementIsStale(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { - return browser.wait(until.stalenessOf(elementToCheck), waitTimeout, 'Element is not in stale ' + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.stalenessOf(elementToCheck), waitTimeout, 'Element is not in stale ' + elementToCheck.locator()); } /* * Wait for element to not be visible */ static async waitUntilElementIsNotVisible(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { - return browser.wait(until.invisibilityOf(elementToCheck), waitTimeout, 'Element is Visible and it should not' + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.invisibilityOf(elementToCheck), waitTimeout, 'Element is Visible and it should not' + elementToCheck.locator()); } /* * Wait for element to have value */ static async waitUntilElementHasValue(elementToCheck: ElementFinder, elementValue, waitTimeout: number = DEFAULT_TIMEOUT): Promise { - return browser.wait(until.textToBePresentInElementValue(elementToCheck, elementValue), waitTimeout, 'Element doesn\'t have a value ' + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.textToBePresentInElementValue(elementToCheck, elementValue), waitTimeout, 'Element doesn\'t have a value ' + elementToCheck.locator()); } static async waitUntilElementIsNotPresent(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { - return browser.wait(until.stalenessOf(elementToCheck), waitTimeout, 'Element is present ' + elementToCheck.locator()); + return browser.wait(protractor.ExpectedConditions.stalenessOf(elementToCheck), waitTimeout, 'Element is present ' + elementToCheck.locator()); } static async waitUntilDialogIsClose(): Promise { diff --git a/lib/testing/src/lib/core/utils/file-browser.util.ts b/lib/testing/src/lib/core/utils/file-browser.util.ts index c8fb4546e2..5e979f4a84 100644 --- a/lib/testing/src/lib/core/utils/file-browser.util.ts +++ b/lib/testing/src/lib/core/utils/file-browser.util.ts @@ -19,11 +19,10 @@ import * as path from 'path'; import * as fs from 'fs'; import { browser } from 'protractor'; -const DEFAULT_ROOT_PATH = browser.params.testConfig ? browser.params.testConfig.main.rootPath : __dirname; - export class FileBrowserUtil { static async isFileDownloaded(fileName: string): Promise { + const DEFAULT_ROOT_PATH = browser.params.testConfig ? browser.params.testConfig.main.rootPath : __dirname; const file = await browser.driver.wait(() => { return fs.existsSync(path.join(DEFAULT_ROOT_PATH, 'downloads', fileName)); diff --git a/lib/testing/src/lib/process-services-cloud/resources/resources.ts b/lib/testing/src/lib/process-services-cloud/resources/resources.ts index 047449b6f8..88f1563f68 100644 --- a/lib/testing/src/lib/process-services-cloud/resources/resources.ts +++ b/lib/testing/src/lib/process-services-cloud/resources/resources.ts @@ -21,10 +21,14 @@ export const ACTIVITI_CLOUD_APPS: any = { name: 'candidatebaseapp', file_location: 'https://github.com/Alfresco/alfresco-ng2-components/blob/development/e2e/resources/activiti7/candidatebaseapp.zip?raw=true', processes: { - candidateUserProcess: 'candidateUserProcess', - candidateGroupProcess: 'candidateGroupProcess', - anotherCandidateGroupProcess: 'anotherCandidateGroupProcess', - uploadFileProcess: 'uploadFileProcess' + candidateUserProcess: 'candidateuserprocess', + candidateGroupProcess: 'candidategroupprocess', + anotherCandidateGroupProcess: 'anothercandidategroup', + uploadFileProcess: 'uploadfileprocess' + }, + forms: { + starteventform: 'starteventform', + formtotestvalidations: 'formtotestvalidations' }, security: [ {'role': 'APS_ADMIN', 'groups': [], 'users': ['superadminuser']}, @@ -39,7 +43,14 @@ export const ACTIVITI_CLOUD_APPS: any = { simpleProcess: 'simpleprocess', dropdownrestprocess: 'dropdownrestprocess', multilingualprocess: 'multilingualprocess', - processWithTabVisibility: 'processwithtabvisibility' + processWithTabVisibility: 'processwithtabvisibility', + startmessageevent: 'start-message-event', + intermediatemessageevent: 'intermediate-message-event', + intboundaryevent: 'int-boundary-event', + nonintboundaryevent: 'nonint-boundary-event', + intboundarysubprocess: 'int-boundary-subprocess', + intstartmessageevent: 'int-start-message-event', + nonintstartmessageevent: 'nonint-start-message-event' }, forms: { tabVisibilityFields: { @@ -49,6 +60,10 @@ export const ACTIVITI_CLOUD_APPS: any = { tabVisibilityVars: { name: 'tabvisibilitywithvars', id: 'form-7bf363d2-83c9-4b00-853e-373d0d59963c' + }, + usertaskform: { + name: 'usertaskform', + id: 'form-056ba4aa-90c2-48eb-ba39-7013d732503b' } }, security: [ diff --git a/protractor.conf.ts b/protractor.conf.ts index 87b590292f..aeb4681c1c 100644 --- a/protractor.conf.ts +++ b/protractor.conf.ts @@ -5,6 +5,12 @@ const tsConfig = require('./e2e/tsconfig.e2e.json'); const AlfrescoApi = require('@alfresco/js-api').AlfrescoApiCompatibility; const TestConfig = require('./e2e/test.config'); const RESOURCES = require('./e2e/util/resources'); + +require('ts-node').register({ + project: './lib/testing/tsconfig.lib.json' +}); +const ACTIVITI_CLOUD_APPS = require('./lib/testing').ACTIVITI_CLOUD_APPS; + const failFast = require('./e2e/protractor/fail-fast'); const { beforeAllRewrite, afterAllRewrite, beforeEachAllRewrite, afterEachAllRewrite } = require('./e2e/protractor/override-jasmine'); const { uploadScreenshot, saveReport, cleanReportFolder } = require('./e2e/protractor/save-remote'); @@ -16,6 +22,7 @@ const width = 1366, height = 768; let ENV_FILE = process.env.ENV_FILE; let GROUP_SUFFIX = process.env.PREFIX; +RESOURCES.ACTIVITI_CLOUD_APPS = ACTIVITI_CLOUD_APPS; if (ENV_FILE) { require('dotenv').config({ path: ENV_FILE }); } diff --git a/scripts/check-env/check-activiti-env.js b/scripts/check-env/check-activiti-env.js deleted file mode 100755 index e96b5bd0c1..0000000000 --- a/scripts/check-env/check-activiti-env.js +++ /dev/null @@ -1,489 +0,0 @@ -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 pushFailedApps = []; -let notRunningApps = []; -let host; - -let MAX_RETRY = 3; -let counter = 0; -let TIMEOUT = 1000; - - -async function main() { - - console.log('---START---'); - - program - .version('0.1.0') - .option('--host [type]', 'Remote environment host adf.lab.com ') - .option('--oauth [type]', 'oauth host') - .option('--client [type]', 'clientId ') - .option('-p, --password [type]', 'password ') - .option('-u, --username [type]', 'username ') - .parse(process.argv); - - config = { - provider: 'BPM', - hostBpm: `${program.host}`, - authType: 'OAUTH', - oauth2: { - host: `${program.oauth}`, - clientId: program.client, - scope: 'openid', - secret: '', - implicitFlow: false, - silentLogin: false, - redirectUri: '/', - redirectUriLogout: '/logout' - } - }; - - host = program.host; - - console.log('---Login---'); - - try { - this.alfrescoJsApi = new alfrescoApi.AlfrescoApiCompatibility(config); - await this.alfrescoJsApi.login(program.username, program.password); - } catch (e) { - console.log('Login error' + e); - } - - console.log('---Login ok---'); - - - await deployAbsentApps(this.alfrescoJsApi); - - let pushFailed = await getPushFailedApps(this.alfrescoJsApi); - - if (pushFailed && pushFailed.length > 0) { - await deleteStaleApps(this.alfrescoJsApi, pushFailed); - } - - let notRunning = await getNotRunningApps(this.alfrescoJsApi); - - if (notRunning && notRunning.length > 0) { - let notRunningAppAfterWait = await waitPossibleStaleApps(this.alfrescoJsApi, notRunning); - - await deleteStaleApps(this.alfrescoJsApi, notRunningAppAfterWait); - - await deployAbsentApps(this.alfrescoJsApi); - let notRunningSecondAttempt = await getNotRunningApps(this.alfrescoJsApi); - - if (notRunningSecondAttempt && notRunningSecondAttempt.length > 0) { - let notRunningAppAfterWaitSecondAttempt = await waitPossibleStaleApps(this.alfrescoJsApi, notRunningSecondAttempt); - - if (notRunningAppAfterWaitSecondAttempt && notRunningAppAfterWaitSecondAttempt.length > 0) { - console.log(`Not possible to recover the following apps in the environment`); - - notRunningAppAfterWaitSecondAttempt.forEach((currentApp) => { - console.log(`App ${currentApp.entry.name } current status ${JSON.stringify(currentApp.entry.status)}`); - }); - - process.exit(1); - } - } else { - console.log(`Activiti 7 all ok :)`); - } - } else { - console.log(`Activiti 7 all ok :-)`); - } -} - -async function deleteStaleApps(alfrescoJsApi, notRunningAppAfterWait) { - for (const currentApp of notRunningAppAfterWait) { - await deleteApp(alfrescoJsApi, currentApp.entry.name); - } -} - -async function waitPossibleStaleApps(alfrescoJsApi, notRunning) { - pushFailedApps = []; - do { - console.log(`Wait stale app ${TIMEOUT}`); - - notRunning.forEach((currentApp) => { - console.log(`${currentApp.entry.name } ${currentApp.entry.status}`); - }); - - sleep(TIMEOUT); - counter++; - - let runningApps = await getDeployedApplicationsByStatus(alfrescoJsApi, 'RUNNING'); - - notRunning.forEach((currentStaleApp) => { - let nowIsRunning = runningApps.find((currentRunnignApp) => { - return currentStaleApp.entry.name === currentRunnignApp.entry.name; - }); - - if (nowIsRunning) { - console.log(`The ${currentApp.entry.name } is now running`); - - notRunning = notRunning.filter((item) => { - return item.entry.name !== nowIsRunning.entry.name - }) - } - - }); - } while (counter < MAX_RETRY && notRunning.length > 0); - - return notRunning; -} - -async function getNotRunningApps(alfrescoJsApi) { - let allStatusApps = await getDeployedApplicationsByStatus(alfrescoJsApi, ''); - - Object.keys(ACTIVITI7_APPS).forEach((key) => { - let isNotRunning = allStatusApps.find((currentApp) => { - //console.log(currentApp.entry.name + ' ' +currentApp.entry.status); - return ACTIVITI7_APPS[key].name === currentApp.entry.name && currentApp.entry.status !== 'Running'; - }); - - if (isNotRunning && isNotRunning.entry.status !== 'ImagePushFailed') { - notRunningApps.push(isNotRunning); - } - }); - - if (notRunningApps.length > 0) { - console.log(`The following apps are NOT running in the target env:`); - notRunningApps.forEach((currentApp) => { - console.log(`App ${currentApp.entry.name } current status ${JSON.stringify(currentApp.entry.status)}`); - }); - - await checkIfAppIsReleased(alfrescoJsApi, absentApps); - } - - return notRunningApps; -} - -async function getPushFailedApps(alfrescoJsApi) { - let allStatusApps = await getDeployedApplicationsByStatus(alfrescoJsApi, ''); - - Object.keys(ACTIVITI7_APPS).forEach((key) => { - let isNotRunning = allStatusApps.find((currentApp) => { - //console.log(currentApp.entry.name + ' ' +currentApp.entry.status); - return ACTIVITI7_APPS[key].name === currentApp.entry.name && currentApp.entry.status !== 'Running'; - }); - - if (isNotRunning && isNotRunning.entry.status === 'ImagePushFailed') { - pushFailedApps.push(isNotRunning); - } - }); - - if (pushFailedApps.length > 0) { - console.log(`The following apps are pushFailedApps:`); - pushFailedApps.forEach((currentApp) => { - console.log(`App ${currentApp.entry.name } current status ${JSON.stringify(currentApp.entry.status)}`); - }); - - } - - return pushFailedApps; -} - -async function deployAbsentApps(alfrescoJsApi) { - let deployedApps = await getDeployedApplicationsByStatus(alfrescoJsApi, ''); - - Object.keys(ACTIVITI7_APPS).forEach((key) => { - let isPresent = deployedApps.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(alfrescoJsApi, absentApps); - } -} - - -async function checkIfAppIsReleased(apiService, absentApps) { - let listAppsInModeler = await getAppProjects(apiService); - - for (let i = 0; i < absentApps.length; i++) { - let currentAbsentApp = absentApps[i]; - let app = listAppsInModeler.find((currentApp) => { - return currentAbsentApp.name === currentApp.entry.name; - }); - - - if (!app) { - console.log('Missing project, create the project for ' + currentAbsentApp.name); - - let uploadedApp = await importProjectApp(apiService, currentAbsentApp); - - console.log('Project uploaded ' + currentAbsentApp.name); - - if (uploadedApp) { - await releaseApp(apiService, uploadedApp); - await deployApp(apiService, uploadedApp, currentAbsentApp.name); - sleep(120000);///wait to not fail - } - } else { - console.log('Project for ' + currentAbsentApp.name + ' present'); - - let appRelease = undefined; - let appReleaseList = await getReleaseAppProjectId(apiService, app.entry.id); - - if (appReleaseList.list.entries.length === 0) { - console.log('Needs to release'); - appRelease = await releaseApp(apiService, app); - - } else { - console.log('Not Need to release' + JSON.stringify(appReleaseList)); - - let currentReleaseVersion = -1; - - appReleaseList.list.entries.forEach((currentRelease) => { - if (currentRelease.entry.version > currentReleaseVersion) { - currentReleaseVersion = currentRelease.entry.version; - appRelease = currentRelease; - } - }); - - } - - console.log('App to deploy app release id ' + JSON.stringify(appRelease)); - - await deployApp(apiService, appRelease, currentAbsentApp.name); - sleep(120000);///wait to not fail - } - } -} - -async function deployApp(apiService, app, name) { - console.log(`Deploy app ${name}`); - - const url = `${config.hostBpm}/deployment-service/v1/applications`; - - const pathParams = {}; - const bodyParam = { - "name": name, - "releaseId": app.entry.id, - "version": app.entry.name, - "security": [{"role": "APS_ADMIN", "groups": [], "users": ["admin.adf", "superadminuser"]}, { - "role": "APS_USER", - "groups": ["hr", "testgroup"], - "users": ["admin.adf"] - }] - }; - - const headerParams = {}, formParams = {}, queryParams = {}, - 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 deploy the project ${name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`); - await deleteSiteByName(name); - process.exit(1); - } -} - -async function importProjectApp(apiService, app) { - const pathFile = path.join('./e2e/' + app.file_location); - console.log(pathFile); - const file = fs.createReadStream(pathFile); - - const url = `${config.hostBpm}/modeling-service/v1/projects/import`; - - const pathParams = {}, queryParams = {}, - headerParams = {}, formParams = {'file': file}, bodyParam = {}, - contentTypes = ['multipart/form-data'], accepts = ['application/json']; - - try { - console.log('import app ' + app.file_location); - return await apiService.oauth2Auth.callCustomApi(url, 'POST', pathParams, queryParams, headerParams, formParams, bodyParam, - contentTypes, accepts); - } catch (error) { - if (error.status !== 409) { - console.log(`Not possible to upload the project ${app.name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`); - process.exit(1); - } else { - console.log(`Not possible to upload the project because inconsistency CS - Modelling try to delete manually the node`); - await deleteSiteByName(app.name); - await importProjectApp(apiService, app); - } - } -} - -async function getReleaseAppProjectId(apiService, projectId) { - const url = `${config.hostBpm}/modeling-service/v1/projects/${projectId}/releases`; - - const pathParams = {}, queryParams = {}, - headerParams = {}, formParams = {}, bodyParam = {}, - contentTypes = ['application/json'], accepts = ['application/json']; - - try { - return await apiService.oauth2Auth.callCustomApi(url, 'GET', pathParams, queryParams, headerParams, formParams, bodyParam, - contentTypes, accepts); - } catch (error) { - console.log(`Not possible to get the release of the project ${projectId} ` + JSON.stringify(error)); - process.exit(1); - } - -} - -async function releaseApp(apiService, app) { - const url = `${config.hostBpm}/modeling-service/v1/projects/${app.entry.id}/releases`; - - console.log(url); - console.log('Release ID ' + app.entry.id); - 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} status : $ \n ${JSON.stringify(error.status)} \n ${JSON.stringify(error.response.text)}`); - process.exit(1); - } - -} - -async function getDeployedApplicationsByStatus(apiService, status) { - const url = `${config.hostBpm}/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 applications from deployment-service ${JSON.stringify(error)} `); - process.exit(1); - } - -} - -async function getAppProjects(apiService, status) { - const url = `${config.hostBpm}/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 modeling-service ` + error); - process.exit(1); - } -} - -async function deleteApp(apiService, appName) { - console.log(`Delete the app ${appName}`); - - const url = `${config.hostBpm}/deployment-service/v1/applications/${appName}`; - - const pathParams = {}, queryParams = {}, - headerParams = {}, formParams = {}, bodyParam = {}, - contentTypes = ['application/json'], accepts = ['application/json']; - - try { - await apiService.oauth2Auth.callCustomApi(url, 'DELETE', pathParams, queryParams, headerParams, formParams, bodyParam, - contentTypes, accepts); - - ///it needs time - console.log(`Deleting apps stale wait 3 minutes`); - sleep(180000); - console.log(`App deleted`); - } catch (error) { - console.log(`Not possible to delete the application from modeling-service` + error); - process.exit(1); - } -} - -function sleep(delay) { - var start = new Date().getTime(); - while (new Date().getTime() < start + delay) ; -} - -async function deleteChildrenNodeByName(alfrescoJsApi, nameNodeToDelete, nodeId) { - let childrenNodes = await alfrescoJsApi.core.nodesApi.getNodeChildren(nodeId); - - let childrenToDelete = childrenNodes.list.entries.find((currentNode) => { - return currentNode.entry.name === nameNodeToDelete; - }); - - console.log('childrenToDelete ' + childrenToDelete.entry.name); - - if (childrenToDelete) { - await alfrescoJsApi.core.nodesApi.deleteNode(childrenToDelete.entry.id); - } - - -} - -async function deleteSiteByName(name) { - - console.log(`====== Delete Site ${name} ${program.host} ======`); - - let alfrescoJsApi = new alfrescoApi.AlfrescoApiCompatibility({ - provider: 'ECM', - hostEcm: `https://${program.host}` - }); - - await this.alfrescoJsApi.login(program.username, program.password); - - let listSites = []; - - try { - listSites = await alfrescoJsApi.core.sitesApi.getSites(); - } catch (error) { - console.log('error get list sites' + JSON.stringify(error)); - process.exit(1); - } - - let apsModelingNodeId; - let apsReleaseNodeId; - - if (listSites && listSites.list.entries.length > 0) { - for (let i = 0; i < listSites.list.entries.length; i++) { - if (listSites.list.entries[i].entry.id === name) { - try { - await alfrescoJsApi.core.sitesApi.deleteSite(listSites.list.entries[i].entry.id, {options: {permanent: true}}); - } catch (error) { - console.log('error' + JSON.stringify(error)); - } - } - - if (listSites.list.entries[i].entry.id === 'ApsModeling') { - apsModelingNodeId = listSites.list.entries[i].entry.guid; - } - - if (listSites.list.entries[i].entry.id === 'ApsRelease') { - apsReleaseNodeId = listSites.list.entries[i].entry.guid; - } - } - } - - console.log(`====== Delete Folder in apsModeling`); - await deleteChildrenNodeByName(alfrescoJsApi, name, apsModelingNodeId); - - console.log(`====== Delete Folder in apsRelease`); - await deleteChildrenNodeByName(alfrescoJsApi, name, apsReleaseNodeId); -} - -main(); diff --git a/scripts/check-env/delete-all-apps.js b/scripts/check-env/delete-all-apps.js index 6338f48c03..6622455cb5 100755 --- a/scripts/check-env/delete-all-apps.js +++ b/scripts/check-env/delete-all-apps.js @@ -1,6 +1,6 @@ let alfrescoApi = require('@alfresco/js-api'); let program = require('commander'); -let ACTIVITI7_APPS = require('../../e2e/util/resources').ACTIVITI7_APPS; +const RESOURCES_CLOUD = require("@alfresco/adf-process-services-cloud"); let config = {}; let absentApps = []; @@ -42,8 +42,8 @@ async function main() { console.log('Login error' + e); } - for (const key of Object.keys(ACTIVITI7_APPS)) { - await deleteApp(alfrescoJsApi, ACTIVITI7_APPS[key].name); + for (const key of Object.keys(RESOURCES_CLOUD.ACTIVITI_CLOUD_APPS)) { + await deleteApp(alfrescoJsApi, RESOURCES_CLOUD.ACTIVITI_CLOUD_APPS[key].name); } let notRunning = await getNotRunningApps(this.alfrescoJsApi); @@ -56,10 +56,10 @@ async function main() { async function getNotRunningApps(alfrescoJsApi) { let allStatusApps = await getDeployedApplicationsByStatus(alfrescoJsApi, ''); - Object.keys(ACTIVITI7_APPS).forEach((key) => { + Object.keys(RESOURCES_CLOUD.ACTIVITI_CLOUD_APPS).forEach((key) => { let isNotRunning = allStatusApps.find((currentApp) => { //console.log(currentApp.entry.name + ' ' +currentApp.entry.status); - return ACTIVITI7_APPS[key].name === currentApp.entry.name && currentApp.entry.status !== 'Running'; + return RESOURCES_CLOUD.ACTIVITI_CLOUD_APPS[key].name === currentApp.entry.name && currentApp.entry.status !== 'Running'; }); if (isNotRunning && isNotRunning.entry.status !== 'ImagePushFailed') { diff --git a/scripts/test-e2e-lib.sh b/scripts/test-e2e-lib.sh index 0b1a411e9e..1ea7480185 100755 --- a/scripts/test-e2e-lib.sh +++ b/scripts/test-e2e-lib.sh @@ -221,6 +221,11 @@ fi echo "====== Update webdriver-manager =====" ./node_modules/protractor/bin/webdriver-manager update --gecko=false +export DEBUG_OPTION='' +if [[ $DEBUG == "true" ]]; then + DEBUG_OPTION=' node --inspect-brk ' +fi + if [[ $DEVELOPMENT == "true" ]]; then echo "====== Run against local development =====" npm run e2e-lib || exit 1 @@ -243,14 +248,8 @@ else sed -e "s/\"ecmHost\": \".*\"/\"ecmHost\": \"${encoded}\"/g" "${sedi[@]}" demo-shell/dist/app.config.json fi - npm run lite-server-e2e>/dev/null & ./node_modules/protractor/bin/protractor protractor.conf.ts || exit 1 + npm run lite-server-e2e>/dev/null & $DEBUG_OPTION ./node_modules/protractor/bin/protractor protractor.conf.ts || exit 1 else - if [[ $DEBUG == "true" ]]; then - echo "====== DEBUG npm run lite-server-e2e>/dev/null & ./node_modules/protractor/bin/protractor protractor.conf.ts || exit 1 - else=====" - node --inspect-brk ./node_modules/protractor/bin/protractor protractor.conf.ts || exit 1 - else - ./node_modules/protractor/bin/protractor protractor.conf.ts || exit 1 - fi + $DEBUG_OPTION ./node_modules/protractor/bin/protractor protractor.conf.ts || exit 1 fi fi diff --git a/scripts/travis/e2e/process-services-cloud-e2e.sh b/scripts/travis/e2e/process-services-cloud-e2e.sh index edf58ffddd..cc3fa09e97 100755 --- a/scripts/travis/e2e/process-services-cloud-e2e.sh +++ b/scripts/travis/e2e/process-services-cloud-e2e.sh @@ -13,17 +13,18 @@ AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/ RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" -host_sso "$E2E_HOST_SSO" -host_bpm "$E2E_HOST_BPM" -host_identity "$E2E_HOST_IDENTITY" -identity_admin_email "$E2E_ADMIN_EMAIL_IDENTITY" -identity_admin_password "$E2E_ADMIN_PASSWORD_IDENTITY" -prefix $TRAVIS_BUILD_NUMBER --use-dist -gnu ) +./node_modules/@alfresco/adf-cli/bin/adf-cli init-aae-env --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" --username "$E2E_USERNAME" --password "$E2E_PASSWORD" --clientId 'activiti' || exit 1 +node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 + if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || $TRAVIS_PULL_REQUEST == "false" ]]; then - node ./scripts/check-env/check-activiti-env.js --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --client 'activiti' || exit 1 - node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 - + echo "Case 1 - adf-testing has been changed"; $RUN_E2E --folder $CONTEXT_ENV else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]]; then + echo "Case 2 - e2e/$CONTEXT_ENV folder has been changed"; HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)" LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV/" | paste -sd , -)" - node ./scripts/check-env/check-activiti-env.js --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --client 'activiti' || exit 1 if [[ $LIST_SPECS != "" ]]; then echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS