aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2018-07-02 15:53:14 +0200
committerSonarTech <sonartech@sonarsource.com>2018-07-11 20:21:21 +0200
commit6c7e6840822b0f4a8b65187f63dce4b55c2427f6 (patch)
treeeb333e730a1bf43485283c59aac119cee9257e91 /server/sonar-server
parentebec2ca4ce7efbf2ece496683f6c1e7c0cbce727 (diff)
downloadsonarqube-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')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/organization/ws/OrganizationsWsSupport.java3
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/organization/ws/SearchAction.java3
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/organization/ws/create-example.json3
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/organization/ws/search-example.json6
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java109
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java192
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java362
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java187
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/source/ws/HashActionTest.java108
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates-result.xml50
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_resolve_conflicts_on_updates.xml52
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/no_source.xml39
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/shared.xml51
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/source/ws/HashActionTest/show_hashes_on_test_file.xml64
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>