@Test
  public void take_now_if_date_in_the_future() throws Exception {
    db.prepareDbUnit(getClass(), "before.xml");
    System2 system2 = mock(System2.class);
    when(system2.now()).thenReturn(0L);

    MigrationStep migration = new FeedIssuesLongDates(db.database(), mock(System2.class));
    migration.execute();

    int count = db.countSql("select count(*) from issues where " + "issue_creation_date_ms = 0");
    assertThat(count).isEqualTo(1);
  }
  @Test
  public void take_snapshot_date_if_in_the_past() throws Exception {
    db.prepareDbUnit(getClass(), "before.xml");
    long snapshotTime = parseDate("2014-09-25").getTime();

    MigrationStep migration = new FeedIssuesLongDates(db.database(), System2.INSTANCE);
    migration.execute();

    int count =
        db.countSql(
            "select count(*) from issues where " + "issue_creation_date_ms=" + snapshotTime);
    assertThat(count).isEqualTo(1);
  }
  @Test
  public void execute() throws Exception {
    db.prepareDbUnit(getClass(), "before.xml");

    MigrationStep migration = new FeedIssuesLongDates(db.database(), System2.INSTANCE);
    migration.execute();

    int count =
        db.countSql(
            "select count(*) from issues where "
                + "issue_creation_date_ms is not null "
                + "and issue_update_date_ms is not null "
                + "and issue_close_date_ms is not null");
    assertThat(count).isEqualTo(2);
  }
  @Test
  public void migrate_components_without_uuid() throws Exception {
    db.prepareDbUnit(getClass(), "migrate_components_without_uuid.xml");

    migration.execute();
    db.getSession().commit();

    // Root project migrated
    Component root = mapper.selectComponentByKey("org.struts:struts");
    assertThat(root.getUuid()).isNotNull();
    assertThat(root.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(root.getModuleUuid()).isNull();
    assertThat(root.getModuleUuidPath()).isEmpty();

    // Module with a snapshot having no islast=true
    Component module = mapper.selectComponentByKey("org.struts:struts-core");
    assertThat(module.getUuid()).isNotNull();
    assertThat(module.getProjectUuid()).isEqualTo(module.getUuid());
    assertThat(module.getModuleUuid()).isNull();
    assertThat(module.getModuleUuidPath()).isEmpty();

    // File linked on a no more existing project
    Component file =
        mapper.selectComponentByKey("org.struts:struts-core:src/org/struts/RequestContext.java");
    assertThat(file.getUuid()).isNotNull();
    assertThat(file.getProjectUuid()).isEqualTo(file.getUuid());
    assertThat(file.getModuleUuid()).isNull();
    assertThat(file.getModuleUuidPath()).isEmpty();
  }
  @Test
  public void migrate_view() throws Exception {
    db.prepareDbUnit(getClass(), "migrate_view.xml");

    migration.execute();
    db.getSession().commit();

    Component view = mapper.selectComponentByKey("view");
    assertThat(view.getUuid()).isNotNull();
    assertThat(view.getProjectUuid()).isEqualTo(view.getUuid());
    assertThat(view.getModuleUuid()).isNull();
    assertThat(view.getModuleUuidPath()).isEmpty();

    Component subView = mapper.selectComponentByKey("subView");
    assertThat(subView.getUuid()).isNotNull();
    assertThat(subView.getProjectUuid()).isEqualTo(view.getUuid());
    assertThat(subView.getModuleUuid()).isEqualTo(view.getUuid());
    assertThat(subView.getModuleUuidPath()).isEqualTo(view.getUuid());

    Component techProject = mapper.selectComponentByKey("vieworg.struts:struts");
    assertThat(techProject.getUuid()).isNotNull();
    assertThat(techProject.getProjectUuid()).isEqualTo(view.getUuid());
    assertThat(techProject.getModuleUuid()).isEqualTo(subView.getUuid());
    assertThat(techProject.getModuleUuidPath()).isEqualTo(view.getUuid() + "." + subView.getUuid());
  }
  @Test
  public void migrate_library() throws Exception {
    db.prepareDbUnit(getClass(), "migrate_library.xml");

    migration.execute();
    db.getSession().commit();

    Component root = mapper.selectComponentByKey("org.hamcrest:hamcrest-library");
    assertThat(root.getUuid()).isNotNull();
    assertThat(root.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(root.getModuleUuid()).isNull();
    assertThat(root.getModuleUuidPath()).isEmpty();
  }
  @Test
  public void migrate_components() throws Exception {
    db.prepareDbUnit(getClass(), "migrate_components.xml");

    migration.execute();
    db.getSession().commit();

    Component root = mapper.selectComponentByKey("org.struts:struts");
    assertThat(root.getUuid()).isNotNull();
    assertThat(root.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(root.getModuleUuid()).isNull();
    assertThat(root.getModuleUuidPath()).isEmpty();

    Component module = mapper.selectComponentByKey("org.struts:struts-core");
    assertThat(module.getUuid()).isNotNull();
    assertThat(module.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(module.getModuleUuid()).isEqualTo(root.getUuid());
    assertThat(module.getModuleUuidPath()).isEqualTo(root.getUuid());

    Component subModule = mapper.selectComponentByKey("org.struts:struts-db");
    assertThat(subModule.getUuid()).isNotNull();
    assertThat(subModule.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(subModule.getModuleUuid()).isEqualTo(module.getUuid());
    assertThat(subModule.getModuleUuidPath()).isEqualTo(root.getUuid() + "." + module.getUuid());

    Component directory = mapper.selectComponentByKey("org.struts:struts-core:src/org/struts");
    assertThat(directory.getUuid()).isNotNull();
    assertThat(directory.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(directory.getModuleUuid()).isEqualTo(subModule.getUuid());
    assertThat(directory.getModuleUuidPath())
        .isEqualTo(root.getUuid() + "." + module.getUuid() + "." + subModule.getUuid());

    Component file =
        mapper.selectComponentByKey("org.struts:struts-core:src/org/struts/RequestContext.java");
    assertThat(file.getUuid()).isNotNull();
    assertThat(file.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(file.getModuleUuid()).isEqualTo(subModule.getUuid());
    assertThat(file.getModuleUuidPath())
        .isEqualTo(root.getUuid() + "." + module.getUuid() + "." + subModule.getUuid());

    // Verify that each generated uuid is unique
    assertThat(
            ImmutableSet.of(
                root.getUuid(),
                module.getUuid(),
                subModule.getUuid(),
                directory.getUuid(),
                file.getUuid()))
        .hasSize(5);
  }
  @Test
  public void not_migrate_already_migrated_components() throws Exception {
    db.prepareDbUnit(getClass(), "not_migrate_already_migrated_components.xml");

    migration.execute();
    db.getSession().commit();

    Component root = mapper.selectComponentByKey("org.struts:struts");
    assertThat(root.getUuid()).isEqualTo("ABCD");
    assertThat(root.getProjectUuid()).isEqualTo("ABCD");
    assertThat(root.getModuleUuid()).isNull();
    assertThat(root.getModuleUuidPath()).isEmpty();

    Component module = mapper.selectComponentByKey("org.struts:struts-core");
    assertThat(module.getUuid()).isEqualTo("BCDE");
    assertThat(module.getProjectUuid()).isEqualTo("ABCD");
    assertThat(module.getModuleUuid()).isEqualTo("ABCD");
    assertThat(module.getModuleUuidPath()).isEqualTo("ABCD");

    Component subModule = mapper.selectComponentByKey("org.struts:struts-db");
    assertThat(subModule.getUuid()).isNotNull();
    assertThat(subModule.getProjectUuid()).isEqualTo("ABCD");
    assertThat(subModule.getModuleUuid()).isEqualTo("BCDE");
    assertThat(subModule.getModuleUuidPath()).isEqualTo("ABCD.BCDE");

    Component directory = mapper.selectComponentByKey("org.struts:struts-core:src/org/struts");
    assertThat(directory.getUuid()).isNotNull();
    assertThat(directory.getProjectUuid()).isEqualTo("ABCD");
    assertThat(directory.getModuleUuid()).isEqualTo(subModule.getUuid());
    assertThat(directory.getModuleUuidPath()).isEqualTo("ABCD.BCDE." + subModule.getUuid());

    Component file =
        mapper.selectComponentByKey("org.struts:struts-core:src/org/struts/RequestContext.java");
    assertThat(file.getUuid()).isNotNull();
    assertThat(file.getProjectUuid()).isEqualTo("ABCD");
    assertThat(file.getModuleUuid()).isEqualTo(subModule.getUuid());
    assertThat(file.getModuleUuidPath()).isEqualTo("ABCD.BCDE." + subModule.getUuid());

    Component removedFile =
        mapper.selectComponentByKey("org.struts:struts-core:src/org/struts/RequestContext2.java");
    assertThat(removedFile.getUuid()).isEqualTo("DCBA");
    assertThat(removedFile.getProjectUuid()).isEqualTo("ABCD");
    assertThat(removedFile.getModuleUuid()).isEqualTo("BCDE");
    assertThat(removedFile.getModuleUuidPath()).isEqualTo("ABCD.BCDE");
  }
  @Test
  public void migrate_developer() throws Exception {
    db.prepareDbUnit(getClass(), "migrate_developer.xml");

    migration.execute();
    db.getSession().commit();

    Component dev = mapper.selectComponentByKey("DEV:[email protected]");
    assertThat(dev.getUuid()).isNotNull();
    assertThat(dev.getProjectUuid()).isEqualTo(dev.getUuid());
    assertThat(dev.getModuleUuid()).isNull();
    assertThat(dev.getModuleUuidPath()).isEmpty();

    Component techDev = mapper.selectComponentByKey("DEV:[email protected]:org.struts:struts");
    assertThat(techDev.getUuid()).isNotNull();
    assertThat(techDev.getProjectUuid()).isEqualTo(dev.getUuid());
    assertThat(techDev.getModuleUuid()).isEqualTo(dev.getUuid());
    assertThat(techDev.getModuleUuidPath()).isEqualTo(dev.getUuid());
  }
  @Test
  public void not_fail_when_project_has_two_active_snapshots() throws Exception {
    db.prepareDbUnit(getClass(), "not_fail_when_project_has_two_active_snapshots.xml");

    migration.execute();
    db.getSession().commit();

    // Root project migrated
    Component root = mapper.selectComponentByKey("org.struts:struts");
    assertThat(root.getUuid()).isNotNull();
    assertThat(root.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(root.getModuleUuid()).isNull();
    assertThat(root.getModuleUuidPath()).isEmpty();

    // The module linked on second active snapshot should be migrated a standalone component
    Component module = mapper.selectComponentByKey("org.struts:struts-core");
    assertThat(module.getUuid()).isNotNull();
    assertThat(module.getProjectUuid()).isEqualTo(module.getUuid());
    assertThat(module.getModuleUuid()).isNull();
    assertThat(module.getModuleUuidPath()).isEmpty();
  }
  @Test
  public void not_fail_when_module_has_no_root_id() throws Exception {
    db.prepareDbUnit(getClass(), "not_fail_when_module_has_no_root_id.xml");

    migration.execute();
    db.getSession().commit();

    // Root project migrated
    Component root = mapper.selectComponentByKey("org.struts:struts");
    assertThat(root.getUuid()).isNotNull();
    assertThat(root.getProjectUuid()).isEqualTo(root.getUuid());
    assertThat(root.getModuleUuid()).isNull();
    assertThat(root.getModuleUuidPath()).isEmpty();

    // The module without uuid will be migrated as a standalone component
    Component module = mapper.selectComponentByKey("org.struts:struts-core");
    assertThat(module.getUuid()).isNotNull();
    assertThat(module.getProjectUuid()).isEqualTo(module.getUuid());
    assertThat(module.getModuleUuid()).isNull();
    assertThat(module.getModuleUuidPath()).isEmpty();
  }
  @Test
  public void migrate_disable_components() throws Exception {
    db.prepareDbUnit(getClass(), "migrate_disable_components.xml");

    migration.execute();
    db.getSession().commit();

    Component root = mapper.selectComponentByKey("org.struts:struts");
    assertThat(root.getUuid()).isNotNull();

    Component module = mapper.selectComponentByKey("org.struts:struts-core");
    assertThat(module.getUuid()).isNotNull();
    assertThat(module.getProjectUuid()).isEqualTo(root.getUuid());
    // Module and module path will always be null for removed components
    assertThat(module.getModuleUuid()).isNull();
    assertThat(module.getModuleUuidPath()).isEmpty();

    Component subModule = mapper.selectComponentByKey("org.struts:struts-db");
    assertThat(subModule.getUuid()).isNotNull();
    assertThat(subModule.getProjectUuid()).isEqualTo(root.getUuid());
    // Module and module path will always be null for removed components
    assertThat(subModule.getModuleUuid()).isNull();
    assertThat(subModule.getModuleUuidPath()).isEmpty();

    Component directory = mapper.selectComponentByKey("org.struts:struts-core:src/org/struts");
    assertThat(directory.getUuid()).isNotNull();
    assertThat(directory.getProjectUuid()).isEqualTo(root.getUuid());
    // Module and module path will always be null for removed components
    assertThat(directory.getModuleUuid()).isNull();
    assertThat(directory.getModuleUuidPath()).isEmpty();

    Component file =
        mapper.selectComponentByKey("org.struts:struts-core:src/org/struts/RequestContext.java");
    assertThat(file.getUuid()).isNotNull();
    assertThat(file.getProjectUuid()).isEqualTo(root.getUuid());
    // Module and module path will always be null for removed components
    assertThat(file.getModuleUuid()).isNull();
    assertThat(file.getModuleUuidPath()).isEmpty();
  }
 @Test
 public void migrate() throws Exception {
   db.prepareDbUnit(this.getClass(), "migrate.xml");
   migration.execute();
   db.assertDbUnit(this.getClass(), "migrate-result.xml", "file_sources");
 }
 @Test
 public void migrate_empty_db() throws Exception {
   migration.execute();
 }