diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2018-07-06 15:00:33 +0200 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2018-07-11 20:21:22 +0200 |
commit | d34f9f46391d73cb89e9b7ead8e828dc65362829 (patch) | |
tree | 5a3ac767eed34bcb2889968dd5731fe89fbc553d | |
parent | 364fc3b7439e8241ed4094837f9dd835375d09cc (diff) | |
download | sonarqube-d34f9f46391d73cb89e9b7ead8e828dc65362829.tar.gz sonarqube-d34f9f46391d73cb89e9b7ead8e828dc65362829.zip |
SONAR-10944 Move subscription flag from api/organizations/search to api/navigation/organization
8 files changed, 90 insertions, 104 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/OrganizationsWsSupport.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/OrganizationsWsSupport.java index e859a354cca..69aaa1723c4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/OrganizationsWsSupport.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/OrganizationsWsSupport.java @@ -115,8 +115,7 @@ public class OrganizationsWsSupport { builder .setName(dto.getName()) .setKey(dto.getKey()) - .setGuarded(dto.isGuarded()) - .setSubscription(dto.getSubscription().name()); + .setGuarded(dto.isGuarded()); setNullable(dto.getDescription(), builder::setDescription); setNullable(dto.getUrl(), builder::setUrl); setNullable(dto.getAvatarUrl(), builder::setAvatar); diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java index ca03a893042..574b0a9585e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java @@ -97,11 +97,12 @@ public class OrganizationAction implements NavigationWsAction { private void writeOrganization(JsonWriter json, OrganizationDto organization, boolean newProjectPrivate) { json.name("organization") .beginObject() + .prop("isDefault", organization.getKey().equals(defaultOrganizationProvider.get().getKey())) + .prop("projectVisibility", Visibility.getLabel(newProjectPrivate)) + .prop("subscription", organization.getSubscription().name()) .prop("canAdmin", userSession.hasPermission(ADMINISTER, organization)) .prop("canProvisionProjects", userSession.hasPermission(PROVISION_PROJECTS, organization)) .prop("canDelete", organization.isGuarded() ? userSession.isSystemAdministrator() : userSession.hasPermission(ADMINISTER, organization)) - .prop("isDefault", organization.getKey().equals(defaultOrganizationProvider.get().getKey())) - .prop("projectVisibility", Visibility.getLabel(newProjectPrivate)) .prop("canUpdateProjectsVisibilityToPrivate", userSession.hasPermission(ADMINISTER, organization) && billingValidations.canUpdateProjectVisibilityToPrivate(new BillingValidations.Organization(organization.getKey(), organization.getUuid()))); diff --git a/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/create-example.json b/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/create-example.json index e21074c7b12..3acbecf4148 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/create-example.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/create-example.json @@ -5,7 +5,6 @@ "description": "The Foo company produces quality software for Bar.", "url": "https://www.foo.com", "avatar": "https://www.foo.com/foo.png", - "guarded": false, - "subscription": "FREE" + "guarded": false } } diff --git a/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/search-example.json b/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/search-example.json index 39b1221a5e8..481ae34e9ef 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/search-example.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/organization/ws/search-example.json @@ -9,8 +9,7 @@ "key": "foo-company", "name": "Foo Company", "guarded": true, - "isAdmin": false, - "subscription": "FREE" + "isAdmin": false }, { "key": "bar-company", @@ -19,8 +18,7 @@ "url": "https://www.bar.com", "avatar": "https://www.bar.com/logo.png", "guarded": false, - "isAdmin": true, - "subscription": "PAID" + "isAdmin": true } ] } diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java index d3bd7018985..8ce1370500e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java @@ -126,7 +126,6 @@ public class CreateActionTest { assertThat(response.getOrganization().getDescription()).isEqualTo("My org desc"); assertThat(response.getOrganization().getUrl()).isEqualTo("my url"); assertThat(response.getOrganization().getAvatar()).isEqualTo("my avatar"); - assertThat(response.getOrganization().getSubscription()).isEqualTo(OrganizationDto.Subscription.FREE.name()); OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); assertThat(organization.getName()).isEqualTo("orgFoo"); assertThat(organization.getDescription()).isEqualTo("My org desc"); @@ -210,7 +209,8 @@ public class CreateActionTest { assertThat(dbClient.permissionTemplateDao().selectGroupPermissionsByTemplateId(dbSession, defaultTemplate.getId())) .extracting(PermissionTemplateGroupDto::getGroupId, PermissionTemplateGroupDto::getPermission) .containsOnly( - tuple(ownersGroup.getId(), UserRole.ADMIN), tuple(ownersGroup.getId(), UserRole.ISSUE_ADMIN), tuple(ownersGroup.getId(), UserRole.SECURITYHOTSPOT_ADMIN), tuple(ownersGroup.getId(), GlobalPermissions.SCAN_EXECUTION), + tuple(ownersGroup.getId(), UserRole.ADMIN), tuple(ownersGroup.getId(), UserRole.ISSUE_ADMIN), tuple(ownersGroup.getId(), UserRole.SECURITYHOTSPOT_ADMIN), + tuple(ownersGroup.getId(), GlobalPermissions.SCAN_EXECUTION), tuple(defaultGroup.getId(), UserRole.USER), tuple(defaultGroup.getId(), UserRole.CODEVIEWER)); } @@ -227,7 +227,8 @@ public class CreateActionTest { assertThat(es.client().prepareSearch(UserIndexDefinition.INDEX_TYPE_USER) .setQuery(boolQuery() .must(termQuery(FIELD_ORGANIZATION_UUIDS, organization.getUuid())) - .must(termQuery(FIELD_UUID, user.getUuid()))).get().getHits().getHits()).hasSize(1); + .must(termQuery(FIELD_UUID, user.getUuid()))) + .get().getHits().getHits()).hasSize(1); } @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java index 58a32e01792..1f3db59c0d8 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java @@ -51,7 +51,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.db.organization.OrganizationDto.Subscription.FREE; import static org.sonar.db.organization.OrganizationDto.Subscription.PAID; -import static org.sonar.db.organization.OrganizationDto.Subscription.SONARQUBE; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; import static org.sonar.server.organization.ws.SearchAction.PARAM_MEMBER; import static org.sonar.test.JsonAssert.assertJson; @@ -93,31 +92,6 @@ public class SearchActionTest { } @Test - public void return_sonarcloud_subscription() { - OrganizationDto paidOrganization = db.organizations().insert(o -> o.setSubscription(PAID)); - OrganizationDto freeOrganization = db.organizations().insert(o -> o.setSubscription(FREE)); - // Organization without subscription should be considered as free - OrganizationDto organizationWithoutSubscription = db.organizations().insert(o -> o.setSubscription(null)); - - SearchWsResponse result = call(ws.newRequest()); - - assertThat(result.getOrganizationsList()).extracting(Organization::getKey, Organization::getSubscription).containsExactlyInAnyOrder( - tuple(paidOrganization.getKey(), PAID.name()), - tuple(freeOrganization.getKey(), FREE.name()), - tuple(organizationWithoutSubscription.getKey(), FREE.name())); - } - - @Test - public void return_sonarqube_subscription() { - OrganizationDto sonarQubeOrganization = db.organizations().insert(o -> o.setSubscription(SONARQUBE)); - - SearchWsResponse result = call(ws.newRequest()); - - assertThat(result.getOrganizationsList()).extracting(Organization::getKey, Organization::getSubscription).containsExactlyInAnyOrder( - tuple(sonarQubeOrganization.getKey(), SONARQUBE.name())); - } - - @Test public void request_returns_empty_on_table_with_single_row_when_not_requesting_the_first_page() { when(system2.now()).thenReturn(SOME_DATE); db.organizations().insert(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java index e49187b7382..e34cec9cdb5 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java @@ -28,12 +28,12 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.api.web.page.Page; import org.sonar.api.web.page.PageDefinition; +import org.sonar.core.extension.CoreExtensionRepository; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; -import org.sonar.core.extension.CoreExtensionRepository; import org.sonar.server.organization.BillingValidations; import org.sonar.server.organization.BillingValidationsProxy; import org.sonar.server.organization.DefaultOrganizationProvider; @@ -51,72 +51,34 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.api.web.page.Page.Scope.ORGANIZATION; +import static org.sonar.db.organization.OrganizationDto.Subscription.FREE; +import static org.sonar.db.organization.OrganizationDto.Subscription.PAID; +import static org.sonar.db.organization.OrganizationDto.Subscription.SONARQUBE; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; import static org.sonar.db.permission.OrganizationPermission.PROVISION_PROJECTS; import static org.sonar.test.JsonAssert.assertJson; public class OrganizationActionTest { @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(System2.INSTANCE); @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule public ExpectedException expectedException = ExpectedException.none(); - private DbClient dbClient = dbTester.getDbClient(); - private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); + private DbClient dbClient = db.getDbClient(); + private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private PageRepository pageRepository = mock(PageRepository.class); private BillingValidationsProxy billingValidations = mock(BillingValidationsProxy.class); private WsActionTester ws = new WsActionTester(new OrganizationAction(dbClient, defaultOrganizationProvider, userSession, pageRepository, billingValidations)); @Test - public void verify_definition() { - WebService.Action def = ws.getDef(); - - assertThat(def.isInternal()).isTrue(); - assertThat(def.description()).isEqualTo("Get information concerning organization navigation for the current user"); - assertThat(def.since()).isEqualTo("6.3"); - assertThat(def.changelog()).extracting(Change::getVersion, Change::getDescription).containsExactlyInAnyOrder( - tuple("6.4", "The field 'projectVisibility' is added")); - - assertThat(def.params()).hasSize(1); - WebService.Param organization = def.param("organization"); - assertThat(organization.description()).isEqualTo("the organization key"); - assertThat(organization.isRequired()).isTrue(); - assertThat(organization.exampleValue()).isEqualTo("my-org"); - } - - @Test - public void fails_with_IAE_if_parameter_organization_is_not_specified() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("The 'organization' parameter is missing"); - - executeRequest(null); - } - - @Test - public void json_example() { - initWithPages( - Page.builder("my-plugin/org-page").setName("Organization page").setScope(ORGANIZATION).build(), - Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); - OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setGuarded(true)); - userSession.logIn() - .addPermission(ADMINISTER, organization) - .addPermission(PROVISION_PROJECTS, organization); - - TestResponse response = executeRequest(organization); - - assertJson(response.getInput()) - .isSimilarTo(ws.getDef().responseExampleAsString()); - } - - @Test public void filter_out_admin_pages_when_user_is_not_admin() { initWithPages( Page.builder("my-plugin/org-page").setName("Organization page").setScope(ORGANIZATION).build(), Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); - OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setGuarded(true)); + OrganizationDto organization = db.organizations().insert(dto -> dto.setGuarded(true)); userSession.logIn() .addPermission(PROVISION_PROJECTS, organization); @@ -129,7 +91,7 @@ public class OrganizationActionTest { @Test public void returns_non_admin_and_canDelete_false_when_user_not_logged_in_and_key_is_the_default_organization() { - TestResponse response = executeRequest(dbTester.getDefaultOrganization()); + TestResponse response = executeRequest(db.getDefaultOrganization()); verifyResponse(response, false, false, false); } @@ -138,14 +100,14 @@ public class OrganizationActionTest { public void returns_non_admin_and_canDelete_false_when_user_logged_in_but_not_admin_and_key_is_the_default_organization() { userSession.logIn(); - TestResponse response = executeRequest(dbTester.getDefaultOrganization()); + TestResponse response = executeRequest(db.getDefaultOrganization()); verifyResponse(response, false, false, false); } @Test public void returns_admin_and_canDelete_true_when_user_logged_in_and_admin_and_key_is_the_default_organization() { - OrganizationDto defaultOrganization = dbTester.getDefaultOrganization(); + OrganizationDto defaultOrganization = db.getDefaultOrganization(); userSession.logIn().addPermission(ADMINISTER, defaultOrganization); TestResponse response = executeRequest(defaultOrganization); @@ -155,7 +117,7 @@ public class OrganizationActionTest { @Test public void returns_non_admin_and_canDelete_false_when_user_not_logged_in_and_key_is_not_the_default_organization() { - OrganizationDto organization = dbTester.organizations().insert(); + OrganizationDto organization = db.organizations().insert(); TestResponse response = executeRequest(organization); verifyResponse(response, false, false, false); @@ -163,7 +125,7 @@ public class OrganizationActionTest { @Test public void returns_non_admin_and_canDelete_false_when_user_logged_in_but_not_admin_and_key_is_not_the_default_organization() { - OrganizationDto organization = dbTester.organizations().insert(); + OrganizationDto organization = db.organizations().insert(); userSession.logIn(); TestResponse response = executeRequest(organization); @@ -173,7 +135,7 @@ public class OrganizationActionTest { @Test public void returns_admin_and_canDelete_true_when_user_logged_in_and_admin_and_key_is_not_the_default_organization() { - OrganizationDto organization = dbTester.organizations().insert(); + OrganizationDto organization = db.organizations().insert(); userSession.logIn().addPermission(ADMINISTER, organization); TestResponse response = executeRequest(organization); @@ -183,7 +145,7 @@ public class OrganizationActionTest { @Test public void returns_admin_and_canDelete_false_when_user_logged_in_and_admin_and_key_is_guarded_organization() { - OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setGuarded(true)); + OrganizationDto organization = db.organizations().insert(dto -> dto.setGuarded(true)); userSession.logIn().addPermission(ADMINISTER, organization); TestResponse response = executeRequest(organization); @@ -193,7 +155,7 @@ public class OrganizationActionTest { @Test public void returns_only_canDelete_true_when_user_is_system_administrator_and_key_is_guarded_organization() { - OrganizationDto organization = dbTester.organizations().insert(dto -> dto.setGuarded(true)); + OrganizationDto organization = db.organizations().insert(dto -> dto.setGuarded(true)); userSession.logIn().setSystemAdministrator(); TestResponse response = executeRequest(organization); @@ -204,8 +166,8 @@ public class OrganizationActionTest { @Test public void returns_provisioning_true_when_user_can_provision_projects_in_organization() { // user can provision projects in org2 but not in org1 - OrganizationDto org1 = dbTester.organizations().insert(); - OrganizationDto org2 = dbTester.organizations().insert(); + OrganizationDto org1 = db.organizations().insert(); + OrganizationDto org2 = db.organizations().insert(); userSession.logIn().addPermission(PROVISION_PROJECTS, org2); verifyResponse(executeRequest(org1), false, false, false); @@ -214,35 +176,88 @@ public class OrganizationActionTest { @Test public void returns_project_visibility_private() { - OrganizationDto organization = dbTester.organizations().insert(); - dbTester.organizations().setNewProjectPrivate(organization, true); + OrganizationDto organization = db.organizations().insert(); + db.organizations().setNewProjectPrivate(organization, true); userSession.logIn().addPermission(PROVISION_PROJECTS, organization); assertJson(executeRequest(organization).getInput()).isSimilarTo("{\"organization\": {\"projectVisibility\": \"private\"}}"); } @Test public void returns_project_visibility_public() { - OrganizationDto organization = dbTester.organizations().insert(); - dbTester.organizations().setNewProjectPrivate(organization, false); + OrganizationDto organization = db.organizations().insert(); + db.organizations().setNewProjectPrivate(organization, false); userSession.logIn().addPermission(PROVISION_PROJECTS, organization); assertJson(executeRequest(organization).getInput()).isSimilarTo("{\"organization\": {\"projectVisibility\": \"public\"}}"); } @Test public void returns_non_admin_and_canUpdateProjectsVisibilityToPrivate_false_when_user_logged_in_but_not_admin_and_extension_returns_true() { - OrganizationDto defaultOrganization = dbTester.getDefaultOrganization(); + OrganizationDto defaultOrganization = db.getDefaultOrganization(); userSession.logIn(); when(billingValidations.canUpdateProjectVisibilityToPrivate(any(BillingValidations.Organization.class))).thenReturn(true); - verifyCanUpdateProjectsVisibilityToPrivateResponse(executeRequest(dbTester.getDefaultOrganization()), false); + verifyCanUpdateProjectsVisibilityToPrivateResponse(executeRequest(db.getDefaultOrganization()), false); userSession.logIn().addPermission(ADMINISTER, defaultOrganization); when(billingValidations.canUpdateProjectVisibilityToPrivate(any(BillingValidations.Organization.class))).thenReturn(false); - verifyCanUpdateProjectsVisibilityToPrivateResponse(executeRequest(dbTester.getDefaultOrganization()), false); + verifyCanUpdateProjectsVisibilityToPrivateResponse(executeRequest(db.getDefaultOrganization()), false); userSession.logIn().addPermission(ADMINISTER, defaultOrganization); when(billingValidations.canUpdateProjectVisibilityToPrivate(any(BillingValidations.Organization.class))).thenReturn(true); - verifyCanUpdateProjectsVisibilityToPrivateResponse(executeRequest(dbTester.getDefaultOrganization()), true); + verifyCanUpdateProjectsVisibilityToPrivateResponse(executeRequest(db.getDefaultOrganization()), true); + } + + @Test + public void return_subscription_flag() { + OrganizationDto paidOrganization = db.organizations().insert(o -> o.setSubscription(PAID)); + assertJson(executeRequest(paidOrganization).getInput()).isSimilarTo("{\"organization\": {\"subscription\": \"PAID\"}}"); + + OrganizationDto freeOrganization = db.organizations().insert(o -> o.setSubscription(FREE)); + assertJson(executeRequest(freeOrganization).getInput()).isSimilarTo("{\"organization\": {\"subscription\": \"FREE\"}}"); + + OrganizationDto sonarQubeOrganization = db.organizations().insert(o -> o.setSubscription(SONARQUBE)); + assertJson(executeRequest(sonarQubeOrganization).getInput()).isSimilarTo("{\"organization\": {\"subscription\": \"SONARQUBE\"}}"); + } + + @Test + public void fails_with_IAE_if_parameter_organization_is_not_specified() { + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("The 'organization' parameter is missing"); + + executeRequest(null); + } + + @Test + public void json_example() { + initWithPages( + Page.builder("my-plugin/org-page").setName("Organization page").setScope(ORGANIZATION).build(), + Page.builder("my-plugin/org-admin-page").setName("Organization admin page").setScope(ORGANIZATION).setAdmin(true).build()); + OrganizationDto organization = db.organizations().insert(dto -> dto.setGuarded(true)); + userSession.logIn() + .addPermission(ADMINISTER, organization) + .addPermission(PROVISION_PROJECTS, organization); + + TestResponse response = executeRequest(organization); + + assertJson(response.getInput()) + .isSimilarTo(ws.getDef().responseExampleAsString()); + } + + @Test + public void verify_definition() { + WebService.Action def = ws.getDef(); + + assertThat(def.isInternal()).isTrue(); + assertThat(def.description()).isEqualTo("Get information concerning organization navigation for the current user"); + assertThat(def.since()).isEqualTo("6.3"); + assertThat(def.changelog()).extracting(Change::getVersion, Change::getDescription).containsExactlyInAnyOrder( + tuple("6.4", "The field 'projectVisibility' is added")); + + assertThat(def.params()).hasSize(1); + WebService.Param organization = def.param("organization"); + assertThat(organization.description()).isEqualTo("the organization key"); + assertThat(organization.isRequired()).isTrue(); + assertThat(organization.exampleValue()).isEqualTo("my-org"); } private void initWithPages(Page... pages) { diff --git a/sonar-ws/src/main/protobuf/ws-organizations.proto b/sonar-ws/src/main/protobuf/ws-organizations.proto index 4d9941eaeb8..172bf31d85c 100644 --- a/sonar-ws/src/main/protobuf/ws-organizations.proto +++ b/sonar-ws/src/main/protobuf/ws-organizations.proto @@ -61,7 +61,6 @@ message Organization { optional string avatar = 5; optional bool guarded = 6; optional bool isAdmin = 7; - optional string subscription = 8; } message User { |