From 7e6f78473c7f80ffa64b4fa38ff60f8c52df14e7 Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Mon, 20 Mar 2017 14:46:32 +0100 Subject: [PATCH] SONAR-8857 make ws api/qualityprofiles/changelog organization aware --- .../qualityprofile/ws/ChangelogAction.java | 16 +- .../ws/ChangelogActionDatabaseTest.java | 161 ++++++++++++++++++ ...Test.java => ChangelogActionMockTest.java} | 21 +-- .../qualityprofile/ws/QProfilesWsTest.java | 4 +- .../changelog_empty.json | 0 .../changelog_full.json | 0 .../changelog_nominal.json | 0 7 files changed, 184 insertions(+), 18 deletions(-) create mode 100644 server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionDatabaseTest.java rename server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/{ChangelogActionTest.java => ChangelogActionMockTest.java} (83%) rename server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/{ChangelogActionTest => ChangelogActionMockTest}/changelog_empty.json (100%) rename server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/{ChangelogActionTest => ChangelogActionMockTest}/changelog_full.json (100%) rename server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/{ChangelogActionTest => ChangelogActionMockTest}/changelog_nominal.json (100%) 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 similarity index 83% rename from server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangelogActionTest.java rename to 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 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 similarity index 100% rename from server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_empty.json rename to 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 similarity index 100% rename from server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_full.json rename to 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 similarity index 100% rename from server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionTest/changelog_nominal.json rename to server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/ChangelogActionMockTest/changelog_nominal.json -- 2.39.5