From ecaeb22cb187aa2184c15cdc6455d2865a7621ee Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Thu, 10 Sep 2015 11:32:10 +0200 Subject: [PATCH] SONAR-6610 Correctly handle views and subviews --- .../measure/custom/ws/CreateAction.java | 6 +- .../measure/custom/ws/CreateActionTest.java | 131 +++++++++++++----- 2 files changed, 101 insertions(+), 36 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CreateAction.java b/server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CreateAction.java index a55b37b381a..95fd49fcc89 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CreateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CreateAction.java @@ -20,19 +20,19 @@ package org.sonar.server.measure.custom.ws; -import org.sonar.api.resources.Qualifiers; +import org.sonar.api.resources.Scopes; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.api.utils.text.JsonWriter; +import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.MyBatis; import org.sonar.db.component.ComponentDto; import org.sonar.db.measure.custom.CustomMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.server.component.ComponentFinder; -import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.user.UserSession; import org.sonar.server.user.index.UserDoc; @@ -140,7 +140,7 @@ public class CreateAction implements CustomMeasuresWsAction { } private static void checkIsProjectOrModule(ComponentDto component) { - if (!Qualifiers.PROJECT.equals(component.qualifier()) && !Qualifiers.MODULE.equals(component.qualifier())) { + if (!Scopes.PROJECT.equals(component.scope())) { throw new BadRequestException(String.format("Component '%s' (id: %s) must be a project or a module.", component.key(), component.uuid())); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/CreateActionTest.java index 92f3b454141..7aa2f325cc2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/CreateActionTest.java @@ -36,19 +36,16 @@ import org.sonar.api.measures.Metric.ValueType; import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.core.permission.GlobalPermissions; +import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.RowNotFoundException; -import org.sonar.db.component.ComponentDao; import org.sonar.db.component.ComponentDto; -import org.sonar.db.measure.custom.CustomMeasureDao; +import org.sonar.db.component.ComponentTesting; import org.sonar.db.measure.custom.CustomMeasureDto; -import org.sonar.db.metric.MetricDao; import org.sonar.db.metric.MetricDto; import org.sonar.db.metric.MetricTesting; import org.sonar.server.component.ComponentFinder; -import org.sonar.db.component.ComponentTesting; -import org.sonar.server.db.DbClient; import org.sonar.server.es.EsTester; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; @@ -64,6 +61,12 @@ import org.sonar.test.DbTests; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.Offset.offset; +import static org.sonar.api.measures.Metric.ValueType.BOOL; +import static org.sonar.api.measures.Metric.ValueType.FLOAT; +import static org.sonar.api.measures.Metric.ValueType.INT; +import static org.sonar.api.measures.Metric.ValueType.LEVEL; +import static org.sonar.api.measures.Metric.ValueType.STRING; +import static org.sonar.api.measures.Metric.ValueType.WORK_DUR; import static org.sonar.server.util.TypeValidationsTesting.newFullTypeValidations; @Category(DbTests.class) @@ -84,9 +87,9 @@ public class CreateActionTest { @ClassRule public static EsTester es = new EsTester().addDefinitions(new UserIndexDefinition(new Settings())); - DbClient dbClient; + DbClient dbClient = db.getDbClient(); - DbSession dbSession; + DbSession dbSession = db.getSession(); WsTester ws; @@ -101,8 +104,6 @@ public class CreateActionTest { @Before public void setUp() { - dbClient = new DbClient(db.database(), db.myBatis(), new CustomMeasureDao(), new MetricDao(), new ComponentDao()); - dbSession = dbClient.openSession(false); ws = new WsTester(new CustomMeasuresWs(new CreateAction(dbClient, userSession, System2.INSTANCE, new CustomMeasureValidator(newFullTypeValidations()), new CustomMeasureJsonWriter(new UserJsonWriter(userSession)), new UserIndex(es.client()), new ComponentFinder(dbClient)))); db.truncateTables(); @@ -116,7 +117,8 @@ public class CreateActionTest { @Test public void create_boolean_custom_measure_in_db() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.BOOL, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(BOOL); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -136,7 +138,8 @@ public class CreateActionTest { @Test public void create_int_custom_measure_in_db() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.INT, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(INT); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -151,7 +154,8 @@ public class CreateActionTest { @Test public void create_text_custom_measure_in_db() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -165,7 +169,8 @@ public class CreateActionTest { @Test public void create_text_custom_measure_as_project_admin() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); userSession.login("login").addProjectUuidPermissions(UserRole.ADMIN, DEFAULT_PROJECT_UUID); newRequest() @@ -180,7 +185,8 @@ public class CreateActionTest { @Test public void create_text_custom_measure_with_metric_key() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -194,7 +200,8 @@ public class CreateActionTest { @Test public void create_text_custom_measure_with_project_key() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_KEY, DEFAULT_PROJECT_KEY) @@ -208,7 +215,8 @@ public class CreateActionTest { @Test public void create_float_custom_measure_in_db() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.FLOAT, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(FLOAT); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -223,7 +231,8 @@ public class CreateActionTest { @Test public void create_work_duration_custom_measure_in_db() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.WORK_DUR, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(WORK_DUR); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -238,7 +247,8 @@ public class CreateActionTest { @Test public void create_level_type_custom_measure_in_db() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.LEVEL, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(LEVEL); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -252,7 +262,8 @@ public class CreateActionTest { @Test public void response_with_object_and_id() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); WsTester.Result response = newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -267,6 +278,49 @@ public class CreateActionTest { assertThat(response.outputAsString()).matches(String.format(".*\"id\"\\s*:\\s*\"%d\".*", metric.getId())); } + @Test + public void create_custom_measure_on_a_view() throws Exception { + String viewUuid = "VIEW_UUID"; + dbClient.componentDao().insert(dbSession, ComponentTesting.newView(viewUuid)); + dbSession.commit(); + MetricDto metric = insertMetric(BOOL); + + newRequest() + .setParam(CreateAction.PARAM_PROJECT_ID, viewUuid) + .setParam(CreateAction.PARAM_METRIC_ID, metric.getId().toString()) + .setParam(CreateAction.PARAM_DESCRIPTION, "custom-measure-description") + .setParam(CreateAction.PARAM_VALUE, "true") + .execute(); + + List customMeasures = dbClient.customMeasureDao().selectByMetricId(dbSession, metric.getId()); + CustomMeasureDto customMeasure = customMeasures.get(0); + assertThat(customMeasures).hasSize(1); + assertThat(customMeasure.getComponentUuid()).isEqualTo(viewUuid); + } + + @Test + public void create_custom_measure_on_a_sub_view() throws Exception { + String subViewUuid = "SUB_VIEW_UUID"; + + ComponentDto view = ComponentTesting.newView(); + dbClient.componentDao().insert(dbSession, view); + dbClient.componentDao().insert(dbSession, ComponentTesting.newSubView(view, subViewUuid, "SUB_VIEW_KEY")); + dbSession.commit(); + MetricDto metric = insertMetric(BOOL); + + newRequest() + .setParam(CreateAction.PARAM_PROJECT_ID, subViewUuid) + .setParam(CreateAction.PARAM_METRIC_ID, metric.getId().toString()) + .setParam(CreateAction.PARAM_DESCRIPTION, "custom-measure-description") + .setParam(CreateAction.PARAM_VALUE, "true") + .execute(); + + List customMeasures = dbClient.customMeasureDao().selectByMetricId(dbSession, metric.getId()); + CustomMeasureDto customMeasure = customMeasures.get(0); + assertThat(customMeasures).hasSize(1); + assertThat(customMeasure.getComponentUuid()).isEqualTo(subViewUuid); + } + @Test public void fail_when_get_request() throws Exception { expectedException.expect(ServerException.class); @@ -282,7 +336,8 @@ public class CreateActionTest { public void fail_when_project_id_nor_project_key_provided() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("The component key or the component id must be provided, not both."); - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_METRIC_ID, "whatever-id") @@ -294,7 +349,8 @@ public class CreateActionTest { public void fail_when_project_id_and_project_key_are_provided() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("The component key or the component id must be provided, not both."); - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -308,7 +364,8 @@ public class CreateActionTest { public void fail_when_project_key_does_not_exist_in_db() throws Exception { expectedException.expect(NotFoundException.class); expectedException.expectMessage("Component key 'another-project-key' not found"); - insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_KEY, "another-project-key") @@ -321,7 +378,8 @@ public class CreateActionTest { public void fail_when_project_id_does_not_exist_in_db() throws Exception { expectedException.expect(NotFoundException.class); expectedException.expectMessage("Component id 'another-project-uuid' not found"); - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, "another-project-uuid") @@ -334,7 +392,8 @@ public class CreateActionTest { public void fail_when_metric_id_nor_metric_key_is_provided() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("The metric id or the metric key must be provided, not both."); - insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -346,7 +405,8 @@ public class CreateActionTest { public void fail_when_metric_id_and_metric_key_are_provided() throws Exception { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("The metric id or the metric key must be provided, not both."); - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -354,7 +414,6 @@ public class CreateActionTest { .setParam(CreateAction.PARAM_METRIC_KEY, metric.getKey()) .setParam(CreateAction.PARAM_VALUE, "whatever-value") .execute(); - } @Test @@ -374,7 +433,8 @@ public class CreateActionTest { @Test public void fail_when_measure_already_exists_on_same_project_and_same_metric() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); expectedException.expect(ServerException.class); expectedException.expectMessage(String.format("A measure already exists for project 'project-key' (id: project-uuid) and metric 'metric-key' (id: '%d')", metric.getId())); @@ -393,7 +453,8 @@ public class CreateActionTest { @Test public void fail_when_value_is_not_well_formatted() throws Exception { - MetricDto metric = insertMetricAndProject(ValueType.BOOL, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(BOOL); expectedException.expect(BadRequestException.class); @@ -408,7 +469,8 @@ public class CreateActionTest { public void fail_when_not_enough_permission() throws Exception { expectedException.expect(ForbiddenException.class); userSession.login("login"); - MetricDto metric = insertMetricAndProject(ValueType.STRING, DEFAULT_PROJECT_UUID); + insertProject(DEFAULT_PROJECT_UUID); + MetricDto metric = insertMetric(STRING); newRequest() .setParam(CreateAction.PARAM_PROJECT_ID, DEFAULT_PROJECT_UUID) @@ -419,7 +481,7 @@ public class CreateActionTest { @Test public void fail_when_not_a_project() throws Exception { - MetricDto metric = MetricTesting.newMetricDto().setEnabled(true).setValueType(ValueType.STRING.name()).setKey("metric-key"); + MetricDto metric = MetricTesting.newMetricDto().setEnabled(true).setValueType(STRING.name()).setKey("metric-key"); dbClient.metricDao().insert(dbSession, metric); ComponentDto project = ComponentTesting.newProjectDto(DEFAULT_PROJECT_UUID).setKey(DEFAULT_PROJECT_KEY); dbClient.componentDao().insert(dbSession, project); @@ -440,12 +502,15 @@ public class CreateActionTest { return ws.newPostRequest(CustomMeasuresWs.ENDPOINT, CreateAction.ACTION); } - private MetricDto insertMetricAndProject(ValueType metricType, String projectUuid) { + private MetricDto insertMetric(ValueType metricType){ MetricDto metric = MetricTesting.newMetricDto().setEnabled(true).setValueType(metricType.name()).setKey("metric-key"); dbClient.metricDao().insert(dbSession, metric); - dbClient.componentDao().insert(dbSession, ComponentTesting.newProjectDto(projectUuid).setKey(DEFAULT_PROJECT_KEY)); dbSession.commit(); - return metric; } + + private void insertProject(String projectUuid){ + dbClient.componentDao().insert(dbSession, ComponentTesting.newProjectDto(projectUuid).setKey(DEFAULT_PROJECT_KEY)); + dbSession.commit(); + } } -- 2.39.5