aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Schwarz <bartfastiel@users.noreply.github.com>2017-03-20 14:46:32 +0100
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2017-03-23 17:38:34 +0100
commit7e6f78473c7f80ffa64b4fa38ff60f8c52df14e7 (patch)
treebd4d51c1e1faeb3ce7cd2cbdb4b63f640135c9fc
parentf6b9c4743a8f02f33e79c483867b3c4581c76563 (diff)
downloadsonarqube-7e6f78473c7f80ffa64b4fa38ff60f8c52df14e7.tar.gz
sonarqube-7e6f78473c7f80ffa64b4fa38ff60f8c52df14e7.zip
SONAR-8857 make ws api/qualityprofiles/changelog organization aware
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ChangelogAction.java16
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionDatabaseTest.java161
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest.java (renamed from server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionTest.java)21
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java4
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_empty.json (renamed from server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_empty.json)0
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_full.json (renamed from server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_full.json)0
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_nominal.json (renamed from server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_nominal.json)0
7 files changed, 184 insertions, 18 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ChangelogAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ChangelogAction.java
index f6e69638bee..905deb670d7 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ChangelogAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ChangelogAction.java
@@ -33,8 +33,6 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.qualityprofile.QProfileChangeQuery;
import org.sonar.db.qualityprofile.QualityProfileDto;
-import org.sonar.server.qualityprofile.QProfileFactory;
-import org.sonar.server.qualityprofile.QProfileRef;
import static org.sonar.api.utils.DateUtils.parseEndingDateOrDateTime;
import static org.sonar.api.utils.DateUtils.parseStartingDateOrDateTime;
@@ -46,13 +44,13 @@ public class ChangelogAction implements QProfileWsAction {
static final String PARAM_TO = "to";
private final ChangelogLoader changelogLoader;
- private final QProfileFactory profileFactory;
+ private final QProfileWsSupport wsSupport;
private final Languages languages;
private DbClient dbClient;
- public ChangelogAction(ChangelogLoader changelogLoader, QProfileFactory profileFactory, Languages languages, DbClient dbClient) {
+ public ChangelogAction(ChangelogLoader changelogLoader, QProfileWsSupport wsSupport, Languages languages, DbClient dbClient) {
this.changelogLoader = changelogLoader;
- this.profileFactory = profileFactory;
+ this.wsSupport = wsSupport;
this.languages = languages;
this.dbClient = dbClient;
}
@@ -66,7 +64,10 @@ public class ChangelogAction implements QProfileWsAction {
.setHandler(this)
.setResponseExample(getClass().getResource("example-changelog.json"));
- QProfileRef.defineParams(wsAction, languages);
+ QProfileWsSupport.createOrganizationParam(wsAction)
+ .setSince("6.4");
+
+ QProfileReference.defineParams(wsAction, languages);
wsAction.addPagingParams(50, MAX_LIMIT);
@@ -81,8 +82,9 @@ public class ChangelogAction implements QProfileWsAction {
@Override
public void handle(Request request, Response response) throws Exception {
+ QProfileReference reference = QProfileReference.from(request);
try (DbSession dbSession = dbClient.openSession(false)) {
- QualityProfileDto profile = profileFactory.find(dbSession, QProfileRef.from(request));
+ QualityProfileDto profile = wsSupport.getProfile(dbSession, reference);
QProfileChangeQuery query = new QProfileChangeQuery(profile.getKey());
Date since = parseStartingDateOrDateTime(request.param(PARAM_SINCE));
diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionDatabaseTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionDatabaseTest.java
new file mode 100644
index 00000000000..49b9cd69f42
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionDatabaseTest.java
@@ -0,0 +1,161 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.qualityprofile.ws;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.resources.Languages;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbSession;
+import org.sonar.db.DbTester;
+import org.sonar.db.organization.OrganizationDto;
+import org.sonar.db.qualityprofile.QProfileChangeDto;
+import org.sonar.db.qualityprofile.QualityProfileDto;
+import org.sonar.db.qualityprofile.QualityProfileTesting;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.organization.DefaultOrganizationProvider;
+import org.sonar.server.organization.TestDefaultOrganizationProvider;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.ws.TestRequest;
+import org.sonar.server.ws.WsActionTester;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ChangelogActionDatabaseTest {
+
+ @Rule
+ public DbTester dbTester = DbTester.create(System2.INSTANCE);
+ @Rule
+ public UserSessionRule userSession = UserSessionRule.standalone();
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ private WsActionTester wsTester;
+ private ChangelogLoader changelogLoader;
+ private QProfileWsSupport wsSupport;
+ private OrganizationDto organization;
+ private DefaultOrganizationProvider defaultOrganizationProvider;
+
+ @Before
+ public void before() {
+ defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
+ wsSupport = new QProfileWsSupport(dbTester.getDbClient(), userSession, defaultOrganizationProvider);
+ changelogLoader = new ChangelogLoader(dbTester.getDbClient());
+ wsTester = new WsActionTester(
+ new ChangelogAction(changelogLoader, wsSupport, new Languages(), dbTester.getDbClient()));
+ organization = dbTester.organizations().insert();
+ }
+
+ @Test
+ public void find_changelog_by_profileKey() throws Exception {
+ QualityProfileDto qualityProfile = dbTester.qualityProfiles().insert(organization);
+
+ String response = wsTester.newRequest()
+ .setMethod("GET")
+ .setParam("profileKey", qualityProfile.getKey())
+ .execute()
+ .getInput();
+
+ assertThat(response).isNotEmpty();
+ }
+
+ @Test
+ public void find_changelog_by_language_and_name() throws Exception {
+ QualityProfileDto qualityProfile = dbTester.qualityProfiles().insert(dbTester.getDefaultOrganization());
+
+ String response = wsTester.newRequest()
+ .setMethod("GET")
+ .setParam("language", qualityProfile.getLanguage())
+ .setParam("profileName", qualityProfile.getName())
+ .execute()
+ .getInput();
+
+ assertThat(response).isNotEmpty();
+ }
+
+ @Test
+ public void find_changelog_by_organization_and_language_and_name() throws Exception {
+ QualityProfileDto qualityProfile = dbTester.qualityProfiles().insert(organization);
+
+ String response = wsTester.newRequest()
+ .setMethod("GET")
+ .setParam("language", qualityProfile.getLanguage())
+ .setParam("profileName", qualityProfile.getName())
+ .setParam("organization", organization.getKey())
+ .execute()
+ .getInput();
+
+ assertThat(response).isNotEmpty();
+ }
+
+ @Test
+ public void do_not_find_changelog_by_wrong_organization_and_language_and_name() throws Exception {
+ OrganizationDto organization1 = dbTester.organizations().insert();
+ OrganizationDto organization2 = dbTester.organizations().insert();
+
+ QualityProfileDto qualityProfile = dbTester.qualityProfiles().insert(organization1);
+
+ TestRequest request = wsTester.newRequest()
+ .setMethod("GET")
+ .setParam("language", qualityProfile.getLanguage())
+ .setParam("profileName", qualityProfile.getName())
+ .setParam("organization", organization2.getKey());
+
+ thrown.expect(NotFoundException.class);
+
+ request.execute();
+ }
+
+ @Test
+ public void changelog_empty() throws Exception {
+ QualityProfileDto qualityProfile = dbTester.qualityProfiles().insert(organization);
+
+ String response = wsTester.newRequest()
+ .setMethod("GET")
+ .setParam("profileKey", qualityProfile.getKey())
+ .execute()
+ .getInput();
+
+ assertThat(response).contains("\"total\":0");
+ assertThat(response).contains("\"events\":[]");
+ }
+
+ @Test
+ public void changelog_not_empty() throws Exception {
+ QualityProfileDto qualityProfile = dbTester.qualityProfiles().insert(organization);
+ QProfileChangeDto change = QualityProfileTesting.newQProfileChangeDto()
+ .setKey(null)
+ .setCreatedAt(0)
+ .setProfileKey(qualityProfile.getKey());
+ DbSession session = dbTester.getSession();
+ dbTester.getDbClient().qProfileChangeDao().insert(session, change);
+ session.commit();
+
+ String response = wsTester.newRequest()
+ .setMethod("GET")
+ .setParam("profileKey", qualityProfile.getKey())
+ .execute()
+ .getInput();
+
+ assertThat(response).contains("\"total\":1");
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest.java
index 9acd6089963..e8c1bebf732 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest.java
@@ -29,11 +29,10 @@ import org.sonar.api.resources.Languages;
import org.sonar.api.utils.System2;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
+import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualityprofile.QProfileChangeQuery;
import org.sonar.db.rule.RuleTesting;
import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.qualityprofile.QProfileFactory;
-import org.sonar.server.qualityprofile.QProfileRef;
import org.sonar.server.qualityprofile.QProfileTesting;
import org.sonar.server.ws.WsTester;
@@ -50,7 +49,7 @@ import static org.sonar.server.qualityprofile.QProfileTesting.XOO_P1_KEY;
import static org.sonar.server.qualityprofile.ws.ChangelogAction.PARAM_SINCE;
import static org.sonar.server.qualityprofile.ws.ChangelogAction.PARAM_TO;
-public class ChangelogActionTest {
+public class ChangelogActionMockTest {
private static final long A_DATE = 1_500_000_000_000L;
@@ -59,17 +58,19 @@ public class ChangelogActionTest {
private WsTester wsTester;
private ChangelogLoader changelogLoader = mock(ChangelogLoader.class);
- private QProfileFactory profileFactory = mock(QProfileFactory.class);
+ private QProfileWsSupport wsSupport = mock(QProfileWsSupport.class);
+ private OrganizationDto organization;
@Before
public void before() {
wsTester = new WsTester(new QProfilesWs(mock(RuleActivationActions.class), mock(BulkRuleActivationActions.class),
- new ChangelogAction(changelogLoader, profileFactory, new Languages(), dbTester.getDbClient())));
+ new ChangelogAction(changelogLoader, wsSupport, new Languages(), dbTester.getDbClient())));
+ organization = dbTester.organizations().insert();
}
@Test
public void changelog_empty() throws Exception {
- when(profileFactory.find(any(DbSession.class), eq(QProfileRef.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1("org-123"));
+ when(wsSupport.getProfile(any(DbSession.class), eq(QProfileReference.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1(organization));
when(changelogLoader.load(any(DbSession.class), any(QProfileChangeQuery.class))).thenReturn(new ChangelogLoader.Changelog(0, Collections.emptyList()));
wsTester.newGetRequest(QProfilesWs.API_ENDPOINT, "changelog").setParam(PARAM_PROFILE_KEY, XOO_P1_KEY)
@@ -78,7 +79,7 @@ public class ChangelogActionTest {
@Test
public void changelog_nominal() throws Exception {
- when(profileFactory.find(any(DbSession.class), eq(QProfileRef.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1("org-123"));
+ when(wsSupport.getProfile(any(DbSession.class), eq(QProfileReference.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1(organization));
ChangelogLoader.Change change1 = new ChangelogLoader.Change("C1", "ACTIVATED", A_DATE, null, null, null, null, null, null);
ChangelogLoader.Change change2 = new ChangelogLoader.Change("C2", "ACTIVATED", A_DATE + 10, null, null, null, null, null, null);
List<ChangelogLoader.Change> changes = asList(change1, change2);
@@ -90,7 +91,7 @@ public class ChangelogActionTest {
@Test
public void changelog_with_all_fields() throws Exception {
- when(profileFactory.find(any(DbSession.class), eq(QProfileRef.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1("org-123"));
+ when(wsSupport.getProfile(any(DbSession.class), eq(QProfileReference.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1(organization));
ChangelogLoader.Change change1 = new ChangelogLoader.Change("C1", "ACTIVATED", A_DATE, "MAJOR", "marcel", "Marcel", "INHERITED", RuleTesting.XOO_X1, "X One");
change1.getParams().put("foo", "foo_value");
change1.getParams().put("bar", "bar_value");
@@ -103,7 +104,7 @@ public class ChangelogActionTest {
@Test
public void changelog_inclusive_for_dates() throws Exception {
- when(profileFactory.find(any(DbSession.class), eq(QProfileRef.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1("org-123"));
+ when(wsSupport.getProfile(any(DbSession.class), eq(QProfileReference.fromKey(XOO_P1_KEY)))).thenReturn(QProfileTesting.newXooP1(organization));
when(changelogLoader.load(any(DbSession.class), any(QProfileChangeQuery.class))).thenReturn(new ChangelogLoader.Changelog(0, Collections.emptyList()));
wsTester.newGetRequest(QProfilesWs.API_ENDPOINT, "changelog")
@@ -120,7 +121,7 @@ public class ChangelogActionTest {
@Test(expected = NotFoundException.class)
public void fail_on_unknown_profile() throws Exception {
- when(profileFactory.find(any(DbSession.class), eq(QProfileRef.fromKey(XOO_P1_KEY)))).thenThrow(new NotFoundException("Profile not found"));
+ when(wsSupport.getProfile(any(DbSession.class), eq(QProfileReference.fromKey(XOO_P1_KEY)))).thenThrow(new NotFoundException("Profile not found"));
wsTester.newGetRequest(QProfilesWs.API_ENDPOINT, "changelog").setParam(PARAM_PROFILE_KEY, XOO_P1_KEY).execute();
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java
index defbe820c1a..abd14310eb2 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java
@@ -68,7 +68,7 @@ public class QProfilesWsTest {
new SearchAction(null, languages, null, dbClient),
new SetDefaultAction(languages, null, null, wsSupport),
new ProjectsAction(null, userSessionRule),
- new ChangelogAction(null, mock(QProfileFactory.class), languages, dbClient),
+ new ChangelogAction(null, wsSupport, languages, dbClient),
new ChangeParentAction(dbClient, null, null, languages, wsSupport),
new CompareAction(null, null, languages),
new DeleteAction(languages, null, null, userSessionRule, wsSupport),
@@ -191,6 +191,8 @@ public class QProfilesWsTest {
assertThat(changelog.isPost()).isFalse();
assertThat(changelog.params().size()).isPositive();
assertThat(changelog.responseExampleAsString()).isNotEmpty();
+ assertThat(changelog.param("organization").since()).isEqualTo("6.4");
+ assertThat(changelog.param("organization").isInternal()).isTrue();
}
@Test
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_empty.json b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_empty.json
index 22d12b01f52..22d12b01f52 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_empty.json
+++ b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_empty.json
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_full.json b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_full.json
index 1fa4b2af245..1fa4b2af245 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_full.json
+++ b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_full.json
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_nominal.json b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_nominal.json
index 0ad79039d5e..0ad79039d5e 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_nominal.json
+++ b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_nominal.json