import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.utils.MessageException;
import org.sonar.server.computation.batch.TreeRootHolderRule;
+import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.component.DumbComponent;
import org.sonar.server.computation.measure.Measure;
import org.sonar.server.computation.measure.MeasureRepositoryRule;
private static final String LANGUAGE_KEY_1 = "language_key1";
private static final String LANGUAGE_KEY_2 = "language_key2";
+ private static final String PROJECT_KEY = "PROJECT KEY";
+ private static final int PROJECT_REF = 1;
+ private static final int MODULE_REF = 11;
+ private static final int SUB_MODULE_REF = 111;
+
+ private static final Component MULTI_MODULE_PROJECT = DumbComponent.builder(PROJECT, PROJECT_REF).setKey(PROJECT_KEY)
+ .addChildren(
+ DumbComponent.builder(MODULE, MODULE_REF)
+ .addChildren(
+ DumbComponent.builder(MODULE, SUB_MODULE_REF).build()
+ )
+ .build()
+ ).build();
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
@Rule
public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
@Test
public void add_quality_profile_measure_on_project() throws Exception {
- DumbComponent project = DumbComponent.builder(PROJECT, 1)
- .addChildren(
- DumbComponent.builder(MODULE, 11)
- .addChildren(
- DumbComponent.builder(MODULE, 111).build()
- )
- .build()
- ).build();
-
- treeRootHolder.setRoot(project);
+ treeRootHolder.setRoot(MULTI_MODULE_PROJECT);
QualityProfile qp = createQProfile(QP_NAME_1, LANGUAGE_KEY_1);
- addMeasure(111, qp);
+ addMeasure(SUB_MODULE_REF, qp);
underTest.execute();
- assertThat(measureRepository.getAddedRawMeasures(1).get(QUALITY_PROFILES_KEY)).extracting("data").containsOnly(toJson(qp));
+ assertThat(measureRepository.getAddedRawMeasures(PROJECT_REF).get(QUALITY_PROFILES_KEY)).extracting("data").containsOnly(toJson(qp));
}
@Test
public void add_quality_profile_measure_from_multiple_modules() throws Exception {
- DumbComponent project = DumbComponent.builder(PROJECT, 1)
+ DumbComponent project = DumbComponent.builder(PROJECT, PROJECT_REF)
.addChildren(
- DumbComponent.builder(MODULE, 11)
+ DumbComponent.builder(MODULE, MODULE_REF)
.addChildren(
- DumbComponent.builder(MODULE, 111).build()
+ DumbComponent.builder(MODULE, SUB_MODULE_REF).build()
)
.build(),
DumbComponent.builder(MODULE, 12).build()
treeRootHolder.setRoot(project);
QualityProfile qp1 = createQProfile(QP_NAME_1, LANGUAGE_KEY_1);
- addMeasure(111, qp1);
+ addMeasure(SUB_MODULE_REF, qp1);
QualityProfile qp2 = createQProfile(QP_NAME_2, LANGUAGE_KEY_2);
addMeasure(12, qp2);
underTest.execute();
- assertThat(measureRepository.getAddedRawMeasures(1).get(QUALITY_PROFILES_KEY)).extracting("data").containsOnly(toJson(qp1, qp2));
+ assertThat(measureRepository.getAddedRawMeasures(PROJECT_REF).get(QUALITY_PROFILES_KEY)).extracting("data").containsOnly(toJson(qp1, qp2));
}
@Test
- public void nothing_to_add_when_no_measure() throws Exception {
- DumbComponent project = DumbComponent.builder(PROJECT, 1)
- .addChildren(
- DumbComponent.builder(MODULE, 11)
- .addChildren(
- DumbComponent.builder(MODULE, 111).build()
- )
- .build()
- ).build();
+ public void nothing_to_add_when_measure_already_exists_on_project() throws Exception {
+ DumbComponent project = DumbComponent.builder(PROJECT, PROJECT_REF).build();
treeRootHolder.setRoot(project);
+ QualityProfile qp = createQProfile(QP_NAME_1, LANGUAGE_KEY_1);
+ addMeasure(PROJECT_REF, qp);
+
underTest.execute();
- assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty();
+ assertThat(measureRepository.getAddedRawMeasures(PROJECT_REF)).isEmpty();
}
@Test
- public void nothing_to_add_when_measure_already_exists_on_project() throws Exception {
- DumbComponent project = DumbComponent.builder(PROJECT, 1).build();
+ public void fail_with_message_exception_when_no_qprofile_computed_on_project() throws Exception {
+ thrown.expect(MessageException.class);
+ thrown.expectMessage("No quality profiles has been found on project 'PROJECT KEY'");
- treeRootHolder.setRoot(project);
+ treeRootHolder.setRoot(MULTI_MODULE_PROJECT);
- QualityProfile qp = createQProfile(QP_NAME_1, LANGUAGE_KEY_1);
- addMeasure(1, qp);
+ underTest.execute();
+
+ assertThat(measureRepository.getAddedRawMeasures(PROJECT_REF)).isEmpty();
+ }
+
+ @Test
+ public void fail_with_message_exception_when_qprofiles_computed_on_project_are_empty() throws Exception {
+ thrown.expect(MessageException.class);
+ thrown.expectMessage("No quality profiles has been found on project 'PROJECT KEY', you probably don't have any language plugin suitable for this analysis.");
+
+ treeRootHolder.setRoot(MULTI_MODULE_PROJECT);
+ measureRepository.addRawMeasure(PROJECT_REF, QUALITY_PROFILES_KEY, newMeasureBuilder().create(toJson()));
underTest.execute();
- assertThat(measureRepository.getAddedRawMeasures(1)).isEmpty();
+ assertThat(measureRepository.getAddedRawMeasures(PROJECT_REF)).isEmpty();
}
private static QualityProfile createQProfile(String qpName, String languageKey) {
*/
package org.sonar.batch.repository;
-import org.sonar.batch.bootstrap.GlobalMode;
-
-import org.sonar.batch.util.BatchUtils;
-import org.sonar.batch.bootstrap.WSLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.bootstrap.ProjectReactor;
+import org.sonar.api.utils.MessageException;
import org.sonar.batch.bootstrap.AnalysisProperties;
+import org.sonar.batch.bootstrap.GlobalMode;
+import org.sonar.batch.bootstrap.WSLoader;
import org.sonar.batch.protocol.input.ProjectRepositories;
import org.sonar.batch.rule.ModuleQProfiles;
+import org.sonar.batch.util.BatchUtils;
public class DefaultProjectRepositoriesLoader implements ProjectRepositoriesLoader {
url += "&profile=" + BatchUtils.encodeForUrl(taskProperties.properties().get(ModuleQProfiles.SONAR_PROFILE_PROP));
}
url += "&preview=" + globalMode.isPreview();
- return ProjectRepositories.fromJson(wsLoader.loadString(url));
+ ProjectRepositories projectRepositories = ProjectRepositories.fromJson(wsLoader.loadString(url));
+ validateProjectRepositories(projectRepositories, reactor.getRoot().getKey());
+ return projectRepositories;
+ }
+
+ private static void validateProjectRepositories(ProjectRepositories projectRepositories, String projectKey) {
+ if (projectRepositories.qProfiles().isEmpty()) {
+ throw MessageException.of("No quality profiles has been found this project, you probably don't have any language plugin suitable for this analysis.");
+ }
}
}
*/
package org.sonar.batch.repository;
-import org.sonar.batch.bootstrap.GlobalMode;
-
-import org.sonar.batch.bootstrap.WSLoader;
import com.google.common.collect.Maps;
+import java.util.Date;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.bootstrap.ProjectReactor;
+import org.sonar.api.utils.MessageException;
import org.sonar.batch.bootstrap.AnalysisProperties;
+import org.sonar.batch.bootstrap.GlobalMode;
+import org.sonar.batch.bootstrap.WSLoader;
+import org.sonar.batch.protocol.input.ProjectRepositories;
+import org.sonar.batch.protocol.input.QProfile;
import org.sonar.batch.rule.ModuleQProfiles;
+
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
public class DefaultProjectRepositoriesLoaderTest {
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
private DefaultProjectRepositoriesLoader loader;
private WSLoader wsLoader;
private GlobalMode globalMode;
@Test
public void passPreviewParameter() {
+ addQualityProfile();
reactor = new ProjectReactor(ProjectDefinition.create().setKey("foo"));
when(globalMode.isPreview()).thenReturn(false);
loader.load(reactor, taskProperties);
@Test
public void passAndEncodeProjectKeyParameter() {
+ addQualityProfile();
reactor = new ProjectReactor(ProjectDefinition.create().setKey("foo bàr"));
loader.load(reactor, taskProperties);
verify(wsLoader).loadString("/batch/project?key=foo+b%C3%A0r&preview=false");
@Test
public void passAndEncodeProfileParameter() {
+ addQualityProfile();
reactor = new ProjectReactor(ProjectDefinition.create().setKey("foo"));
taskProperties.properties().put(ModuleQProfiles.SONAR_PROFILE_PROP, "my-profile#2");
loader.load(reactor, taskProperties);
verify(wsLoader).loadString("/batch/project?key=foo&profile=my-profile%232&preview=false");
}
+ @Test
+ public void fail_with_message_exception_when_no_quality_profile() throws Exception {
+ thrown.expect(MessageException.class);
+ thrown.expectMessage("No quality profiles has been found this project, you probably don't have any language plugin suitable for this analysis.");
+
+ reactor = new ProjectReactor(ProjectDefinition.create().setKey("foo"));
+ when(wsLoader.loadString(anyString())).thenReturn(new ProjectRepositories().toJson());
+
+ loader.load(reactor, taskProperties);
+ }
+
+ private void addQualityProfile(){
+ ProjectRepositories projectRepositories = new ProjectRepositories();
+ projectRepositories.addQProfile(new QProfile("key", "name", "language", new Date()));
+ when(wsLoader.loadString(anyString())).thenReturn(projectRepositories.toJson());
+ }
+
}