]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10944 Move subscription flag from api/organizations/search to api/navigation...
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 6 Jul 2018 13:00:33 +0000 (15:00 +0200)
committerSonarTech <sonartech@sonarsource.com>
Wed, 11 Jul 2018 18:21:22 +0000 (20:21 +0200)
server/sonar-server/src/main/java/org/sonar/server/organization/ws/OrganizationsWsSupport.java
server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java
server/sonar-server/src/main/resources/org/sonar/server/organization/ws/create-example.json
server/sonar-server/src/main/resources/org/sonar/server/organization/ws/search-example.json
server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java
server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java
sonar-ws/src/main/protobuf/ws-organizations.proto

index e859a354ccaa578fd18d7e91d8dc696ef32fb640..69aaa1723c49042b23c6bfea73353477b8f5f04f 100644 (file)
@@ -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);
index ca03a893042859f6592b40b92997fa189a54ac34..574b0a9585e117b4e9a47addccdf7a96bc15a3b0 100644 (file)
@@ -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())));
index e21074c7b1272ed2e38a1b918599a7833ee1cc96..3acbecf41484248f31d711aef5812ada06d1ce39 100644 (file)
@@ -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
   }
 }
index 39b1221a5e8466a7bd1ed246e3369e4ab26085f5..481ae34e9ef10b209aa2265a699857d874cd17cc 100644 (file)
@@ -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
     }
   ]
 }
index d3bd70189853839d7cb0910d671631c0fef915b7..8ce1370500e0e7b6db84450a09487f0c42ffc3cb 100644 (file)
@@ -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
index 58a32e0179211cd14854f826b95df9df6b76cb94..1f3db59c0d8925a93549c88328bbc991ca55be1e 100644 (file)
@@ -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;
@@ -92,31 +91,6 @@ public class SearchActionTest {
       tuple(groupAdminOrganization.getKey(), true));
   }
 
-  @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);
index e49187b73827e5960e55f22b3bd27044fd7d45be..e34cec9cdb5928372d7e18c588aa891698573abd 100644 (file)
@@ -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) {
index 4d9941eaeb83639632cefbb6d74345d4f9540ec0..172bf31d85c966393c2352ab070f053dff76d245 100644 (file)
@@ -61,7 +61,6 @@ message Organization {
   optional string avatar = 5;
   optional bool guarded = 6;
   optional bool isAdmin = 7;
-  optional string subscription = 8;
 }
 
 message User {