diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2018-07-02 15:53:14 +0200 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2018-07-11 20:21:21 +0200 |
commit | 6c7e6840822b0f4a8b65187f63dce4b55c2427f6 (patch) | |
tree | eb333e730a1bf43485283c59aac119cee9257e91 /server/sonar-server | |
parent | ebec2ca4ce7efbf2ece496683f6c1e7c0cbce727 (diff) | |
download | sonarqube-6c7e6840822b0f4a8b65187f63dce4b55c2427f6.tar.gz sonarqube-6c7e6840822b0f4a8b65187f63dce4b55c2427f6.zip |
SONAR-10944 Add subscription flag to organizations
* Create migrations to add and populate ORGANIZATIONS#SUBSCRIPTION
* Handle subscription in insert/update/select of OrganizationDto
* Upgrade/Downgrade update organization subscription
* Return subscription flag in api/organizations/search
* Create new organization as FREE
Diffstat (limited to 'server/sonar-server')
15 files changed, 522 insertions, 711 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java index 3d9b20dfe52..f2ffd2e9e1a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java @@ -62,6 +62,7 @@ import static org.sonar.api.web.UserRole.ISSUE_ADMIN; import static org.sonar.api.web.UserRole.SECURITYHOTSPOT_ADMIN; import static org.sonar.api.web.UserRole.USER; import static org.sonar.core.util.stream.MoreCollectors.uniqueIndex; +import static org.sonar.db.organization.OrganizationDto.Subscription.FREE; import static org.sonar.db.permission.OrganizationPermission.SCAN; import static org.sonar.server.organization.OrganizationUpdater.NewOrganization.newOrganizationBuilder; @@ -206,7 +207,8 @@ public class OrganizationUpdaterImpl implements OrganizationUpdater { .setDescription(newOrganization.getDescription()) .setUrl(newOrganization.getUrl()) .setDefaultQualityGateUuid(builtInQualityGate.getUuid()) - .setAvatarUrl(newOrganization.getAvatar()); + .setAvatarUrl(newOrganization.getAvatar()) + .setSubscription(FREE); Arrays.stream(extendCreation).forEach(c -> c.accept(res)); dbClient.organizationDao().insert(dbSession, res, false); return res; 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 69aaa1723c4..e859a354cca 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,7 +115,8 @@ public class OrganizationsWsSupport { builder .setName(dto.getName()) .setKey(dto.getKey()) - .setGuarded(dto.isGuarded()); + .setGuarded(dto.isGuarded()) + .setSubscription(dto.getSubscription().name()); 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/organization/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java index 6e939c99bfa..d9d9f6835b3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java @@ -44,7 +44,8 @@ import static org.sonar.server.ws.WsUtils.writeProtobuf; import static org.sonarqube.ws.Common.Paging; public class SearchAction implements OrganizationsWsAction { - static final String PARAM_ORGANIZATIONS = "organizations"; + + private static final String PARAM_ORGANIZATIONS = "organizations"; static final String PARAM_MEMBER = "member"; private static final String ACTION = "search"; private static final int MAX_SIZE = 500; 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 3acbecf4148..e21074c7b12 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,6 +5,7 @@ "description": "The Foo company produces quality software for Bar.", "url": "https://www.foo.com", "avatar": "https://www.foo.com/foo.png", - "guarded": false + "guarded": false, + "subscription": "FREE" } } 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 481ae34e9ef..39b1221a5e8 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,7 +9,8 @@ "key": "foo-company", "name": "Foo Company", "guarded": true, - "isAdmin": false + "isAdmin": false, + "subscription": "FREE" }, { "key": "bar-company", @@ -18,7 +19,8 @@ "url": "https://www.bar.com", "avatar": "https://www.bar.com/logo.png", "guarded": false, - "isAdmin": true + "isAdmin": true, + "subscription": "PAID" } ] } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java index 6ab8b736b5d..788decf1177 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java @@ -39,7 +39,6 @@ import org.sonar.core.issue.IssueChangeContext; import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; -import org.sonar.db.component.ComponentTesting; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.server.issue.index.IssueIndexer; @@ -55,9 +54,9 @@ public class WebIssueStorageTest { private System2 system2 = mock(System2.class); @org.junit.Rule - public DbTester dbTester = DbTester.create(system2); + public DbTester db = DbTester.create(system2); - private DbClient dbClient = dbTester.getDbClient(); + private DbClient dbClient = db.getDbClient(); private WebIssueStorage underTest = new WebIssueStorage(system2, dbClient, new FakeRuleFinder(), mock(IssueIndexer.class)); @@ -68,32 +67,32 @@ public class WebIssueStorageTest { @Test public void load_component_id_from_db() { - OrganizationDto organization = dbTester.organizations().insert(); - ComponentDto project = dbTester.components().insertPublicProject(organization); - ComponentDto file = dbTester.components().insertComponent(ComponentTesting.newFileDto(project)); + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organizationDto); + ComponentDto file = db.components().insertComponent(newFileDto(project)); - long componentId = underTest.component(dbTester.getSession(), new DefaultIssue().setComponentUuid(file.uuid())).getId(); + long componentId = underTest.component(db.getSession(), new DefaultIssue().setComponentUuid(file.uuid())).getId(); assertThat(componentId).isEqualTo(file.getId()); } @Test public void load_project_id_from_db() { - OrganizationDto organization = dbTester.organizations().insert(); - ComponentDto project = dbTester.components().insertPublicProject(organization); - dbTester.components().insertComponent(ComponentTesting.newFileDto(project)); + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organizationDto); + ComponentDto file = db.components().insertComponent(newFileDto(project)); - long projectId = underTest.project(dbTester.getSession(), new DefaultIssue().setProjectUuid(project.uuid())).getId(); + long projectId = underTest.project(db.getSession(), new DefaultIssue().setProjectUuid(project.uuid())).getId(); assertThat(projectId).isEqualTo(project.getId()); } @Test - public void should_insert_new_issues() { - RuleDefinitionDto rule = dbTester.rules().insert(); - ComponentDto project = dbTester.components().insertMainBranch(); - ComponentDto module = dbTester.components().insertComponent(newModuleDto(project)); - ComponentDto file = dbTester.components().insertComponent(newFileDto(module)); + public void insert_new_issues() { + RuleDefinitionDto rule = db.rules().insert(); + ComponentDto project = db.components().insertMainBranch(); + ComponentDto module = db.components().insertComponent(newModuleDto(project)); + ComponentDto file = db.components().insertComponent(newFileDto(module)); String issueKey = "ABCDE"; DefaultIssueComment comment = DefaultIssueComment.create(issueKey, "user_uuid", "the comment"); @@ -121,29 +120,29 @@ public class WebIssueStorageTest { underTest.save(issue); - assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); - assertThat(dbTester.selectFirst("select * from issues")) - .containsEntry("PROJECT_UUID", project.uuid()) - .containsEntry("COMPONENT_UUID", file.uuid()) - .containsEntry("KEE", issue.key()) - .containsEntry("RESOLUTION", issue.resolution()) - .containsEntry("STATUS", issue.status()) - .containsEntry("SEVERITY", issue.severity()); - - assertThat(dbTester.countRowsOfTable("issue_changes")).isEqualTo(1); - assertThat(dbTester.selectFirst("select * from issue_changes")) - .containsEntry("KEE", comment.key()) - .containsEntry("ISSUE_KEY", issue.key()) - .containsEntry("CHANGE_DATA", comment.markdownText()) - .containsEntry("USER_LOGIN", comment.userUuid()); + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.selectFirst("select * from issues")) + .containsEntry("PROJECT_UUID", project.uuid()) + .containsEntry("COMPONENT_UUID", file.uuid()) + .containsEntry("KEE", issue.key()) + .containsEntry("RESOLUTION", issue.resolution()) + .containsEntry("STATUS", issue.status()) + .containsEntry("SEVERITY", issue.severity()); + + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(1); + assertThat(db.selectFirst("select * from issue_changes")) + .containsEntry("KEE", comment.key()) + .containsEntry("ISSUE_KEY", issue.key()) + .containsEntry("CHANGE_DATA", comment.markdownText()) + .containsEntry("USER_LOGIN", comment.userUuid()); } @Test - public void should_update_issues() { - RuleDefinitionDto rule = dbTester.rules().insert(); - ComponentDto project = dbTester.components().insertMainBranch(); - ComponentDto module = dbTester.components().insertComponent(newModuleDto(project)); - ComponentDto file = dbTester.components().insertComponent(newFileDto(module)); + public void update_issues() { + RuleDefinitionDto rule = db.rules().insert(); + ComponentDto project = db.components().insertMainBranch(); + ComponentDto module = db.components().insertComponent(newModuleDto(project)); + ComponentDto file = db.components().insertComponent(newFileDto(module)); Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); DefaultIssue issue = new DefaultIssue() @@ -165,8 +164,8 @@ public class WebIssueStorageTest { underTest.save(issue); - assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); - assertThat(dbTester.countRowsOfTable("issue_changes")).isEqualTo(0); + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(0); DefaultIssue updated = new DefaultIssue() .setKey(issue.key()) @@ -198,23 +197,23 @@ public class WebIssueStorageTest { underTest.save(updated); - assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); - assertThat(dbTester.selectFirst("select * from issues")) - .containsEntry("ASSIGNEE", updated.assignee()) - .containsEntry("AUTHOR_LOGIN", updated.authorLogin()) - .containsEntry("CHECKSUM", updated.checksum()) - .containsEntry("COMPONENT_UUID", issue.componentUuid()) - .containsEntry("EFFORT", updated.effortInMinutes()) - .containsEntry("ISSUE_ATTRIBUTES", "fox=bax") - .containsEntry("ISSUE_TYPE", (byte) 3) - .containsEntry("KEE", issue.key()) - .containsEntry("LINE", (long) updated.line()) - .containsEntry("PROJECT_UUID", updated.projectUuid()) - .containsEntry("RESOLUTION", updated.resolution()) - .containsEntry("STATUS", updated.status()) - .containsEntry("SEVERITY", updated.severity()); - - List<Map<String, Object>> rows = dbTester.select("select * from issue_changes order by id"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.selectFirst("select * from issues")) + .containsEntry("ASSIGNEE", updated.assignee()) + .containsEntry("AUTHOR_LOGIN", updated.authorLogin()) + .containsEntry("CHECKSUM", updated.checksum()) + .containsEntry("COMPONENT_UUID", issue.componentUuid()) + .containsEntry("EFFORT", updated.effortInMinutes()) + .containsEntry("ISSUE_ATTRIBUTES", "fox=bax") + .containsEntry("ISSUE_TYPE", (byte) 3) + .containsEntry("KEE", issue.key()) + .containsEntry("LINE", (long) updated.line()) + .containsEntry("PROJECT_UUID", updated.projectUuid()) + .containsEntry("RESOLUTION", updated.resolution()) + .containsEntry("STATUS", updated.status()) + .containsEntry("SEVERITY", updated.severity()); + + List<Map<String, Object>> rows = db.select("select * from issue_changes order by id"); assertThat(rows).hasSize(2); assertThat(rows.get(0)) .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java index be832a90a8d..f021915ff49 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java @@ -39,6 +39,7 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.organization.DefaultTemplates; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.organization.OrganizationDto.Subscription; import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto; import org.sonar.db.permission.template.PermissionTemplateDto; import org.sonar.db.permission.template.PermissionTemplateGroupDto; @@ -108,84 +109,6 @@ public class OrganizationUpdaterImplTest { builtInQProfileRepositoryRule, defaultGroupCreator); @Test - public void create_throws_NPE_if_NewOrganization_arg_is_null() throws OrganizationUpdater.KeyConflictException { - UserDto user = db.users().insertUser(); - - expectedException.expect(NullPointerException.class); - expectedException.expectMessage("newOrganization can't be null"); - - underTest.create(dbSession, user, null); - } - - @Test - public void create_throws_exception_thrown_by_checkValidKey() throws OrganizationUpdater.KeyConflictException { - UserDto user = db.users().insertUser(); - - when(organizationValidation.checkKey(FULL_POPULATED_NEW_ORGANIZATION.getKey())) - .thenThrow(exceptionThrownByOrganizationValidation); - - createThrowsExceptionThrownByOrganizationValidation(user); - } - - @Test - public void create_throws_exception_thrown_by_checkValidDescription() throws OrganizationUpdater.KeyConflictException { - UserDto user = db.users().insertUser(); - - when(organizationValidation.checkDescription(FULL_POPULATED_NEW_ORGANIZATION.getDescription())).thenThrow(exceptionThrownByOrganizationValidation); - - createThrowsExceptionThrownByOrganizationValidation(user); - } - - @Test - public void create_throws_exception_thrown_by_checkValidUrl() throws OrganizationUpdater.KeyConflictException { - UserDto user = db.users().insertUser(); - - when(organizationValidation.checkUrl(FULL_POPULATED_NEW_ORGANIZATION.getUrl())).thenThrow(exceptionThrownByOrganizationValidation); - - createThrowsExceptionThrownByOrganizationValidation(user); - } - - @Test - public void create_throws_exception_thrown_by_checkValidAvatar() throws OrganizationUpdater.KeyConflictException { - UserDto user = db.users().insertUser(); - - when(organizationValidation.checkAvatar(FULL_POPULATED_NEW_ORGANIZATION.getAvatar())).thenThrow(exceptionThrownByOrganizationValidation); - - createThrowsExceptionThrownByOrganizationValidation(user); - } - - private void createThrowsExceptionThrownByOrganizationValidation(UserDto user) throws OrganizationUpdater.KeyConflictException { - try { - underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); - fail(exceptionThrownByOrganizationValidation + " should have been thrown"); - } catch (IllegalArgumentException e) { - assertThat(e).isSameAs(exceptionThrownByOrganizationValidation); - } - } - - @Test - public void create_fails_with_ISE_if_BuiltInQProfileRepository_has_not_been_initialized() throws OrganizationUpdater.KeyConflictException { - UserDto user = db.users().insertUser(); - db.qualityGates().insertBuiltInQualityGate(); - - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage("initialize must be called first"); - - underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); - } - - @Test - public void create_fails_with_KeyConflictException_if_org_with_key_in_NewOrganization_arg_already_exists_in_db() throws OrganizationUpdater.KeyConflictException { - db.organizations().insertForKey(FULL_POPULATED_NEW_ORGANIZATION.getKey()); - UserDto user = db.users().insertUser(); - - expectedException.expect(OrganizationUpdater.KeyConflictException.class); - expectedException.expectMessage("Organization key '" + FULL_POPULATED_NEW_ORGANIZATION.getKey() + "' is already used"); - - underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); - } - - @Test public void create_creates_unguarded_organization_with_properties_from_NewOrganization_arg() throws OrganizationUpdater.KeyConflictException { builtInQProfileRepositoryRule.initialize(); UserDto user = db.users().insertUser(); @@ -201,6 +124,7 @@ public class OrganizationUpdaterImplTest { assertThat(organization.getUrl()).isEqualTo(FULL_POPULATED_NEW_ORGANIZATION.getUrl()); assertThat(organization.getAvatarUrl()).isEqualTo(FULL_POPULATED_NEW_ORGANIZATION.getAvatar()); assertThat(organization.isGuarded()).isFalse(); + assertThat(organization.getSubscription()).isEqualTo(Subscription.FREE); assertThat(organization.getCreatedAt()).isEqualTo(A_DATE); assertThat(organization.getUpdatedAt()).isEqualTo(A_DATE); } @@ -326,32 +250,81 @@ public class OrganizationUpdaterImplTest { } @Test - public void createForUser_has_no_effect_if_setting_for_feature_is_not_set() { - checkSizeOfTables(); + public void create_throws_NPE_if_NewOrganization_arg_is_null() throws OrganizationUpdater.KeyConflictException { + UserDto user = db.users().insertUser(); - underTest.createForUser(null /* argument is not even read */, null /* argument is not even read */); + expectedException.expect(NullPointerException.class); + expectedException.expectMessage("newOrganization can't be null"); - checkSizeOfTables(); + underTest.create(dbSession, user, null); } @Test - public void createForUser_has_no_effect_if_setting_for_feature_is_disabled() { - enableCreatePersonalOrg(false); + public void create_throws_exception_thrown_by_checkValidKey() throws OrganizationUpdater.KeyConflictException { + UserDto user = db.users().insertUser(); - checkSizeOfTables(); + when(organizationValidation.checkKey(FULL_POPULATED_NEW_ORGANIZATION.getKey())) + .thenThrow(exceptionThrownByOrganizationValidation); - underTest.createForUser(null /* argument is not even read */, null /* argument is not even read */); + createThrowsExceptionThrownByOrganizationValidation(user); + } - checkSizeOfTables(); + @Test + public void create_throws_exception_thrown_by_checkValidDescription() throws OrganizationUpdater.KeyConflictException { + UserDto user = db.users().insertUser(); + + when(organizationValidation.checkDescription(FULL_POPULATED_NEW_ORGANIZATION.getDescription())).thenThrow(exceptionThrownByOrganizationValidation); + + createThrowsExceptionThrownByOrganizationValidation(user); } - private void checkSizeOfTables() { - assertThat(db.countRowsOfTable("organizations")).isEqualTo(1); - assertThat(db.countRowsOfTable("groups")).isEqualTo(0); - assertThat(db.countRowsOfTable("groups_users")).isEqualTo(0); - assertThat(db.countRowsOfTable("permission_templates")).isEqualTo(0); - assertThat(db.countRowsOfTable("perm_templates_users")).isEqualTo(0); - assertThat(db.countRowsOfTable("perm_templates_groups")).isEqualTo(0); + @Test + public void create_throws_exception_thrown_by_checkValidUrl() throws OrganizationUpdater.KeyConflictException { + UserDto user = db.users().insertUser(); + + when(organizationValidation.checkUrl(FULL_POPULATED_NEW_ORGANIZATION.getUrl())).thenThrow(exceptionThrownByOrganizationValidation); + + createThrowsExceptionThrownByOrganizationValidation(user); + } + + @Test + public void create_throws_exception_thrown_by_checkValidAvatar() throws OrganizationUpdater.KeyConflictException { + UserDto user = db.users().insertUser(); + + when(organizationValidation.checkAvatar(FULL_POPULATED_NEW_ORGANIZATION.getAvatar())).thenThrow(exceptionThrownByOrganizationValidation); + + createThrowsExceptionThrownByOrganizationValidation(user); + } + + private void createThrowsExceptionThrownByOrganizationValidation(UserDto user) throws OrganizationUpdater.KeyConflictException { + try { + underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); + fail(exceptionThrownByOrganizationValidation + " should have been thrown"); + } catch (IllegalArgumentException e) { + assertThat(e).isSameAs(exceptionThrownByOrganizationValidation); + } + } + + @Test + public void create_fails_with_ISE_if_BuiltInQProfileRepository_has_not_been_initialized() throws OrganizationUpdater.KeyConflictException { + UserDto user = db.users().insertUser(); + db.qualityGates().insertBuiltInQualityGate(); + + expectedException.expect(IllegalStateException.class); + expectedException.expectMessage("initialize must be called first"); + + underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); + } + + @Test + public void create_fails_with_KeyConflictException_if_org_with_key_in_NewOrganization_arg_already_exists_in_db() throws OrganizationUpdater.KeyConflictException { + db.organizations().insertForKey(FULL_POPULATED_NEW_ORGANIZATION.getKey()); + UserDto user = db.users().insertUser(); + + expectedException.expect(OrganizationUpdater.KeyConflictException.class); + expectedException.expectMessage("Organization key '" + FULL_POPULATED_NEW_ORGANIZATION.getKey() + "' is already used"); + + underTest.create(dbSession, user, FULL_POPULATED_NEW_ORGANIZATION); } @Test @@ -372,6 +345,7 @@ public class OrganizationUpdaterImplTest { assertThat(organization.getUrl()).isNull(); assertThat(organization.getAvatarUrl()).isNull(); assertThat(organization.isGuarded()).isTrue(); + assertThat(organization.getSubscription()).isEqualTo(Subscription.FREE); assertThat(organization.getCreatedAt()).isEqualTo(A_DATE); assertThat(organization.getUpdatedAt()).isEqualTo(A_DATE); @@ -545,6 +519,36 @@ public class OrganizationUpdaterImplTest { } @Test + public void createForUser_has_no_effect_if_setting_for_feature_is_not_set() { + checkSizeOfTables(); + + underTest.createForUser(null /* argument is not even read */, null /* argument is not even read */); + + checkSizeOfTables(); + } + + @Test + public void createForUser_has_no_effect_if_setting_for_feature_is_disabled() { + enableCreatePersonalOrg(false); + + checkSizeOfTables(); + + underTest.createForUser(null /* argument is not even read */, null /* argument is not even read */); + + checkSizeOfTables(); + } + + private void checkSizeOfTables() { + assertThat(db.countRowsOfTable("organizations")).isEqualTo(1); + assertThat(db.countRowsOfTable("groups")).isEqualTo(0); + assertThat(db.countRowsOfTable("groups_users")).isEqualTo(0); + assertThat(db.countRowsOfTable("permission_templates")).isEqualTo(0); + assertThat(db.countRowsOfTable("perm_templates_users")).isEqualTo(0); + assertThat(db.countRowsOfTable("perm_templates_groups")).isEqualTo(0); + } + + + @Test public void update_personal_organization() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("old login")); when(organizationValidation.generateKeyFrom("new_login")).thenReturn("new_login"); 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 076d906a9fa..d3bd7018985 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 @@ -54,7 +54,6 @@ import org.sonar.server.organization.OrganizationValidationImpl; import org.sonar.server.organization.TestOrganizationFlags; import org.sonar.server.qualityprofile.BuiltInQProfileRepository; import org.sonar.server.tester.UserSessionRule; -import org.sonar.server.user.index.UserIndex; import org.sonar.server.user.index.UserIndexDefinition; import org.sonar.server.user.index.UserIndexer; import org.sonar.server.usergroups.DefaultGroupCreatorImpl; @@ -87,18 +86,17 @@ public class CreateActionTest { @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule - public DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); + public DbTester db = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule public EsTester es = EsTester.create(); @Rule public ExpectedException expectedException = ExpectedException.none(); - private DbClient dbClient = dbTester.getDbClient(); - private DbSession dbSession = dbTester.getSession(); + private DbClient dbClient = db.getDbClient(); + private DbSession dbSession = db.getSession(); private MapSettings settings = new MapSettings().setProperty(ORGANIZATIONS_ANYONE_CAN_CREATE, false); private OrganizationValidation organizationValidation = new OrganizationValidationImpl(); private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); - private UserIndex userIndex = new UserIndex(es.client(), System2.INSTANCE); private OrganizationUpdater organizationUpdater = new OrganizationUpdaterImpl(dbClient, system2, UuidFactoryFast.getInstance(), organizationValidation, settings.asConfig(), userIndexer, mock(BuiltInQProfileRepository.class), new DefaultGroupCreatorImpl(dbClient)); @@ -110,53 +108,146 @@ public class CreateActionTest { organizationUpdater, organizationFlags)); @Test - public void verify_define() { - WebService.Action action = wsTester.getDef(); - assertThat(action.key()).isEqualTo("create"); - assertThat(action.isPost()).isTrue(); - assertThat(action.description()).isEqualTo("Create an organization.<br />" + - "Requires 'Administer System' permission unless any logged in user is allowed to create an organization (see appropriate setting). Organization support must be enabled."); - assertThat(action.isInternal()).isTrue(); - assertThat(action.since()).isEqualTo("6.2"); - assertThat(action.handler()).isNotNull(); - assertThat(action.params()).hasSize(5); - assertThat(action.responseExample()).isEqualTo(getClass().getResource("create-example.json")); - assertThat(action.param("name")) - .matches(WebService.Param::isRequired) - .matches(param -> "Foo Company".equals(param.exampleValue())) - .matches(param -> param.description() != null); - assertThat(action.param("key")) - .matches(param -> !param.isRequired()) - .matches(param -> "foo-company".equals(param.exampleValue())) - .matches(param -> param.description() != null); - assertThat(action.param("description")) - .matches(param -> !param.isRequired()) - .matches(param -> "The Foo company produces quality software for Bar.".equals(param.exampleValue())) - .matches(param -> param.description() != null); - assertThat(action.param("url")) - .matches(param -> !param.isRequired()) - .matches(param -> "https://www.foo.com".equals(param.exampleValue())) - .matches(param -> param.description() != null); - assertThat(action.param("avatar")) - .matches(param -> !param.isRequired()) - .matches(param -> "https://www.foo.com/foo.png".equals(param.exampleValue())) - .matches(param -> param.description() != null); + public void create_organization() { + settings.setProperty(ORGANIZATIONS_ANYONE_CAN_CREATE, true); + db.qualityGates().insertBuiltInQualityGate(); + UserDto user = db.users().insertUser(); + userSession.logIn(user); + + CreateWsResponse response = wsTester.newRequest() + .setParam("name", "orgFoo") + .setParam("description", "My org desc") + .setParam("url", "my url") + .setParam("avatar", "my avatar") + .executeProtobuf(CreateWsResponse.class); + + assertThat(response.getOrganization().getKey()).isEqualTo("orgfoo"); + assertThat(response.getOrganization().getName()).isEqualTo("orgFoo"); + 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"); + assertThat(organization.getUrl()).isEqualTo("my url"); + assertThat(organization.getAvatarUrl()).isEqualTo("my avatar"); + assertThat(organization.getSubscription()).isEqualTo(OrganizationDto.Subscription.FREE); } @Test - public void verify_response_example() { + public void request_creates_owners_group_with_all_permissions_for_new_organization_and_add_current_user_to_it() { + UserDto user = db.users().insertUser(); + userSession.logIn(user).setSystemAdministrator(); + db.qualityGates().insertBuiltInQualityGate(); + + executeRequest("orgFoo"); + + DbSession dbSession = db.getSession(); + OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); + Optional<GroupDto> groupDtoOptional = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Owners"); + assertThat(groupDtoOptional).isNotEmpty(); + GroupDto groupDto = groupDtoOptional.get(); + assertThat(groupDto.getDescription()).isEqualTo("Owners of organization orgFoo"); + assertThat(dbClient.groupPermissionDao().selectGlobalPermissionsOfGroup(dbSession, groupDto.getOrganizationUuid(), groupDto.getId())) + .containsOnly(GlobalPermissions.ALL.toArray(new String[GlobalPermissions.ALL.size()])); + List<UserMembershipDto> members = dbClient.groupMembershipDao().selectMembers( + dbSession, + UserMembershipQuery.builder() + .organizationUuid(organization.getUuid()) + .groupId(groupDto.getId()) + .membership(UserMembershipQuery.IN).build(), + 0, Integer.MAX_VALUE); + assertThat(members) + .extracting(UserMembershipDto::getLogin) + .containsOnly(user.getLogin()); + } + + @Test + public void request_creates_members_group_and_add_current_user_to_it() { + UserDto user = db.users().insertUser(); + userSession.logIn(user).setSystemAdministrator(); + db.qualityGates().insertBuiltInQualityGate(); + + executeRequest("orgFoo"); + + DbSession dbSession = db.getSession(); + OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); + Optional<GroupDto> groupDtoOptional = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Members"); + assertThat(groupDtoOptional).isNotEmpty(); + GroupDto groupDto = groupDtoOptional.get(); + assertThat(groupDto.getDescription()).isEqualTo("All members of the organization"); + assertThat(dbClient.groupPermissionDao().selectGlobalPermissionsOfGroup(dbSession, groupDto.getOrganizationUuid(), groupDto.getId())).isEmpty(); + List<UserMembershipDto> members = dbClient.groupMembershipDao().selectMembers( + dbSession, + UserMembershipQuery.builder() + .organizationUuid(organization.getUuid()) + .groupId(groupDto.getId()) + .membership(UserMembershipQuery.IN).build(), + 0, Integer.MAX_VALUE); + assertThat(members) + .extracting(UserMembershipDto::getLogin) + .containsOnly(user.getLogin()); + } + + @Test + public void request_creates_default_template_for_owner_group() { + UserDto user = db.users().insertUser(); + userSession.logIn(user).setSystemAdministrator(); + db.qualityGates().insertBuiltInQualityGate(); + + executeRequest("orgFoo"); + + OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); + GroupDto ownersGroup = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Owners").get(); + GroupDto defaultGroup = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Members").get(); + PermissionTemplateDto defaultTemplate = dbClient.permissionTemplateDao().selectByName(dbSession, organization.getUuid(), "default template"); + assertThat(defaultTemplate.getName()).isEqualTo("Default template"); + assertThat(defaultTemplate.getDescription()).isEqualTo("Default permission template of organization orgFoo"); + DefaultTemplates defaultTemplates = dbClient.organizationDao().getDefaultTemplates(dbSession, organization.getUuid()).get(); + assertThat(defaultTemplates.getProjectUuid()).isEqualTo(defaultTemplate.getUuid()); + assertThat(defaultTemplates.getViewUuid()).isNull(); + 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(defaultGroup.getId(), UserRole.USER), tuple(defaultGroup.getId(), UserRole.CODEVIEWER)); + } + + @Test + public void set_user_as_member_of_organization() { + UserDto user = db.users().insertUser(); + userSession.logIn(user).setSystemAdministrator(); + db.qualityGates().insertBuiltInQualityGate(); + + executeRequest("foo", "bar"); + + OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "bar").get(); + assertThat(dbClient.organizationMemberDao().select(dbSession, organization.getUuid(), user.getId())).isPresent(); + 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); + } + + @Test + public void create_organization_with_name_having_one_character() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); - String response = executeJsonRequest("Foo Company", "foo-company", "The Foo company produces quality software for Bar.", "https://www.foo.com", "https://www.foo.com/foo.png"); + wsTester.newRequest() + .setParam(PARAM_NAME, "a") + .execute(); - assertJson(response).isSimilarTo(wsTester.getDef().responseExampleAsString()); + OrganizationDto organization = dbClient.organizationDao().selectByKey(db.getSession(), "a").get(); + assertThat(organization.getKey()).isEqualTo("a"); + assertThat(organization.getName()).isEqualTo("a"); } @Test public void request_succeeds_if_user_is_system_administrator_and_logged_in_users_cannot_create_organizations() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); verifyResponseAndDb(executeRequest("foo"), "foo", "foo", NOW); } @@ -165,17 +256,17 @@ public class CreateActionTest { public void request_succeeds_if_user_is_system_administrator_and_logged_in_users_can_create_organizations() { createUserAndLogInAsSystemAdministrator(); settings.setProperty(ORGANIZATIONS_ANYONE_CAN_CREATE, true); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); verifyResponseAndDb(executeRequest("foo"), "foo", "foo", NOW); } @Test public void request_succeeds_if_user_is_not_system_administrator_and_logged_in_users_can_create_organizations() { - UserDto user = dbTester.users().insertUser(); + UserDto user = db.users().insertUser(); userSession.logIn(user); settings.setProperty(ORGANIZATIONS_ANYONE_CAN_CREATE, true); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); verifyResponseAndDb(executeRequest("foo"), "foo", "foo", NOW); } @@ -183,7 +274,7 @@ public class CreateActionTest { @Test public void request_succeeds_if_name_is_two_chars_long() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); verifyResponseAndDb(executeRequest("ab"), "ab", "ab", NOW); } @@ -191,7 +282,7 @@ public class CreateActionTest { @Test public void request_succeeds_if_name_is_64_char_long() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); String name = STRING_65_CHARS_LONG.substring(0, 64); @@ -201,7 +292,7 @@ public class CreateActionTest { @Test public void request_succeeds_if_key_is_2_chars_long() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); verifyResponseAndDb(executeRequest("foo", "ab"), "foo", "ab", NOW); } @@ -209,7 +300,7 @@ public class CreateActionTest { @Test public void requests_succeeds_if_key_is_32_chars_long() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); String key = STRING_65_CHARS_LONG.substring(0, 32); @@ -219,7 +310,7 @@ public class CreateActionTest { @Test public void request_succeeds_if_description_url_and_avatar_are_not_specified() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); CreateWsResponse response = executeRequest("foo", "bar", null, null, null); @@ -229,7 +320,7 @@ public class CreateActionTest { @Test public void request_succeeds_if_description_url_and_avatar_are_specified() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); CreateWsResponse response = executeRequest("foo", "bar", "moo", "doo", "boo"); verifyResponseAndDb(response, "foo", "bar", "moo", "doo", "boo", NOW); @@ -238,7 +329,7 @@ public class CreateActionTest { @Test public void request_succeeds_to_generate_key_from_name_more_then_32_chars_long() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); String name = STRING_65_CHARS_LONG.substring(0, 33); @@ -249,7 +340,7 @@ public class CreateActionTest { @Test public void request_generates_key_ignoring_multiple_following_spaces() { createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); String name = "ab cd"; @@ -261,7 +352,7 @@ public class CreateActionTest { public void request_succeeds_if_description_is_256_chars_long() { createUserAndLogInAsSystemAdministrator(); String description = STRING_257_CHARS_LONG.substring(0, 256); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); CreateWsResponse response = executeRequest("foo", "bar", description, null, null); verifyResponseAndDb(response, "foo", "bar", description, null, null, NOW); @@ -271,7 +362,7 @@ public class CreateActionTest { public void request_succeeds_if_url_is_256_chars_long() { createUserAndLogInAsSystemAdministrator(); String url = STRING_257_CHARS_LONG.substring(0, 256); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); CreateWsResponse response = executeRequest("foo", "bar", null, url, null); verifyResponseAndDb(response, "foo", "bar", null, url, null, NOW); @@ -281,122 +372,13 @@ public class CreateActionTest { public void request_succeeds_if_avatar_is_256_chars_long() { createUserAndLogInAsSystemAdministrator(); String avatar = STRING_257_CHARS_LONG.substring(0, 256); - dbTester.qualityGates().insertBuiltInQualityGate(); + db.qualityGates().insertBuiltInQualityGate(); CreateWsResponse response = executeRequest("foo", "bar", null, null, avatar); verifyResponseAndDb(response, "foo", "bar", null, null, avatar, NOW); } @Test - public void request_creates_owners_group_with_all_permissions_for_new_organization_and_add_current_user_to_it() { - UserDto user = dbTester.users().insertUser(); - userSession.logIn(user).setSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); - - executeRequest("orgFoo"); - - DbSession dbSession = dbTester.getSession(); - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); - Optional<GroupDto> groupDtoOptional = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Owners"); - assertThat(groupDtoOptional).isNotEmpty(); - GroupDto groupDto = groupDtoOptional.get(); - assertThat(groupDto.getDescription()).isEqualTo("Owners of organization orgFoo"); - assertThat(dbClient.groupPermissionDao().selectGlobalPermissionsOfGroup(dbSession, groupDto.getOrganizationUuid(), groupDto.getId())) - .containsOnly(GlobalPermissions.ALL.toArray(new String[GlobalPermissions.ALL.size()])); - List<UserMembershipDto> members = dbClient.groupMembershipDao().selectMembers( - dbSession, - UserMembershipQuery.builder() - .organizationUuid(organization.getUuid()) - .groupId(groupDto.getId()) - .membership(UserMembershipQuery.IN).build(), - 0, Integer.MAX_VALUE); - assertThat(members) - .extracting(UserMembershipDto::getLogin) - .containsOnly(user.getLogin()); - } - - @Test - public void request_creates_members_group_and_add_current_user_to_it() { - UserDto user = dbTester.users().insertUser(); - userSession.logIn(user).setSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); - - executeRequest("orgFoo"); - - DbSession dbSession = dbTester.getSession(); - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); - Optional<GroupDto> groupDtoOptional = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Members"); - assertThat(groupDtoOptional).isNotEmpty(); - GroupDto groupDto = groupDtoOptional.get(); - assertThat(groupDto.getDescription()).isEqualTo("All members of the organization"); - assertThat(dbClient.groupPermissionDao().selectGlobalPermissionsOfGroup(dbSession, groupDto.getOrganizationUuid(), groupDto.getId())).isEmpty(); - List<UserMembershipDto> members = dbClient.groupMembershipDao().selectMembers( - dbSession, - UserMembershipQuery.builder() - .organizationUuid(organization.getUuid()) - .groupId(groupDto.getId()) - .membership(UserMembershipQuery.IN).build(), - 0, Integer.MAX_VALUE); - assertThat(members) - .extracting(UserMembershipDto::getLogin) - .containsOnly(user.getLogin()); - } - - @Test - public void request_creates_default_template_for_owner_group() { - UserDto user = dbTester.users().insertUser(); - userSession.logIn(user).setSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); - - executeRequest("orgFoo"); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "orgfoo").get(); - GroupDto ownersGroup = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Owners").get(); - GroupDto defaultGroup = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Members").get(); - PermissionTemplateDto defaultTemplate = dbClient.permissionTemplateDao().selectByName(dbSession, organization.getUuid(), "default template"); - assertThat(defaultTemplate.getName()).isEqualTo("Default template"); - assertThat(defaultTemplate.getDescription()).isEqualTo("Default permission template of organization orgFoo"); - DefaultTemplates defaultTemplates = dbClient.organizationDao().getDefaultTemplates(dbSession, organization.getUuid()).get(); - assertThat(defaultTemplates.getProjectUuid()).isEqualTo(defaultTemplate.getUuid()); - assertThat(defaultTemplates.getViewUuid()).isNull(); - 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(defaultGroup.getId(), UserRole.USER), tuple(defaultGroup.getId(), UserRole.CODEVIEWER)); - } - - @Test - public void set_user_as_member_of_organization() { - UserDto user = dbTester.users().insertUser(); - userSession.logIn(user).setSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); - - executeRequest("foo", "bar"); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, "bar").get(); - assertThat(dbClient.organizationMemberDao().select(dbSession, organization.getUuid(), user.getId())).isPresent(); - 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); - } - - @Test - public void create_organization_with_name_having_one_character() { - createUserAndLogInAsSystemAdministrator(); - dbTester.qualityGates().insertBuiltInQualityGate(); - - wsTester.newRequest() - .setParam(PARAM_NAME, "a") - .execute(); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbTester.getSession(), "a").get(); - assertThat(organization.getKey()).isEqualTo("a"); - assertThat(organization.getName()).isEqualTo("a"); - } - - @Test public void request_fails_if_name_param_is_missing() { createUserAndLogInAsSystemAdministrator(); @@ -496,7 +478,7 @@ public class CreateActionTest { @Test public void request_fails_if_key_is_specified_and_already_exists_in_DB() { createUserAndLogInAsSystemAdministrator(); - OrganizationDto org = dbTester.organizations().insert(o -> o.setKey("the-key")); + OrganizationDto org = db.organizations().insert(o -> o.setKey("the-key")); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Key '" + org.getKey() + "' is already used. Specify another one."); @@ -508,7 +490,7 @@ public class CreateActionTest { public void request_fails_if_key_computed_from_name_already_exists_in_DB() { createUserAndLogInAsSystemAdministrator(); String key = STRING_65_CHARS_LONG.substring(0, 32); - dbTester.organizations().insert(o -> o.setKey(key)); + db.organizations().insert(o -> o.setKey(key)); String name = STRING_65_CHARS_LONG.substring(0, 64); expectedException.expect(IllegalArgumentException.class); @@ -589,6 +571,50 @@ public class CreateActionTest { executeJsonRequest("Foo Company", "foo-company", "The Foo company produces quality software for Bar.", "https://www.foo.com", "https://www.foo.com/foo.png"); } + @Test + public void verify_define() { + WebService.Action action = wsTester.getDef(); + assertThat(action.key()).isEqualTo("create"); + assertThat(action.isPost()).isTrue(); + assertThat(action.description()).isEqualTo("Create an organization.<br />" + + "Requires 'Administer System' permission unless any logged in user is allowed to create an organization (see appropriate setting). Organization support must be enabled."); + assertThat(action.isInternal()).isTrue(); + assertThat(action.since()).isEqualTo("6.2"); + assertThat(action.handler()).isNotNull(); + assertThat(action.params()).hasSize(5); + assertThat(action.responseExample()).isEqualTo(getClass().getResource("create-example.json")); + assertThat(action.param("name")) + .matches(WebService.Param::isRequired) + .matches(param -> "Foo Company".equals(param.exampleValue())) + .matches(param -> param.description() != null); + assertThat(action.param("key")) + .matches(param -> !param.isRequired()) + .matches(param -> "foo-company".equals(param.exampleValue())) + .matches(param -> param.description() != null); + assertThat(action.param("description")) + .matches(param -> !param.isRequired()) + .matches(param -> "The Foo company produces quality software for Bar.".equals(param.exampleValue())) + .matches(param -> param.description() != null); + assertThat(action.param("url")) + .matches(param -> !param.isRequired()) + .matches(param -> "https://www.foo.com".equals(param.exampleValue())) + .matches(param -> param.description() != null); + assertThat(action.param("avatar")) + .matches(param -> !param.isRequired()) + .matches(param -> "https://www.foo.com/foo.png".equals(param.exampleValue())) + .matches(param -> param.description() != null); + } + + @Test + public void verify_response_example() { + createUserAndLogInAsSystemAdministrator(); + db.qualityGates().insertBuiltInQualityGate(); + + String response = executeJsonRequest("Foo Company", "foo-company", "The Foo company produces quality software for Bar.", "https://www.foo.com", "https://www.foo.com/foo.png"); + + assertJson(response).isSimilarTo(wsTester.getDef().responseExampleAsString()); + } + private CreateWsResponse executeRequest(@Nullable String name, @Nullable String key) { return executeRequest(name, key, null, null, null); } @@ -644,7 +670,7 @@ public class CreateActionTest { assertThat(organization.getAvatar()).isEqualTo(avatar); } - OrganizationDto dto = dbClient.organizationDao().selectByKey(dbTester.getSession(), key).get(); + OrganizationDto dto = dbClient.organizationDao().selectByKey(db.getSession(), key).get(); assertThat(dto.getUuid()).isNotNull(); assertThat(dto.getKey()).isEqualTo(key); assertThat(dto.getName()).isEqualTo(name); @@ -656,7 +682,7 @@ public class CreateActionTest { } private void createUserAndLogInAsSystemAdministrator() { - UserDto user = dbTester.users().insertUser(); + UserDto user = db.users().insertUser(); userIndexer.indexOnStartup(new HashSet<>()); userSession.logIn(user).setSystemAdministrator(); } 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 74927b7fb91..58a32e01792 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 @@ -49,6 +49,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; 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; @@ -70,77 +73,6 @@ public class SearchActionTest { private WsActionTester ws = new WsActionTester(underTest); @Test - public void definition() { - WebService.Action action = ws.getDef(); - assertThat(action.key()).isEqualTo("search"); - assertThat(action.isPost()).isFalse(); - assertThat(action.description()).isEqualTo("Search for organizations"); - assertThat(action.isInternal()).isTrue(); - assertThat(action.since()).isEqualTo("6.2"); - assertThat(action.handler()).isEqualTo(underTest); - assertThat(action.params()).hasSize(4); - assertThat(action.responseExample()).isEqualTo(getClass().getResource("search-example.json")); - - WebService.Param organizations = action.param("organizations"); - assertThat(organizations.isRequired()).isFalse(); - assertThat(organizations.defaultValue()).isNull(); - assertThat(organizations.description()).isEqualTo("Comma-separated list of organization keys"); - assertThat(organizations.exampleValue()).isEqualTo("my-org-1,foocorp"); - assertThat(organizations.since()).isEqualTo("6.3"); - assertThat(organizations.maxValuesAllowed()).isEqualTo(500); - - WebService.Param page = action.param("p"); - assertThat(page.isRequired()).isFalse(); - assertThat(page.defaultValue()).isEqualTo("1"); - assertThat(page.description()).isEqualTo("1-based page number"); - - WebService.Param pageSize = action.param("ps"); - assertThat(pageSize.isRequired()).isFalse(); - assertThat(pageSize.defaultValue()).isEqualTo("100"); - assertThat(pageSize.maximumValue()).isEqualTo(500); - assertThat(pageSize.description()).isEqualTo("Page size. Must be greater than 0 and less or equal than 500"); - - WebService.Param member = action.param("member"); - assertThat(member.since()).isEqualTo("7.0"); - assertThat(member.defaultValue()).isEqualTo(String.valueOf(false)); - assertThat(member.isRequired()).isFalse(); - } - - @Test - public void json_example() { - when(system2.now()).thenReturn(SOME_DATE, SOME_DATE + 1000); - OrganizationDto barOrganization = db.organizations().insert(organization -> organization - .setUuid(Uuids.UUID_EXAMPLE_02) - .setKey("bar-company") - .setName("Bar Company") - .setDescription("The Bar company produces quality software too.") - .setUrl("https://www.bar.com") - .setAvatarUrl("https://www.bar.com/logo.png") - .setGuarded(false)); - OrganizationDto fooOrganization = db.organizations().insert(organization -> organization - .setUuid(Uuids.UUID_EXAMPLE_01) - .setKey("foo-company") - .setName("Foo Company") - .setDescription(null) - .setUrl(null) - .setAvatarUrl(null) - .setGuarded(true)); - UserDto user = db.users().insertUser(); - db.organizations().addMember(barOrganization, user); - db.organizations().addMember(fooOrganization, user); - db.users().insertPermissionOnUser(barOrganization, user, ADMINISTER); - userSession.logIn(user).addPermission(ADMINISTER, barOrganization); - - TestRequest request = ws.newRequest() - .setMediaType(MediaTypes.JSON); - populateRequest(request, null, 25); - String result = request.execute().getInput(); - - assertJson(ws.getDef().responseExampleAsString()).isSimilarTo(result); - assertJson(result).isSimilarTo(ws.getDef().responseExampleAsString()); - } - - @Test public void is_admin_available_for_each_organization() { OrganizationDto userAdminOrganization = db.organizations().insert(); OrganizationDto groupAdminOrganization = db.organizations().insert(); @@ -161,13 +93,28 @@ public class SearchActionTest { } @Test - public void request_on_empty_db_returns_an_empty_organization_list() { - assertThat(executeRequestAndReturnList(null, null)).isEmpty(); - assertThat(executeRequestAndReturnList(null, 1)).isEmpty(); - assertThat(executeRequestAndReturnList(1, null)).isEmpty(); - assertThat(executeRequestAndReturnList(1, 10)).isEmpty(); - assertThat(executeRequestAndReturnList(2, null)).isEmpty(); - assertThat(executeRequestAndReturnList(2, 1)).isEmpty(); + 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 @@ -292,7 +239,17 @@ public class SearchActionTest { } @Test - public void fail_if_member_is_set_to_true_but_user_is_not_authenticated(){ + public void request_on_empty_db_returns_an_empty_organization_list() { + assertThat(executeRequestAndReturnList(null, null)).isEmpty(); + assertThat(executeRequestAndReturnList(null, 1)).isEmpty(); + assertThat(executeRequestAndReturnList(1, null)).isEmpty(); + assertThat(executeRequestAndReturnList(1, 10)).isEmpty(); + assertThat(executeRequestAndReturnList(2, null)).isEmpty(); + assertThat(executeRequestAndReturnList(2, 1)).isEmpty(); + } + + @Test + public void fail_if_member_is_set_to_true_but_user_is_not_authenticated() { UserDto user = db.users().insertUser(); OrganizationDto organization = db.organizations().insert(); db.organizations().addMember(organization, user); @@ -305,6 +262,78 @@ public class SearchActionTest { call(ws.newRequest().setParam(PARAM_MEMBER, String.valueOf(true))); } + @Test + public void definition() { + WebService.Action action = ws.getDef(); + assertThat(action.key()).isEqualTo("search"); + assertThat(action.isPost()).isFalse(); + assertThat(action.description()).isEqualTo("Search for organizations"); + assertThat(action.isInternal()).isTrue(); + assertThat(action.since()).isEqualTo("6.2"); + assertThat(action.handler()).isEqualTo(underTest); + assertThat(action.params()).hasSize(4); + assertThat(action.responseExample()).isEqualTo(getClass().getResource("search-example.json")); + + WebService.Param organizations = action.param("organizations"); + assertThat(organizations.isRequired()).isFalse(); + assertThat(organizations.defaultValue()).isNull(); + assertThat(organizations.description()).isEqualTo("Comma-separated list of organization keys"); + assertThat(organizations.exampleValue()).isEqualTo("my-org-1,foocorp"); + assertThat(organizations.since()).isEqualTo("6.3"); + assertThat(organizations.maxValuesAllowed()).isEqualTo(500); + + WebService.Param page = action.param("p"); + assertThat(page.isRequired()).isFalse(); + assertThat(page.defaultValue()).isEqualTo("1"); + assertThat(page.description()).isEqualTo("1-based page number"); + + WebService.Param pageSize = action.param("ps"); + assertThat(pageSize.isRequired()).isFalse(); + assertThat(pageSize.defaultValue()).isEqualTo("100"); + assertThat(pageSize.maximumValue()).isEqualTo(500); + assertThat(pageSize.description()).isEqualTo("Page size. Must be greater than 0 and less or equal than 500"); + + WebService.Param member = action.param("member"); + assertThat(member.since()).isEqualTo("7.0"); + assertThat(member.defaultValue()).isEqualTo(String.valueOf(false)); + assertThat(member.isRequired()).isFalse(); + } + + @Test + public void json_example() { + when(system2.now()).thenReturn(SOME_DATE, SOME_DATE + 1000); + OrganizationDto barOrganization = db.organizations().insert(organization -> organization + .setUuid(Uuids.UUID_EXAMPLE_02) + .setKey("bar-company") + .setName("Bar Company") + .setDescription("The Bar company produces quality software too.") + .setUrl("https://www.bar.com") + .setAvatarUrl("https://www.bar.com/logo.png") + .setSubscription(PAID) + .setGuarded(false)); + OrganizationDto fooOrganization = db.organizations().insert(organization -> organization + .setUuid(Uuids.UUID_EXAMPLE_01) + .setKey("foo-company") + .setName("Foo Company") + .setSubscription(FREE) + .setDescription(null) + .setUrl(null) + .setAvatarUrl(null) + .setGuarded(true)); + UserDto user = db.users().insertUser(); + db.organizations().addMember(barOrganization, user); + db.organizations().addMember(fooOrganization, user); + db.users().insertPermissionOnUser(barOrganization, user, ADMINISTER); + userSession.logIn(user).addPermission(ADMINISTER, barOrganization); + + TestRequest request = ws.newRequest() + .setMediaType(MediaTypes.JSON); + populateRequest(request, null, 25); + String result = request.execute().getInput(); + + assertJson(ws.getDef().responseExampleAsString()).isSimilarTo(result); + assertJson(result).isSimilarTo(ws.getDef().responseExampleAsString()); + } private List<Organization> executeRequestAndReturnList(@Nullable Integer page, @Nullable Integer pageSize, String... keys) { return call(page, pageSize, keys).getOrganizationsList(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/ws/HashActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/ws/HashActionTest.java index 53f81f66d1f..0ac709a25b4 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/source/ws/HashActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/source/ws/HashActionTest.java @@ -19,33 +19,31 @@ */ package org.sonar.server.source.ws; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.runners.MockitoJUnitRunner; import org.sonar.api.utils.System2; -import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; +import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.protobuf.DbFileSources; +import org.sonar.db.source.FileSourceDto; import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; -import org.sonar.server.ws.WsTester; +import org.sonar.server.ws.TestRequest; +import org.sonar.server.ws.WsActionTester; import static java.lang.String.format; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; - -@RunWith(MockitoJUnitRunner.class) +import static org.sonar.api.resources.Qualifiers.UNIT_TEST_FILE; +import static org.sonar.api.web.UserRole.USER; +import static org.sonar.db.component.ComponentTesting.newFileDto; public class HashActionTest { - final static String COMPONENT_KEY = "Action.java"; - final static String PROJECT_UUID = "ABCD"; - @Rule public ExpectedException expectedException = ExpectedException.none(); @Rule @@ -53,76 +51,80 @@ public class HashActionTest { @Rule public UserSessionRule userSessionRule = UserSessionRule.standalone(); - WsTester tester; - - @Before - public void before() { - DbClient dbClient = db.getDbClient(); - - tester = new WsTester(new SourcesWs(new HashAction(dbClient, userSessionRule, TestComponentFinder.from(db)))); - } + private WsActionTester tester = new WsActionTester(new HashAction(db.getDbClient(), userSessionRule, TestComponentFinder.from(db))); @Test - public void show_hashes() throws Exception { - db.prepareDbUnit(getClass(), "shared.xml"); - loginAndRegisterComponent(PROJECT_UUID); + public void show_hashes() { + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organizationDto); + ComponentDto file = db.components().insertComponent(newFileDto(project)); + FileSourceDto fileSource = db.fileSources().insertFileSource(file, f -> f.setLineHashes(singletonList("ABC"))); + loginAsProjectViewer(project); + + TestRequest request = tester.newRequest().setParam("key", file.getDbKey()); - WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY); - assertThat(request.execute().outputAsString()).isEqualTo("987654"); + assertThat(request.execute().getInput()).isEqualTo("ABC"); } @Test - public void show_hashes_on_test_file() throws Exception { - db.prepareDbUnit(getClass(), "show_hashes_on_test_file.xml"); - loginAndRegisterComponent(PROJECT_UUID); + public void show_hashes_on_test_file() { + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organizationDto); + ComponentDto test = db.components().insertComponent(newFileDto(project).setQualifier(UNIT_TEST_FILE)); + FileSourceDto fileSource = db.fileSources().insertFileSource(test, f -> f.setLineHashes(singletonList("ABC"))); + FileSourceDto fileTest = db.fileSources().insertFileSource(test, f -> f.setTestData(singletonList(DbFileSources.Test.newBuilder().build()))); + loginAsProjectViewer(project); - WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", "ActionTest.java"); - assertThat(request.execute().outputAsString()).isEqualTo("987654"); + TestRequest request = tester.newRequest().setParam("key", test.getKey()); + + assertThat(request.execute().getInput()).isEqualTo("ABC"); } @Test - public void hashes_empty_if_no_source() throws Exception { - db.prepareDbUnit(getClass(), "no_source.xml"); - loginAndRegisterComponent(PROJECT_UUID); + public void hashes_empty_if_no_source() { + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organizationDto); + ComponentDto file = db.components().insertComponent(newFileDto(project)); + loginAsProjectViewer(project); + + TestRequest request = tester.newRequest().setParam("key", file.getKey()); - WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY); - request.execute().assertNoContent(); + assertThat(request.execute().getStatus()).isEqualTo(204); } @Test public void fail_to_show_hashes_if_file_does_not_exist() { - try { - WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY); - request.execute(); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class); - } + expectedException.expect(NotFoundException.class); + + tester.newRequest().setParam("key", "unknown").execute(); } @Test - public void fail_when_using_branch_db_key() throws Exception { + public void fail_when_using_branch_db_key() { ComponentDto project = db.components().insertMainBranch(); ComponentDto branch = db.components().insertProjectBranch(project); - loginAndRegisterComponent(project.uuid()); + loginAsProjectViewer(project); expectedException.expect(NotFoundException.class); expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); - tester.newGetRequest("api/sources", "hash") - .setParam("key", branch.getDbKey()) - .execute(); + tester.newRequest().setParam("key", branch.getDbKey()).execute(); } - @Test(expected = ForbiddenException.class) - public void fail_on_missing_permission() throws Exception { - db.prepareDbUnit(getClass(), "shared.xml"); + @Test + public void fail_on_missing_permission() { + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project = db.components().insertPrivateProject(organizationDto); + ComponentDto file = db.components().insertComponent(newFileDto(project)); + FileSourceDto fileSource = db.fileSources().insertFileSource(file); + userSessionRule.logIn(db.users().insertUser()); + + expectedException.expect(ForbiddenException.class); - userSessionRule.logIn("polop"); - tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY).execute(); + tester.newRequest().setParam("key", file.getKey()).execute(); } - private void loginAndRegisterComponent(String componentUuid) { - userSessionRule.logIn("polop").registerComponents(db.getDbClient().componentDao().selectByUuid(db.getSession(), componentUuid).get()); + private void loginAsProjectViewer(ComponentDto project) { + userSessionRule.logIn(db.users().insertUser()).addProjectPermission(USER, project); } } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates-result.xml deleted file mode 100644 index fd63bdedb23..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates-result.xml +++ /dev/null @@ -1,50 +0,0 @@ -<dataset> - <rules tags="[null]" - system_tags="[null]" - id="200" - name="Avoid Cycles" - plugin_rule_key="AvoidCycles" - plugin_config_key="[null]" - plugin_name="squid"/> - - <projects organization_uuid="org1" - id="10" - scope="PRJ" - qualifier="TRK" - kee="struts" - name="Struts"/> - <projects organization_uuid="org1" - id="100" - scope="FIL" - qualifier="CLA" - kee="struts:Action" - name="Action"/> - - <issues id="1" - kee="ABCDE" - resolution="FIXED" - status="RESOLVED" - severity="BLOCKER" - manual_severity="[false]" - assignee="winner" - author_login="[null]" - checksum="FFFFF" - gap="[null]" - effort="[null]" - message="[null]" - line="444" - component_uuid="uuid-100" - project_uuid="uuid-10" - rule_id="200" - reporter="[null]" - issue_attributes="JIRA=http://jira.com" - action_plan_key="[null]" - created_at="2005-05-12" - updated_at="2013-05-18" - issue_creation_date="1115848800000" - issue_update_date="1368828000000" - issue_close_date="[null]" - locations="[null]" - issue_type="2" - /> -</dataset> diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates.xml deleted file mode 100644 index 45b45edb65a..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates.xml +++ /dev/null @@ -1,52 +0,0 @@ -<dataset> - - <rules tags="[null]" - system_tags="[null]" - id="200" - name="Avoid Cycles" - plugin_rule_key="AvoidCycles" - plugin_config_key="[null]" - plugin_name="squid"/> - - <projects organization_uuid="org1" - id="10" - scope="PRJ" - qualifier="TRK" - kee="struts" - name="Struts"/> - <projects organization_uuid="org1" - id="100" - scope="FIL" - qualifier="CLA" - kee="struts:Action" - name="Action"/> - - - <issues id="1" - kee="ABCDE" - assignee="winner" - resolution="FIXED" - status="RESOLVED" - severity="MAJOR" - manual_severity="[false]" - author_login="[null]" - checksum="FFFFF" - gap="[null]" - effort="[null]" - message="[null]" - line="1" - component_uuid="uuid-100" - project_uuid="uuid-10" - rule_id="200" - reporter="[null]" - issue_attributes="" - action_plan_key="[null]" - created_at="2005-05-12" - updated_at="2013-05-18" - issue_creation_date="1115848800000" - issue_update_date="1368878400000" - issue_close_date="[null]" - locations="[null]" - issue_type="2" - /> -</dataset> diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/no_source.xml b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/no_source.xml deleted file mode 100644 index cbb59f48c18..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/no_source.xml +++ /dev/null @@ -1,39 +0,0 @@ -<dataset> - - <organizations uuid="org1" - kee="org1_key" - name="org1_name" - guarded="[false]" - new_project_private="[false]" - default_quality_gate_uuid="1" - created_at="1000" - updated_at="2000"/> - - <projects organization_uuid="org1" - uuid="ABCD" - uuid_path="NOT_USED" - project_uuid="ABCD" - module_uuid="[null]" - module_uuid_path="." - path="[null]" - id="100" - kee="struts" - root_uuid="ABCD" - qualifier="TRK" - scope="PRJ" - private="[false]"/> - <projects organization_uuid="org1" - uuid="CDEF" - uuid_path="NOT_USED" - project_uuid="ABCD" - module_uuid="ABCD" - module_uuid_path=".ABCD." - path="src/main/java/Action.java" - id="101" - kee="Action.java" - root_uuid="ABCD" - qualifier="CLA" - scope="PRJ" - private="[false]"/> - -</dataset> diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml deleted file mode 100644 index ae19ab0df34..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml +++ /dev/null @@ -1,51 +0,0 @@ -<dataset> - - <organizations uuid="org1" - kee="org1_key" - name="org1_name" - guarded="[false]" - new_project_private="[false]" - default_quality_gate_uuid="1" - created_at="1000" - updated_at="2000"/> - - <projects organization_uuid="org1" - uuid="ABCD" - uuid_path="NOT_USED" - project_uuid="ABCD" - module_uuid="[null]" - module_uuid_path="." - path="[null]" - id="100" - kee="struts" - root_uuid="ABCD" - qualifier="TRK" - scope="PRJ" - private="[false]"/> - <projects organization_uuid="org1" - uuid="CDEF" - uuid_path="NOT_USED" - project_uuid="ABCD" - module_uuid="ABCD" - module_uuid_path=".ABCD." - path="src/main/java/Action.java" - id="101" - kee="Action.java" - root_uuid="ABCD" - qualifier="CLA" - scope="PRJ" - private="[false]"/> - - <file_sources id="101" - project_uuid="ABCD" - file_uuid="CDEF" - binary_data="" - data_hash="hash" - line_count="1" - line_hashes="987654" - src_hash="12345" - created_at="1414597442000" - updated_at="1414683842000" - data_type="SOURCE"/> - -</dataset> diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml deleted file mode 100644 index dd0619767d5..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml +++ /dev/null @@ -1,64 +0,0 @@ -<dataset> - - <organizations uuid="org1" - kee="org1_key" - name="org1_name" - guarded="[false]" - new_project_private="[false]" - default_quality_gate_uuid="1" - created_at="1000" - updated_at="2000"/> - - <projects organization_uuid="org1" - uuid="ABCD" - uuid_path="NOT_USED" - project_uuid="ABCD" - module_uuid="[null]" - module_uuid_path="." - path="[null]" - id="100" - kee="struts" - root_uuid="ABCD" - qualifier="TRK" - scope="PRJ" - private="[false]"/> - <projects organization_uuid="org1" - uuid="CDEF" - uuid_path="NOT_USED" - project_uuid="ABCD" - module_uuid="ABCD" - module_uuid_path=".ABCD." - path="src/test/java/ActionTest.java" - id="101" - kee="ActionTest.java" - root_uuid="ABCD" - qualifier="CLA" - scope="PRJ" - private="[false]"/> - - <file_sources id="100" - project_uuid="ABCD" - file_uuid="CDEF" - binary_data="" - data_hash="[null]" - line_count="0" - line_hashes="[null]" - src_hash="[null]" - created_at="1414597442000" - updated_at="1414683842000" - data_type="TEST"/> - - <file_sources id="101" - project_uuid="ABCD" - file_uuid="CDEF" - binary_data="" - data_hash="hash" - line_count="1" - line_hashes="987654" - src_hash="12345" - created_at="1414597442000" - updated_at="1414683842000" - data_type="SOURCE"/> - - -</dataset> |