@Before
  public void initialise() {
    // create mock db objects
    databaseSession = new MockDatabaseSession();
    databaseSession.setEntities(entities);

    // create quality profile hierarchy
    int numberOfProfiles = 4;
    int numberOfRules = 100;
    rulesProfiles = createRuleProfileHierarchy("qp", numberOfProfiles, numberOfRules);

    // create test project DTO
    Integer projectId = new Integer(123);
    testProject = new Project("test.project.key");
    testProject.setId(projectId);
    testProject.setName("testProject");
    testProject.setLanguage(Java.INSTANCE);

    // create test project entity
    testProjectModel = new ResourceModel();
    testProjectModel.setId(projectId);
    testProjectModel.setKey(testProject.getKey());
    testProjectModel.setEnabled(Boolean.TRUE);
    testProjectModel.setRootId(projectId);
    testProjectModel.setLanguageKey(Java.KEY);
    testProjectModel.setRulesProfile(createRulesProfile("testProjectProfile", numberOfRules));

    // add project to db objects
    MockDatabaseSession.EntityKey projectKey =
        databaseSession.new EntityKey(ResourceModel.class, projectId);
    entities.put(projectKey, testProjectModel);
    databaseSession.addMockQueryResults(ResourceModel.class, Arrays.asList(testProjectModel));

    // define test threshold
    int violationThreshold = 10;

    // create violations
    List<ActiveRule> rules = rulesProfiles[0].getActiveRules();
    int numberOfViolationsToBUnderThreshold = ((numberOfRules / 100) * violationThreshold) - 1;
    for (int i = 0; i < numberOfViolationsToBUnderThreshold; i++) {
      violations.add(Violation.create(rules.get(i), testProject));
    }

    // create context
    decoratorContext = new MockDecoratorContext(testProject, testProject, violations);

    // define default settings
    settings = new Settings();
    settings.setProperty(
        ProfileProgressionPlugin.GLOBAL_QUALITY_PROFILE_CHANGE_ENABLED_KEY, "true");
    settings.setProperty(
        ProfileProgressionPlugin.PROJECT_QUALITY_PROFILE_CHANGE_ENABLED_KEY, "true");
    settings.setProperty(
        ProfileProgressionPlugin.QUALITY_PROFILE_CHANGE_THRESHOLD_KEY,
        String.valueOf(violationThreshold));
    settings.setProperty(
        ProfileProgressionPlugin.GLOBAL_TARGET_LANGUAGE_QUALITY_PROFILE_KEY,
        rulesProfiles[numberOfProfiles - 1].getName());
  }
  @Test
  public void testProjectWithParentManagedProfileUsedByAnotherProject() {
    // make current test profile child of managed one
    testProjectModel.getRulesProfile().setParentName(rulesProfiles[0].getName());

    // create another test project entity
    Integer project2Id = new Integer(5678);
    ResourceModel testProjectModel2 = new ResourceModel();
    testProjectModel2.setId(project2Id);
    testProjectModel2.setKey("test.project2.key");
    testProjectModel2.setEnabled(Boolean.TRUE);
    testProjectModel2.setRootId(project2Id);
    testProjectModel2.setLanguageKey(Java.KEY);
    testProjectModel2.setRulesProfile(testProjectModel.getRulesProfile());

    // add projects to db objects
    MockDatabaseSession.EntityKey projectKey =
        databaseSession.new EntityKey(ResourceModel.class, project2Id);
    entities.put(projectKey, testProjectModel2);
    databaseSession.addMockQueryResults(
        ResourceModel.class, Arrays.asList(testProjectModel, testProjectModel2));

    // test quality profile changes
    String parentProfileBefore = testProjectModel.getRulesProfile().getParentName();
    runAnalysis();
    String parentProfileAfter = testProjectModel.getRulesProfile().getParentName();

    testOutcome(
        "Project profile's parent has been changed despite being used by another project.",
        parentProfileBefore,
        parentProfileAfter,
        true);

    ArgumentCaptor<Notification> argument = ArgumentCaptor.forClass(Notification.class);
    verify(notificationManager).scheduleForSending(argument.capture());
    Notification notification = argument.getValue();

    // check notification has project info
    assertThat(
        "Notification doesn't contain project name",
        notification.getFieldValue(ProfileProgressionPlugin.NOTIFICATION_PROJECT_NAME_KEY),
        equalTo(testProjectModel.getName()));
    assertThat(
        "Notification doesn't contain project id",
        notification.getFieldValue(ProfileProgressionPlugin.NOTIFICATION_PROJECT_ID_KEY),
        equalTo(String.valueOf(testProjectModel.getId())));
    assertThat(
        "Notification doesn't contain project key",
        notification.getFieldValue(ProfileProgressionPlugin.NOTIFICATION_PROJECT_KEY_KEY),
        equalTo(testProjectModel.getKey()));

    // check that message mentioned other project
    assertThat(
        "Notification message doesn't contain key of project blocking progression",
        notification.getFieldValue(ProfileProgressionPlugin.NOTIFICATION_MESSAGE_KEY),
        containsString(testProjectModel2.getKey()));
  }