/*
* Copyright 2013 - 2014 Felix Müller
*
* This file is part of CodeQ Invest.
*
* CodeQ Invest is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CodeQ Invest 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CodeQ Invest. If not, see <http://www.gnu.org/licenses/>.
*/
package org.codeqinvest.quality.analysis;
import org.codeqinvest.codechanges.CodeChangeProbabilityCalculator;
import org.codeqinvest.codechanges.scm.CodeChurnCalculationException;
import org.codeqinvest.codechanges.scm.ScmAvailabilityCheckerService;
import org.codeqinvest.codechanges.scm.ScmConnectionEncodingException;
import org.codeqinvest.codechanges.scm.ScmConnectionSettings;
import org.codeqinvest.codechanges.scm.factory.CodeChurnCalculatorFactory;
import org.codeqinvest.codechanges.scm.factory.ScmAvailabilityCheckerServiceFactory;
import org.codeqinvest.quality.Artefact;
import org.codeqinvest.quality.CodeChangeSettings;
import org.codeqinvest.quality.Project;
import org.codeqinvest.quality.QualityCriteria;
import org.codeqinvest.quality.QualityProfile;
import org.codeqinvest.quality.QualityRequirement;
import org.codeqinvest.sonar.ResourceNotFoundException;
import org.codeqinvest.sonar.SonarConnectionSettings;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Arrays;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:META-INF/spring/module-context.xml", "classpath:inmemory-db-context.xml"})
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class DefaultQualityAnalyzerServiceIntegrationTest {
private QualityProfile profile;
private QualityRequirement firstRequirement;
private QualityRequirement secondRequirement;
private Project project;
private ScmAvailabilityCheckerServiceFactory scmAvailabilityCheckerServiceFactory;
private QualityViolationCostsCalculator costsCalculator;
@PersistenceContext
private EntityManager entityManager;
@Autowired
private QualityAnalysisRepository qualityAnalysisRepository;
@Before
public void setUp() {
profile = new QualityProfile("quality-profile");
firstRequirement = new QualityRequirement(profile, 100, 200, 10, "nloc", new QualityCriteria("cc", ">", 10));
secondRequirement = new QualityRequirement(profile, 80, 300, 10, "nloc", new QualityCriteria("ec", "<", 15));
profile.addRequirement(firstRequirement);
profile.addRequirement(secondRequirement);
SonarConnectionSettings sonarConnectionSettings = new SonarConnectionSettings("http://localhost", "myProject::123");
ScmConnectionSettings scmConnectionSettings = new ScmConnectionSettings("http://svn.localhost");
project = new Project("myProject", "0 0 * * *", profile, sonarConnectionSettings, scmConnectionSettings, CodeChangeSettings.defaultSetting(1));
// set up scm system that is available
ScmAvailabilityCheckerService availableScmSystem = mock(ScmAvailabilityCheckerService.class);
when(availableScmSystem.isAvailable(any(ScmConnectionSettings.class))).thenReturn(true);
scmAvailabilityCheckerServiceFactory = mock(ScmAvailabilityCheckerServiceFactory.class);
when(scmAvailabilityCheckerServiceFactory.create(any(ScmConnectionSettings.class))).thenReturn(availableScmSystem);
costsCalculator = mock(QualityViolationCostsCalculator.class);
entityManager.persist(profile);
entityManager.persist(project);
}
@Test
public void qualityAnalysisShouldBePersistedToDatabase() throws CodeChurnCalculationException, ScmConnectionEncodingException, ResourceNotFoundException {
Artefact artefactA = new Artefact("A", "A");
Artefact artefactB = new Artefact("B", "B");
Artefact artefactC = new Artefact("C", "C");
ViolationsCalculatorService violationsCalculatorService = mock(ViolationsCalculatorService.class);
when(violationsCalculatorService.calculateAllViolation(any(Project.class)))
.thenReturn(ViolationsAnalysisResult.createSuccessfulAnalysis(Arrays.asList(
new ViolationOccurence(firstRequirement, artefactA, 0),
new ViolationOccurence(secondRequirement, artefactA, 0),
new ViolationOccurence(firstRequirement, artefactB, 0),
new ViolationOccurence(firstRequirement, artefactC, 0),
new ViolationOccurence(secondRequirement, artefactC, 0))));
CodeChangeProbabilityCalculator codeChangeProbabilityCalculator = mock(CodeChangeProbabilityCalculator.class);
when(codeChangeProbabilityCalculator.calculateCodeChangeProbability(any(ScmConnectionSettings.class), anyString())).thenReturn(1.0);
CodeChangeProbabilityCalculatorFactory codeChangeProbabilityCalculatorFactory = mock(CodeChangeProbabilityCalculatorFactory.class);
when(codeChangeProbabilityCalculatorFactory.getCodeChurnCalculatorFactory()).thenReturn(mock(CodeChurnCalculatorFactory.class));
when(codeChangeProbabilityCalculatorFactory.create(any(CodeChangeSettings.class))).thenReturn(codeChangeProbabilityCalculator);
SecureChangeProbabilityCalculator secureChangeProbabilityCalculator = mock(SecureChangeProbabilityCalculator.class);
when(secureChangeProbabilityCalculator.calculateSecureChangeProbability(any(QualityProfile.class),
any(SonarConnectionSettings.class), any(Artefact.class))).thenReturn(1.0);
QualityAnalyzerService qualityAnalyzerService = new DefaultQualityAnalyzerService(violationsCalculatorService, scmAvailabilityCheckerServiceFactory,
codeChangeProbabilityCalculatorFactory, secureChangeProbabilityCalculator, costsCalculator, qualityAnalysisRepository);
QualityAnalysis analysis = qualityAnalyzerService.analyzeProject(project);
QualityAnalysis analysisFromDb = qualityAnalysisRepository.findOne(analysis.getId());
assertThat(analysisFromDb).isEqualTo(analysis);
assertThat(analysisFromDb.getViolations().toString()).isEqualTo(analysis.getViolations().toString());
}
}