Package org.sonar.server.computation.db

Source Code of org.sonar.server.computation.db.AnalysisReportDaoTest

/*
* SonarQube, open source software quality management tool.
* Copyright (C) 2008-2014 SonarSource
* mailto:contact AT sonarsource DOT com
*
* SonarQube is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* SonarQube is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

package org.sonar.server.computation.db;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
import org.sonar.core.computation.db.AnalysisReportDto;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.core.persistence.TestDatabase;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
import static org.sonar.core.computation.db.AnalysisReportDto.Status.WORKING;

public class AnalysisReportDaoTest {
  private static final String DEFAULT_PROJECT_KEY = "123456789-987654321";
  private static final String DEFAULT_PROJECT_NAME = "default project name";
  private static final long DEFAULT_SNAPSHOT_ID = 123L;

  @Rule
  public TestDatabase db = new TestDatabase();
  private AnalysisReportDao sut;
  private DbSession session;
  private System2 system2;

  @Before
  public void before() {
    this.session = db.myBatis().openSession(false);
    this.system2 = mock(System2.class);
    this.sut = new AnalysisReportDao(system2);

    when(system2.now()).thenReturn(DateUtils.parseDate("2014-09-26").getTime());
  }

  @After
  public void after() {
    MyBatis.closeQuietly(session);
  }

  @Test
  public void insert_multiple_reports() {
    db.prepareDbUnit(getClass(), "empty.xml");

    AnalysisReportDto report = new AnalysisReportDto()
      .setProjectKey(DEFAULT_PROJECT_KEY)
      .setSnapshotId(DEFAULT_SNAPSHOT_ID)
      .setData("data-project")
      .setStatus(PENDING)
      .setStartedAt(DateUtils.parseDate("2014-09-25"))
      .setFinishedAt(DateUtils.parseDate("2014-09-27"))
      .setCreatedAt(DateUtils.parseDate("2014-09-24"))
      .setUpdatedAt(DateUtils.parseDate("2014-09-25"));

    sut.insert(session, report);
    sut.insert(session, report);
    session.commit();

    db.assertDbUnit(getClass(), "insert-result.xml", "analysis_reports");
  }

  @Test
  public void update_all_to_status() {
    db.prepareDbUnit(getClass(), "update-all-to-status-pending.xml");

    sut.cleanWithUpdateAllToPendingStatus(session);
    session.commit();

    db.assertDbUnit(getClass(), "update-all-to-status-pending-result.xml", "analysis_reports");
  }

  @Test
  public void truncate() {
    db.prepareDbUnit(getClass(), "any-analysis-reports.xml");

    sut.cleanWithTruncate(session);
    session.commit();

    db.assertDbUnit(getClass(), "truncate-result.xml", "analysis_reports");
  }

  @Test
  public void find_one_report_by_project_key() {
    db.prepareDbUnit(getClass(), "select.xml");

    final String projectKey = "123456789-987654321";
    List<AnalysisReportDto> reports = sut.findByProjectKey(session, projectKey);
    AnalysisReportDto report = reports.get(0);

    assertThat(reports).hasSize(1);
    assertThat(report.getProjectKey()).isEqualTo(projectKey);
    assertThat(report.getId()).isEqualTo(1);
  }

  @Test
  public void find_several_reports_by_project_key() {
    db.prepareDbUnit(getClass(), "select.xml");

    final String projectKey = "987654321-123456789";
    List<AnalysisReportDto> reports = sut.findByProjectKey(session, projectKey);

    assertThat(reports).hasSize(2);
  }

  @Test
  public void get_oldest_available_report() {
    db.prepareDbUnit(getClass(), "select_oldest_available_report.xml");

    final String projectKey = "123456789-987654321";
    AnalysisReportDto nextAvailableReport = sut.getNextAvailableReport(session);

    assertThat(nextAvailableReport.getId()).isEqualTo(2);
    assertThat(nextAvailableReport.getProjectKey()).isEqualTo(projectKey);
  }

  @Test
  public void get_oldest_available_report_with_working_reports_older() {
    db.prepareDbUnit(getClass(), "select_oldest_available_report_with_working_reports_older.xml");

    final String projectKey = "123456789-987654321";
    AnalysisReportDto nextAvailableReport = sut.getNextAvailableReport(session);

    assertThat(nextAvailableReport.getId()).isEqualTo(2);
    assertThat(nextAvailableReport.getProjectKey()).isEqualTo(projectKey);
  }

  @Test
  public void null_when_no_available_pending_report_because_working_report_on_the_same_project() {
    db.prepareDbUnit(getClass(), "select-with-no-available-report.xml");

    AnalysisReportDto nextAvailableReport = sut.getNextAvailableReport(session);

    assertThat(nextAvailableReport).isNull();
  }

  @Test
  public void getById_maps_all_the_fields_except_the_data() {
    db.prepareDbUnit(getClass(), "one_analysis_report.xml");

    AnalysisReportDto report = sut.getById(session, 1L);

    assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY);
    assertThat(report.getCreatedAt()).isEqualTo(DateUtils.parseDate("2014-09-24"));
    assertThat(report.getUpdatedAt()).isEqualTo(DateUtils.parseDate("2014-09-25"));
    assertThat(report.getStartedAt()).isEqualTo(DateUtils.parseDate("2014-09-26"));
    assertThat(report.getFinishedAt()).isEqualTo(DateUtils.parseDate("2014-09-27"));
    assertThat(report.getStatus()).isEqualTo(WORKING);
    assertThat(report.getData()).isNull();
    assertThat(report.getKey()).isEqualTo("1");
  }

  @Test
  public void getById_returns_null_when_id_not_found() {
    db.prepareDbUnit(getClass(), "select.xml");

    AnalysisReportDto report = sut.getById(session, 4L);

    assertThat(report).isNull();
  }

  @Test(expected = NullPointerException.class)
  public void nullPointerExc_when_trying_to_book_a_report_without_id() {
    sut.bookAnalysisReport(session, new AnalysisReportDto());
  }

  @Test
  public void cannot_book_an_already_working_report_analysis() {
    db.prepareDbUnit(getClass(), "one_busy_report_analysis.xml");

    AnalysisReportDto report = newDefaultReport();
    AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);

    assertThat(reportBooked).isNull();
  }

  @Test
  public void book_one_available_report_analysis() {
    Date mockedNow = DateUtils.parseDate("2014-09-30");
    when(system2.now()).thenReturn(mockedNow.getTime());
    db.prepareDbUnit(getClass(), "one_available_analysis.xml");

    AnalysisReportDto report = newDefaultReport();
    AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);

    assertThat(reportBooked.getId()).isEqualTo(1L);
    assertThat(reportBooked.getStatus()).isEqualTo(WORKING);
    assertThat(reportBooked.getStartedAt()).isEqualTo(mockedNow);
  }

  @Test
  public void can_book_report_while_another_one_working_on_the_same_project() {
    db.prepareDbUnit(getClass(), "one_available_analysis_but_another_busy_on_same_project.xml");

    AnalysisReportDto report = newDefaultReport();
    AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);

    assertThat(reportBooked).isNotNull();
  }

  @Test
  public void book_available_report_analysis_while_having_one_working_on_another_project() {
    db.prepareDbUnit(getClass(), "book_available_report_analysis_while_having_one_working_on_another_project.xml");

    AnalysisReportDto report = newDefaultReport();
    AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);

    assertThat(reportBooked.getId()).isEqualTo(1L);
  }

  @Test
  public void delete_one_analysis_report() {
    db.prepareDbUnit(getClass(), "one_analysis_report.xml");

    sut.delete(session, newDefaultReport());
    session.commit();

    db.assertDbUnit(getClass(), "truncate-result.xml", "analysis_reports");
  }

  @Test
  public void findAll_one_analysis_report() {
    db.prepareDbUnit(getClass(), "one_analysis_report.xml");

    List<AnalysisReportDto> reports = sut.findAll(session);

    assertThat(reports).hasSize(1);
  }

  @Test
  public void findAll_empty_table() {
    db.prepareDbUnit(getClass(), "empty.xml");

    List<AnalysisReportDto> reports = sut.findAll(session);

    assertThat(reports).isEmpty();
  }

  @Test
  public void findAll_three_analysis_reports() {
    db.prepareDbUnit(getClass(), "three_analysis_reports.xml");

    List<AnalysisReportDto> reports = sut.findAll(session);

    assertThat(reports).hasSize(3);
  }

  @Test(expected = UnsupportedOperationException.class)
  public void doGetNullableByKey_is_not_implemented_yet() {
    sut.doGetNullableByKey(session, "ANY_STRING");
  }

  @Test(expected = UnsupportedOperationException.class)
  public void getSynchronizationParams_is_not_implemented_yet() {
    sut.getSynchronizationParams(new Date(), new HashMap<String, String>());
  }

  @Test(expected = UnsupportedOperationException.class)
  public void doUpdate_is_not_implemented_yet() {
    sut.doUpdate(session, new AnalysisReportDto());
  }

  private AnalysisReportDto newDefaultReport() {
    AnalysisReportDto report = AnalysisReportDto.newForTests(1L)
      .setStatus(PENDING)
      .setProjectKey(DEFAULT_PROJECT_KEY)
      .setCreatedAt(DateUtils.parseDate("2014-09-30"))
      .setFinishedAt(DateUtils.parseDate("2014-09-30"))
      .setStartedAt(DateUtils.parseDate("2014-09-30"))
      .setUpdatedAt(DateUtils.parseDate("2014-09-30"));

    return report;
  }
}
TOP

Related Classes of org.sonar.server.computation.db.AnalysisReportDaoTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.