public void testCaseOnePreviousDeploymentWithPA() {
    // given

    MyEmbeddedProcessApplication application = new MyEmbeddedProcessApplication();

    // first deployment
    Deployment deployment1 =
        repositoryService
            .createDeployment(application.getReference())
            .name(DEPLOYMENT_NAME)
            .addClasspathResource(CMMN_RESOURCE_1)
            .deploy();

    // second deployment
    Deployment deployment2 =
        repositoryService
            .createDeployment()
            .name(DEPLOYMENT_NAME)
            .addDeploymentResources(deployment1.getId())
            .deploy();

    verifyQueryResults(caseDefinitionQueryByKey(CASE_KEY_1), 2);

    // when
    caseService.createCaseInstanceByKey(CASE_KEY_1);

    // then
    assertTrue(application.isCalled());

    deleteDeployments(deployment1, deployment2);
  }
  public void testProcessOnePreviousDeploymentWithPA() {
    // given

    MyEmbeddedProcessApplication application = new MyEmbeddedProcessApplication();

    // first deployment
    Deployment deployment1 =
        repositoryService
            .createDeployment(application.getReference())
            .name(DEPLOYMENT_NAME)
            .addModelInstance(BPMN_RESOURCE_1, createProcessWithServiceTask(PROCESS_KEY_1))
            .deploy();

    // second deployment
    Deployment deployment2 =
        repositoryService
            .createDeployment()
            .name(DEPLOYMENT_NAME)
            .addDeploymentResources(deployment1.getId())
            .deploy();

    verifyQueryResults(processDefinitionQueryByKey(PROCESS_KEY_1), 2);

    // when
    runtimeService.startProcessInstanceByKey(PROCESS_KEY_1);

    // then
    assertTrue(application.isCalled());

    deleteDeployments(deployment1, deployment2);
  }
  public void testCaseTwoPreviousDeploymentsWithDifferentPA() {
    // given

    // first deployment
    MyEmbeddedProcessApplication application1 = new MyEmbeddedProcessApplication();
    Deployment deployment1 =
        repositoryService
            .createDeployment(application1.getReference())
            .name(DEPLOYMENT_NAME)
            .addClasspathResource(CMMN_RESOURCE_1)
            .addClasspathResource(CMMN_RESOURCE_2)
            .deploy();

    // second deployment
    MyEmbeddedProcessApplication application2 = new MyEmbeddedProcessApplication();
    Deployment deployment2 =
        repositoryService
            .createDeployment(application2.getReference())
            .name(DEPLOYMENT_NAME)
            .addClasspathResource(CMMN_RESOURCE_1)
            .deploy();

    // third deployment
    Deployment deployment3 =
        repositoryService
            .createDeployment()
            .name(DEPLOYMENT_NAME)
            .addDeploymentResources(deployment1.getId())
            .deploy();

    verifyQueryResults(caseDefinitionQueryByKey(CASE_KEY_1), 3);
    verifyQueryResults(caseDefinitionQueryByKey(CASE_KEY_2), 2);

    // when (1)
    caseService.createCaseInstanceByKey(CASE_KEY_1);

    // then (1)
    assertFalse(application1.isCalled());
    assertTrue(application2.isCalled());

    // reset flag
    application2.setCalled(false);

    // when (2)
    caseService.createCaseInstanceByKey(CASE_KEY_2);

    // then (2)
    assertTrue(application1.isCalled());
    assertFalse(application2.isCalled());

    deleteDeployments(deployment1, deployment2, deployment3);
  }
  public void testProcessTwoPreviousDeploymentsWithDifferentPA() {
    // given

    // first deployment
    MyEmbeddedProcessApplication application1 = new MyEmbeddedProcessApplication();
    Deployment deployment1 =
        repositoryService
            .createDeployment(application1.getReference())
            .name(DEPLOYMENT_NAME)
            .addModelInstance(BPMN_RESOURCE_1, createProcessWithServiceTask(PROCESS_KEY_1))
            .addModelInstance(BPMN_RESOURCE_2, createProcessWithServiceTask(PROCESS_KEY_2))
            .deploy();

    // second deployment
    MyEmbeddedProcessApplication application2 = new MyEmbeddedProcessApplication();
    Deployment deployment2 =
        repositoryService
            .createDeployment(application2.getReference())
            .name(DEPLOYMENT_NAME)
            .addModelInstance(BPMN_RESOURCE_1, createProcessWithServiceTask(PROCESS_KEY_1))
            .deploy();

    // third deployment
    Deployment deployment3 =
        repositoryService
            .createDeployment()
            .name(DEPLOYMENT_NAME)
            .addDeploymentResources(deployment1.getId())
            .deploy();

    verifyQueryResults(processDefinitionQueryByKey(PROCESS_KEY_1), 3);
    verifyQueryResults(processDefinitionQueryByKey(PROCESS_KEY_2), 2);

    // when (1)
    runtimeService.startProcessInstanceByKey(PROCESS_KEY_1);

    // then (1)
    assertFalse(application1.isCalled());
    assertTrue(application2.isCalled());

    // reset flag
    application2.setCalled(false);

    // when (2)
    runtimeService.startProcessInstanceByKey(PROCESS_KEY_2);

    // then (2)
    assertTrue(application1.isCalled());
    assertFalse(application2.isCalled());

    deleteDeployments(deployment1, deployment2, deployment3);
  }
  public void testCaseTwoPreviousDeploymentUnregisterSecondPA() {
    // given

    // first deployment
    MyEmbeddedProcessApplication application1 = new MyEmbeddedProcessApplication();
    Deployment deployment1 =
        repositoryService
            .createDeployment(application1.getReference())
            .name(DEPLOYMENT_NAME)
            .addClasspathResource(CMMN_RESOURCE_1)
            .deploy();

    // second deployment
    MyEmbeddedProcessApplication application2 = new MyEmbeddedProcessApplication();
    Deployment deployment2 =
        repositoryService
            .createDeployment(application2.getReference())
            .name(DEPLOYMENT_NAME)
            .addClasspathResource(CMMN_RESOURCE_1)
            .deploy();

    // second deployment
    Deployment deployment3 =
        repositoryService
            .createDeployment()
            .name(DEPLOYMENT_NAME)
            .addDeploymentResources(deployment1.getId())
            .deploy();

    verifyQueryResults(caseDefinitionQueryByKey(CASE_KEY_1), 3);

    // when
    managementService.unregisterProcessApplication(deployment2.getId(), true);
    caseService.createCaseInstanceByKey(CASE_KEY_1);

    // then
    assertTrue(application1.isCalled());
    assertFalse(application2.isCalled());

    deleteDeployments(deployment1, deployment2, deployment3);
  }