@Test public void testCannotUpdateEventTriggerForNonEvent() { ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); try { runtimeService .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask", "userTask").updateEventTrigger() .build(); fail("Should not succeed"); } catch (MigrationPlanValidationException e) { assertThat(e.getValidationReport()) .hasInstructionFailures("userTask", "Cannot update event trigger because the activity does not define a persistent event trigger" ); } }
@Test public void testCannotFlipAncestorScopes() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.DOUBLE_SUBPROCESS_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.DOUBLE_SUBPROCESS_PROCESS); // when try { rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("outerSubProcess", "innerSubProcess") .mapActivities("innerSubProcess", "outerSubProcess") .mapActivities("userTask", "userTask") .build(); Assert.fail("should not validate"); } catch (MigrationPlanValidationException e) { MigrationPlanValidationReportAssert.assertThat(e.getValidationReport()) .hasInstructionFailures("innerSubProcess", "The closest mapped ancestor 'outerSubProcess' is mapped to scope 'innerSubProcess' which is not an ancestor of target scope 'outerSubProcess'" ); } } }
@Test public void testUpdateConditionalEventExpression() { // given BpmnModelInstance sourceProcess = EventSubProcessModels.FALSE_CONDITIONAL_EVENT_SUBPROCESS_PROCESS; BpmnModelInstance targetProcess = modify(CONDITIONAL_EVENT_SUBPROCESS_PROCESS); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(sourceProcess); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(targetProcess); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(USER_TASK_ID, USER_TASK_ID) .mapActivities(EVENT_SUB_PROCESS_START_ID, EVENT_SUB_PROCESS_START_ID).updateEventTrigger() .build(); // when process is migrated without update event trigger testHelper.createProcessInstanceAndMigrate(migrationPlan); // then condition is migrated and has new condition expr testHelper.assertEventSubscriptionMigrated(EVENT_SUB_PROCESS_START_ID, EVENT_SUB_PROCESS_START_ID, null); // and it is possible to successfully complete the migrated instance testHelper.setAnyVariable(testHelper.snapshotAfterMigration.getProcessInstanceId()); testHelper.completeTask(EVENT_SUB_PROCESS_TASK_ID); testHelper.assertProcessEnded(testHelper.snapshotBeforeMigration.getProcessInstanceId()); } }
@Test public void testMigrateNonExistingSourceDefinition() { ProcessDefinition processDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); try { runtimeService .createMigrationPlan("aNonExistingProcDefId", processDefinition.getId()) .mapActivities("userTask", "userTask") .build(); fail("Should not succeed"); } catch (BadUserRequestException e) { assertExceptionMessage(e, "Source process definition with id 'aNonExistingProcDefId' does not exist"); } }
public static MigrationPlan toMigrationPlan(ProcessEngine processEngine, MigrationPlanDto migrationPlanDto) { MigrationPlanBuilder migrationPlanBuilder = processEngine.getRuntimeService().createMigrationPlan(migrationPlanDto.getSourceProcessDefinitionId(), migrationPlanDto.getTargetProcessDefinitionId()); if (migrationPlanDto.getInstructions() != null) { for (MigrationInstructionDto migrationInstructionDto : migrationPlanDto.getInstructions()) { MigrationInstructionBuilder migrationInstructionBuilder = migrationPlanBuilder.mapActivities(migrationInstructionDto.getSourceActivityIds().get(0), migrationInstructionDto.getTargetActivityIds().get(0)); if (Boolean.TRUE.equals(migrationInstructionDto.isUpdateEventTrigger())) { migrationInstructionBuilder = migrationInstructionBuilder.updateEventTrigger(); } migrationPlanBuilder = migrationInstructionBuilder; } } return migrationPlanBuilder.build(); }
@Test public void testMigrateNonExistingTargetDefinition() { ProcessDefinition processDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); try { runtimeService .createMigrationPlan(processDefinition.getId(), "aNonExistingProcDefId") .mapActivities("userTask", "userTask") .build(); fail("Should not succeed"); } catch (BadUserRequestException e) { assertExceptionMessage(e, "Target process definition with id 'aNonExistingProcDefId' does not exist"); } }
public static MigrationPlan toMigrationPlan(ProcessEngine processEngine, MigrationPlanDto migrationPlanDto) { MigrationPlanBuilder migrationPlanBuilder = processEngine.getRuntimeService().createMigrationPlan(migrationPlanDto.getSourceProcessDefinitionId(), migrationPlanDto.getTargetProcessDefinitionId()); if (migrationPlanDto.getInstructions() != null) { for (MigrationInstructionDto migrationInstructionDto : migrationPlanDto.getInstructions()) { MigrationInstructionBuilder migrationInstructionBuilder = migrationPlanBuilder.mapActivities(migrationInstructionDto.getSourceActivityIds().get(0), migrationInstructionDto.getTargetActivityIds().get(0)); if (Boolean.TRUE.equals(migrationInstructionDto.isUpdateEventTrigger())) { migrationInstructionBuilder = migrationInstructionBuilder.updateEventTrigger(); } migrationPlanBuilder = migrationInstructionBuilder; } } return migrationPlanBuilder.build(); }
@Test public void testCannotRemoveParentScopeAndMoveOutOfGrandParentScope() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.TRIPLE_SUBPROCESS_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.TRIPLE_SUBPROCESS_PROCESS); // when try { // subProcess2 is not migrated // subProcess 3 is moved out of the subProcess1 scope (by becoming a subProcess1 itself) rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("subProcess1", "subProcess1") .mapActivities("subProcess3", "subProcess1") .mapActivities("userTask", "userTask") .build(); Assert.fail("should not validate"); } catch (MigrationPlanValidationException e) { MigrationPlanValidationReportAssert.assertThat(e.getValidationReport()) .hasInstructionFailures("subProcess3", "The closest mapped ancestor 'subProcess1' is mapped to scope 'subProcess1' which is not an ancestor of target scope 'subProcess1'" ); } }
@Test public void testMigrateNullTargetDefinition() { ProcessDefinition processDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); try { runtimeService .createMigrationPlan(processDefinition.getId(), null) .mapActivities("userTask", "userTask") .build(); fail("Should not succeed"); } catch (BadUserRequestException e) { assertExceptionMessage(e, "Target process definition id is null"); } }
@Test public void testCannotUpdateEventTriggerForEventSubProcess() { ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(EventSubProcessModels.TIMER_EVENT_SUBPROCESS_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(EventSubProcessModels.TIMER_EVENT_SUBPROCESS_PROCESS); try { runtimeService .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("eventSubProcess", "eventSubProcess").updateEventTrigger() .build(); fail("Should not succeed"); } catch (MigrationPlanValidationException e) { assertThat(e.getValidationReport()) .hasInstructionFailures("eventSubProcess", "Cannot update event trigger because the activity does not define a persistent event trigger" ); } }
@Test public void testMigrateConditionalBoundaryEventKeepTrigger() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(CONDITIONAL_EVENT_SUBPROCESS_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(CONDITIONAL_EVENT_SUBPROCESS_PROCESS); // expected migration validation exception exceptionRule.expect(MigrationPlanValidationException.class); exceptionRule.expectMessage(MIGRATION_CONDITIONAL_VALIDATION_ERROR_MSG); // when conditional event sub process is migrated without update event trigger rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(USER_TASK_ID, USER_TASK_ID) .mapActivities(EVENT_SUB_PROCESS_START_ID, EVENT_SUB_PROCESS_START_ID) .build(); }
@Test public void testMigrateNullSourceDefinition() { ProcessDefinition processDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); try { runtimeService .createMigrationPlan(null, processDefinition.getId()) .mapActivities("userTask", "userTask") .build(); fail("Should not succeed"); } catch (BadUserRequestException e) { assertExceptionMessage(e, "Source process definition id is null"); } }
@Test public void testCanUpdateEventTriggerForEventSubProcessStartEvent() { ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(EventSubProcessModels.TIMER_EVENT_SUBPROCESS_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(EventSubProcessModels.TIMER_EVENT_SUBPROCESS_PROCESS); MigrationPlan migrationPlan = runtimeService .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("eventSubProcessStart", "eventSubProcessStart").updateEventTrigger() .build(); assertThat(migrationPlan) .hasSourceProcessDefinition(sourceProcessDefinition) .hasTargetProcessDefinition(targetProcessDefinition) .hasInstructions( migrate("eventSubProcessStart").to("eventSubProcessStart").updateEventTrigger(true) ); }
@Test public void testContinueProcess() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(TransactionModels.ONE_TASK_TRANSACTION); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(TransactionModels.ONE_TASK_TRANSACTION); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("transaction", "transaction") .mapActivities("userTask", "userTask") .build(); // when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); // then testHelper.completeTask("userTask"); testHelper.assertProcessEnded(processInstance.getId()); }
@Test public void testMigrateConditionalEventWithoutUpdateTrigger() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ONE_CONDITION_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ONE_CONDITION_PROCESS); //expect migration validation exception exceptionRule.expect(MigrationPlanValidationException.class); exceptionRule.expectMessage(MIGRATION_CONDITIONAL_VALIDATION_ERROR_MSG); //when conditional event is migrated without update event trigger rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(CONDITION_ID, CONDITION_ID) .build(); }
@Test public void testMigrateEventSubscription() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ONE_CONDITION_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ONE_CONDITION_PROCESS); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(CONDITION_ID, CONDITION_ID).updateEventTrigger() .build(); //when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); testHelper.assertEventSubscriptionMigrated(CONDITION_ID, CONDITION_ID, null); //then it is possible to trigger the conditional event testHelper.setVariable(processInstance.getId(), VAR_NAME, "1"); testHelper.completeTask(USER_TASK_ID); testHelper.assertProcessEnded(processInstance.getId()); }
@Test public void testNotMapActivitiesMoreThanOnce() { ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.PARALLEL_GATEWAY_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.PARALLEL_GATEWAY_PROCESS); try { runtimeService .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask1", "userTask1") .mapActivities("userTask1", "userTask2") .build(); fail("Should not succeed"); } catch (MigrationPlanValidationException e) { assertThat(e.getValidationReport()) .hasInstructionFailures("userTask1", "There are multiple mappings for source activity id 'userTask1'", "There are multiple mappings for source activity id 'userTask1'" ); } }
@Test public void testMigrateNullSourceActivityId() { ProcessDefinition sourceDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); ProcessDefinition targetDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); try { runtimeService .createMigrationPlan(sourceDefinition.getId(), targetDefinition.getId()) .mapActivities(null, "userTask") .build(); fail("Should not succeed"); } catch (MigrationPlanValidationException e) { assertThat(e.getValidationReport()) .hasInstructionFailures(null, "Source activity id is null"); } }
@Test public void testMigrateEventSubscriptionUpdateMessageName() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(MessageReceiveModels.ONE_MESSAGE_CATCH_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(modify(MessageReceiveModels.ONE_MESSAGE_CATCH_PROCESS) .renameMessage(MessageReceiveModels.MESSAGE_NAME, "new" + MessageReceiveModels.MESSAGE_NAME)); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("messageCatch", "messageCatch") .updateEventTrigger() .build(); // when ProcessInstance processInstance = testHelper.createProcessInstanceAndMigrate(migrationPlan); // then the message event subscription's event name has changed testHelper.assertEventSubscriptionMigrated( "messageCatch", MessageReceiveModels.MESSAGE_NAME, "messageCatch", "new" + MessageReceiveModels.MESSAGE_NAME); // and it is possible to trigger the event rule.getRuntimeService().correlateMessage("new" + MessageReceiveModels.MESSAGE_NAME); testHelper.completeTask("userTask"); testHelper.assertProcessEnded(processInstance.getId()); }
@Test public void testMigrateEventSubprocessChangeStartEventType() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(EventSubProcessModels.SIGNAL_EVENT_SUBPROCESS_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(EventSubProcessModels.TIMER_EVENT_SUBPROCESS_PROCESS); try { // when rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities(USER_TASK_ID, USER_TASK_ID) .mapActivities(EVENT_SUB_PROCESS_START_ID, EVENT_SUB_PROCESS_START_ID) .build(); Assert.fail("exception expected"); } catch (MigrationPlanValidationException e) { // then assertThat(e.getValidationReport()) .hasInstructionFailures(EVENT_SUB_PROCESS_START_ID, "Events are not of the same type (signalStartEvent != startTimerEvent)" ); } }