diff options
23 files changed, 731 insertions, 693 deletions
diff --git a/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java b/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java index 9b969f78e6f..83b3e813961 100644 --- a/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java +++ b/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java @@ -40,6 +40,9 @@ import static util.ItUtils.projectDir; */ public class SearchProjectsTest { + private static final String PROJECT_KEY = "sample"; + private static final String PROJECT_NAME = "Sample"; + @ClassRule public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR; @@ -59,11 +62,11 @@ public class SearchProjectsTest { @Test public void provisioned_projects_should_be_included_to_results() throws Exception { - orchestrator.getServer().provisionProject("sample", "sample"); + orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_NAME); SearchProjectsWsResponse response = searchProjects(SearchProjectsRequest.builder().build()); - assertThat(response.getComponentsList()).extracting(Component::getKey).containsOnly("sample"); + assertThat(response.getComponentsList()).extracting(Component::getKey).containsOnly(PROJECT_KEY); } @@ -76,7 +79,7 @@ public class SearchProjectsTest { } private void verifyFilterMatches(String filter) throws IOException { - assertThat(searchProjects(filter).getComponentsList()).extracting(Component::getKey).containsOnly("sample"); + assertThat(searchProjects(filter).getComponentsList()).extracting(Component::getKey).containsOnly(PROJECT_KEY); } private void verifyFilterDoesNotMatch(String filter) throws IOException { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStep.java index 59b51674be1..090de268077 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStep.java @@ -29,7 +29,7 @@ public class IndexAnalysisStep implements ComputationStep { private final TreeRootHolder treeRootHolder; private final ProjectIndexer[] indexers; - public IndexAnalysisStep(TreeRootHolder treeRootHolder, ProjectIndexer[] indexers) { + public IndexAnalysisStep(TreeRootHolder treeRootHolder, ProjectIndexer... indexers) { this.treeRootHolder = treeRootHolder; this.indexers = indexers; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java b/server/sonar-server/src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java index 73fd9863866..02676cfe2f3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java @@ -21,12 +21,12 @@ package org.sonar.server.permission.index; import com.google.common.collect.ImmutableMap; import java.util.Optional; -import java.util.Set; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.server.ServerSide; +import org.sonar.db.user.GroupDto; import org.sonar.server.es.NewIndex; import org.sonar.server.user.UserSession; @@ -39,7 +39,6 @@ public class AuthorizationTypeSupport { public static final String TYPE_AUTHORIZATION = "authorization"; public static final String FIELD_GROUP_IDS = "groupIds"; - public static final String FIELD_GROUP_NAMES = "groupNames"; public static final String FIELD_USER_IDS = "userIds"; public static final String FIELD_UPDATED_AT = "updatedAt"; @@ -75,7 +74,6 @@ public class AuthorizationTypeSupport { authType.setAttribute("_routing", ImmutableMap.of("required", true)); authType.createDateTimeField(FIELD_UPDATED_AT); authType.createLongField(FIELD_GROUP_IDS); - authType.stringFieldBuilder(FIELD_GROUP_NAMES).disableNorms().build(); authType.createLongField(FIELD_USER_IDS); authType.createBooleanField(FIELD_ALLOW_ANYONE); authType.setEnableSource(false); @@ -88,7 +86,6 @@ public class AuthorizationTypeSupport { */ public QueryBuilder createQueryFilter() { Integer userId = userSession.getUserId(); - Set<String> userGroupNames = userSession.getUserGroups(); BoolQueryBuilder filter = boolQuery(); // anyone @@ -100,8 +97,10 @@ public class AuthorizationTypeSupport { .ifPresent(id -> filter.should(termQuery(FIELD_USER_IDS, id))); // groups - userGroupNames.forEach( - group -> filter.should(termQuery(FIELD_GROUP_NAMES, group))); + userSession.getGroups() + .stream() + .map(GroupDto::getId) + .forEach(groupId -> filter.should(termQuery(FIELD_GROUP_IDS, groupId))); return QueryBuilders.hasParentQuery(TYPE_AUTHORIZATION, QueryBuilders.boolQuery().filter(filter)); diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java index fbf8628d64b..70d75733e0c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java @@ -24,7 +24,6 @@ import com.google.common.base.Throwables; import com.google.common.util.concurrent.Uninterruptibles; import java.util.Arrays; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -37,6 +36,7 @@ import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchResponse; import org.picocontainer.Startable; +import org.sonar.api.utils.DateUtils; import org.sonar.core.util.stream.Collectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; @@ -68,7 +68,7 @@ public class PermissionIndexer implements ProjectIndexer, Startable { private final EsClient esClient; private final Collection<AuthorizationScope> authorizationScopes; - public PermissionIndexer(DbClient dbClient, EsClient esClient, NeedAuthorizationIndexer[] needAuthorizationIndexers) { + public PermissionIndexer(DbClient dbClient, EsClient esClient, NeedAuthorizationIndexer... needAuthorizationIndexers) { this(dbClient, esClient, Arrays.stream(needAuthorizationIndexers) .map(NeedAuthorizationIndexer::getAuthorizationScope) .collect(Collectors.toList(needAuthorizationIndexers.length))); @@ -175,15 +175,14 @@ public class PermissionIndexer implements ProjectIndexer, Startable { private static IndexRequest newIndexRequest(PermissionIndexerDao.Dto dto, String indexName) { Map<String, Object> doc = new HashMap<>(); - doc.put(AuthorizationTypeSupport.FIELD_UPDATED_AT, new Date(dto.getUpdatedAt())); + doc.put(AuthorizationTypeSupport.FIELD_UPDATED_AT, DateUtils.longToDate(dto.getUpdatedAt())); if (dto.isAllowAnyone()) { doc.put(AuthorizationTypeSupport.FIELD_ALLOW_ANYONE, true); // no need to feed users and groups } else { doc.put(AuthorizationTypeSupport.FIELD_ALLOW_ANYONE, false); doc.put(AuthorizationTypeSupport.FIELD_GROUP_IDS, dto.getGroupIds()); - doc.put(AuthorizationTypeSupport.FIELD_GROUP_NAMES, dto.getGroupNames()); - doc.put(AuthorizationTypeSupport.FIELD_USER_IDS, dto.getUsers()); + doc.put(AuthorizationTypeSupport.FIELD_USER_IDS, dto.getUserIds()); } return new IndexRequest(indexName, TYPE_AUTHORIZATION, dto.getProjectUuid()) .routing(dto.getProjectUuid()) diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java b/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java index f6c41816fa2..483caa18753 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java @@ -44,8 +44,7 @@ public class PermissionIndexerDao { private final String projectUuid; private final long updatedAt; private final String qualifier; - private final List<Long> users = new ArrayList<>(); - private final List<String> groupNames = new ArrayList<>(); + private final List<Long> userIds = new ArrayList<>(); private final List<Long> groupIds = new ArrayList<>(); private boolean allowAnyone = false; @@ -67,24 +66,15 @@ public class PermissionIndexerDao { return qualifier; } - public List<Long> getUsers() { - return users; + public List<Long> getUserIds() { + return userIds; } - public Dto addUser(Long s) { - users.add(s); + public Dto addUserId(long l) { + userIds.add(l); return this; } - public Dto addGroupName(String s) { - groupNames.add(s); - return this; - } - - public List<String> getGroupNames() { - return groupNames; - } - public Dto addGroupId(long id) { groupIds.add(id); return this; @@ -116,7 +106,6 @@ public class PermissionIndexerDao { " project_authorization.kind as kind, " + " project_authorization.project as project, " + " project_authorization.user_id as user_id, " + - " project_authorization.group_name as group_name, " + " project_authorization.group_id as group_id, " + " project_authorization.updated_at as updated_at, " + " project_authorization.qualifier as qualifier " + @@ -129,7 +118,6 @@ public class PermissionIndexerDao { " projects.authorization_updated_at AS updated_at, " + " projects.qualifier AS qualifier, " + " user_roles.user_id AS user_id, " + - " NULL AS group_name, " + " NULL AS group_id " + " FROM projects " + " INNER JOIN user_roles ON user_roles.resource_id = projects.id AND user_roles.role = 'user' " + @@ -146,7 +134,6 @@ public class PermissionIndexerDao { " projects.authorization_updated_at AS updated_at, " + " projects.qualifier AS qualifier, " + " NULL AS user_id, " + - " groups.name AS group_name, " + " groups.id AS group_id " + " FROM projects " + " INNER JOIN group_roles ON group_roles.resource_id = projects.id AND group_roles.role = 'user' " + @@ -165,7 +152,6 @@ public class PermissionIndexerDao { " projects.authorization_updated_at AS updated_at, " + " projects.qualifier AS qualifier, " + " NULL AS user_id, " + - " NULL AS group_name, " + " NULL AS group_id " + " FROM projects " + " INNER JOIN group_roles ON group_roles.resource_id = projects.id AND group_roles.role='user' " + @@ -229,18 +215,17 @@ public class PermissionIndexerDao { Dto dto = dtosByProjectUuid.get(projectUuid); if (dto == null) { - long updatedAt = rs.getLong(6); - String qualifier = rs.getString(7); + long updatedAt = rs.getLong(5); + String qualifier = rs.getString(6); dto = new Dto(projectUuid, updatedAt, qualifier); dtosByProjectUuid.put(projectUuid, dto); } switch (rowKind) { case USER: - dto.addUser(rs.getLong(3)); + dto.addUserId(rs.getLong(3)); break; case GROUP: - dto.addGroupName(rs.getString(4)); - dto.addGroupId(rs.getLong(5)); + dto.addGroupId(rs.getLong(4)); break; case ANYONE: dto.allowAnyone(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java index 96b0bbe08f8..b7087ef9e90 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java @@ -21,14 +21,12 @@ package org.sonar.server.batch; import java.io.ByteArrayInputStream; import java.util.Arrays; -import javax.annotation.Nullable; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.config.MapSettings; import org.sonar.api.resources.Qualifiers; -import org.sonar.api.security.DefaultGroups; import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.db.DbTester; @@ -321,18 +319,13 @@ public class IssuesActionTest { private void indexIssues(IssueDoc... issues) { issueIndexer.index(Arrays.asList(issues).iterator()); for (IssueDoc issue : issues) { - addIssueAuthorization(issue.projectUuid(), DefaultGroups.ANYONE, null); + addIssueAuthorization(issue.projectUuid()); } } - private void addIssueAuthorization(String projectUuid, @Nullable String group, @Nullable Long user) { + private void addIssueAuthorization(String projectUuid) { PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(projectUuid, system2.now(), Qualifiers.PROJECT); - if (group != null) { - access.addGroupName(group); - } - if (user != null) { - access.addUser(user); - } + access.allowAnyone(); authorizationIndexerTester.allow(access); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexLoginTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexLoginTest.java index 0263b7b56a6..c9a6c9f8f66 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexLoginTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexLoginTest.java @@ -21,11 +21,16 @@ package org.sonar.server.component.index; import org.junit.Test; import org.sonar.db.component.ComponentDto; +import org.sonar.db.user.GroupDto; +import org.sonar.db.user.UserDto; + +import static org.sonar.db.user.GroupTesting.newGroupDto; +import static org.sonar.db.user.UserTesting.newUserDto; public class ComponentIndexLoginTest extends ComponentIndexTest { @Test - public void should_respect_confidentiallity() { + public void should_filter_unauthorized_results() { indexer.index(newProject("sonarqube", "Quality Product")); // do not give any permissions to that project @@ -36,31 +41,31 @@ public class ComponentIndexLoginTest extends ComponentIndexTest { @Test public void should_find_project_for_which_the_user_has_direct_permission() { - login(); + UserDto user = newUserDto(); + userSession.login(user); ComponentDto project = newProject("sonarqube", "Quality Product"); indexer.index(project); - // give the user explicit access - authorizationIndexerTester.allowOnlyUser(project, TEST_USER_ID); + assertNoSearchResults("sonarqube"); + // give the user explicit access + authorizationIndexerTester.allowOnlyUser(project, user); assertSearchResults("sonarqube", project); } @Test public void should_find_project_for_which_the_user_has_indirect_permission_through_group() { - login(); + GroupDto group = newGroupDto(); + userSession.login().setGroups(group); ComponentDto project = newProject("sonarqube", "Quality Product"); indexer.index(project); - // give the user implicit access (though group) - authorizationIndexerTester.allowOnlyGroup(project, TEST_USER_GROUP); + assertNoSearchResults("sonarqube"); + // give the user implicit access (though group) + authorizationIndexerTester.allowOnlyGroup(project, group); assertSearchResults("sonarqube", project); } - - protected void login() { - userSession.login("john").setUserId(TEST_USER_ID).setUserGroups(TEST_USER_GROUP); - } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java index 2ee73d61a59..a83c6ec35ca 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java @@ -46,9 +46,6 @@ import static org.sonar.api.resources.Qualifiers.PROJECT; public abstract class ComponentIndexTest { - protected static final Integer TEST_USER_ID = 42; - protected static final String TEST_USER_GROUP = "TestUsers"; - @Rule public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings())); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStepTest.java index 1b74fc8a0a9..0ba86fbce06 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/IndexAnalysisStepTest.java @@ -45,7 +45,7 @@ public class IndexAnalysisStepTest extends BaseStepTest { public BatchReportReaderRule reportReader = new BatchReportReaderRule(); private ProjectIndexer componentIndexer = mock(ProjectIndexer.class); - private IndexAnalysisStep underTest = new IndexAnalysisStep(treeRootHolder, new ProjectIndexer[] {componentIndexer}); + private IndexAnalysisStep underTest = new IndexAnalysisStep(treeRootHolder, componentIndexer); @Test public void call_indexByProjectUuid_of_indexer_for_project() { diff --git a/server/sonar-server/src/test/java/org/sonar/server/es/EsTester.java b/server/sonar-server/src/test/java/org/sonar/server/es/EsTester.java index d87bd60caa4..895747c42e2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/es/EsTester.java +++ b/server/sonar-server/src/test/java/org/sonar/server/es/EsTester.java @@ -91,15 +91,19 @@ public class EsTester extends ExternalResource { client.nativeClient().admin().indices().prepareDelete("_all").get(); } - public void putDocuments(String index, String type, BaseDoc... docs) throws Exception { - BulkRequestBuilder bulk = client.prepareBulk().setRefresh(true); - for (BaseDoc doc : docs) { - bulk.add(new IndexRequest(index, type, doc.getId()) - .parent(doc.getParent()) - .routing(doc.getRouting()) - .source(doc.getFields())); + public void putDocuments(String index, String type, BaseDoc... docs) { + try { + BulkRequestBuilder bulk = client.prepareBulk().setRefresh(true); + for (BaseDoc doc : docs) { + bulk.add(new IndexRequest(index, type, doc.getId()) + .parent(doc.getParent()) + .routing(doc.getRouting()) + .source(doc.getFields())); + } + EsUtils.executeBulkRequest(bulk, ""); + } catch (Exception e) { + throw Throwables.propagate(e); } - EsUtils.executeBulkRequest(bulk, ""); } public long countDocuments(String indexName, String typeName) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexDebtTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexDebtTest.java index e841d468293..7c12fc5388b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexDebtTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexDebtTest.java @@ -21,7 +21,6 @@ package org.sonar.server.issue.index; import java.util.Map; import java.util.TimeZone; -import javax.annotation.Nullable; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -30,7 +29,6 @@ import org.sonar.api.issue.Issue; import org.sonar.api.resources.Qualifiers; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.Severity; -import org.sonar.api.security.DefaultGroups; import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.System2; import org.sonar.db.component.ComponentDto; @@ -283,18 +281,13 @@ public class IssueIndexDebtTest { private void indexIssues(IssueDoc... issues) { issueIndexer.index(asList(issues).iterator()); for (IssueDoc issue : issues) { - addIssueAuthorization(issue.projectUuid(), DefaultGroups.ANYONE, null); + addIssueAuthorization(issue.projectUuid()); } } - private void addIssueAuthorization(String projectUuid, @Nullable String group, @Nullable Long user) { + private void addIssueAuthorization(String projectUuid) { PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(projectUuid, system2.now(), Qualifiers.PROJECT); - if (group != null) { - access.addGroupName(group); - } - if (user != null) { - access.addUser(user); - } + access.allowAnyone(); authorizationIndexerTester.allow(access); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java index 70880468c10..ded89941a5d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java @@ -43,6 +43,8 @@ import org.sonar.api.utils.System2; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.user.GroupDto; +import org.sonar.db.user.UserDto; import org.sonar.server.es.EsTester; import org.sonar.server.es.SearchOptions; import org.sonar.server.es.SearchResult; @@ -64,7 +66,11 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.api.utils.DateUtils.parseDate; import static org.sonar.api.utils.DateUtils.parseDateTime; +import static org.sonar.db.component.ComponentTesting.newFileDto; +import static org.sonar.db.component.ComponentTesting.newProjectDto; import static org.sonar.db.organization.OrganizationTesting.newOrganizationDto; +import static org.sonar.db.user.GroupTesting.newGroupDto; +import static org.sonar.db.user.UserTesting.newUserDto; public class IssueIndexTest { @@ -94,8 +100,8 @@ public class IssueIndexTest { @Test public void get_by_key() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); IssueDoc issue = IssueDocTesting.newDoc("ISSUE1", file) .setEffort(100L); indexIssues(issue); @@ -114,8 +120,8 @@ public class IssueIndexTest { @Test public void get_by_key_with_attributes() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); IssueDoc issue = IssueDocTesting.newDoc("ISSUE1", file).setAttributes((KeyValueFormat.format(ImmutableMap.of("jira-issue-key", "SONAR-1234")))); indexIssues(issue); @@ -125,8 +131,8 @@ public class IssueIndexTest { @Test(expected = IllegalStateException.class) public void comments_field_is_not_available() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); IssueDoc issue = IssueDocTesting.newDoc("ISSUE1", file); indexIssues(issue); @@ -136,8 +142,8 @@ public class IssueIndexTest { @Test(expected = IllegalStateException.class) public void is_new_field_is_not_available() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); IssueDoc issue = IssueDocTesting.newDoc("ISSUE1", file); indexIssues(issue); @@ -147,11 +153,11 @@ public class IssueIndexTest { @Test public void filter_by_keys() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); + ComponentDto project = newProjectDto(newOrganizationDto()); indexIssues( - IssueDocTesting.newDoc("1", ComponentTesting.newFileDto(project, null)), - IssueDocTesting.newDoc("2", ComponentTesting.newFileDto(project, null))); + IssueDocTesting.newDoc("1", newFileDto(project, null)), + IssueDocTesting.newDoc("2", newFileDto(project, null))); assertThat(underTest.search(IssueQuery.builder().issueKeys(newArrayList("1", "2")).build(), new SearchOptions()).getDocs()).hasSize(2); assertThat(underTest.search(IssueQuery.builder().issueKeys(newArrayList("1")).build(), new SearchOptions()).getDocs()).hasSize(1); @@ -160,17 +166,17 @@ public class IssueIndexTest { @Test public void filter_by_projects() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); + ComponentDto project = newProjectDto(newOrganizationDto()); ComponentDto module = ComponentTesting.newModuleDto(project); ComponentDto subModule = ComponentTesting.newModuleDto(module); indexIssues( IssueDocTesting.newDoc("ISSUE1", project), - IssueDocTesting.newDoc("ISSUE2", ComponentTesting.newFileDto(project, null)), + IssueDocTesting.newDoc("ISSUE2", newFileDto(project, null)), IssueDocTesting.newDoc("ISSUE3", module), - IssueDocTesting.newDoc("ISSUE4", ComponentTesting.newFileDto(module, null)), + IssueDocTesting.newDoc("ISSUE4", newFileDto(module, null)), IssueDocTesting.newDoc("ISSUE5", subModule), - IssueDocTesting.newDoc("ISSUE6", ComponentTesting.newFileDto(subModule, null))); + IssueDocTesting.newDoc("ISSUE6", newFileDto(subModule, null))); assertThat(underTest.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs()).hasSize(6); assertThat(underTest.search(IssueQuery.builder().projectUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty(); @@ -179,13 +185,13 @@ public class IssueIndexTest { @Test public void facets_on_projects() { OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project = ComponentTesting.newProjectDto(organizationDto, "ABCD"); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto, "EFGH"); + ComponentDto project = newProjectDto(organizationDto, "ABCD"); + ComponentDto project2 = newProjectDto(organizationDto, "EFGH"); indexIssues( - IssueDocTesting.newDoc("ISSUE1", ComponentTesting.newFileDto(project, null)), - IssueDocTesting.newDoc("ISSUE2", ComponentTesting.newFileDto(project, null)), - IssueDocTesting.newDoc("ISSUE3", ComponentTesting.newFileDto(project2, null))); + IssueDocTesting.newDoc("ISSUE1", newFileDto(project, null)), + IssueDocTesting.newDoc("ISSUE2", newFileDto(project, null)), + IssueDocTesting.newDoc("ISSUE3", newFileDto(project2, null))); SearchResult<IssueDoc> result = underTest.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("projectUuids"))); assertThat(result.getFacets().getNames()).containsOnly("projectUuids"); @@ -194,10 +200,10 @@ public class IssueIndexTest { @Test public void filter_by_modules() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); + ComponentDto project = newProjectDto(newOrganizationDto()); ComponentDto module = ComponentTesting.newModuleDto(project); ComponentDto subModule = ComponentTesting.newModuleDto(module); - ComponentDto file = ComponentTesting.newFileDto(subModule, null); + ComponentDto file = newFileDto(subModule, null); indexIssues( IssueDocTesting.newDoc("ISSUE3", module), @@ -227,12 +233,12 @@ public class IssueIndexTest { @Test public void filter_by_components_on_contextualized_search() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); + ComponentDto project = newProjectDto(newOrganizationDto()); ComponentDto module = ComponentTesting.newModuleDto(project); ComponentDto subModule = ComponentTesting.newModuleDto(module); - ComponentDto file1 = ComponentTesting.newFileDto(project, null); - ComponentDto file2 = ComponentTesting.newFileDto(module, null); - ComponentDto file3 = ComponentTesting.newFileDto(subModule, null); + ComponentDto file1 = newFileDto(project, null); + ComponentDto file2 = newFileDto(module, null); + ComponentDto file3 = newFileDto(subModule, null); String view = "ABCD"; indexView(view, newArrayList(project.uuid())); @@ -262,12 +268,12 @@ public class IssueIndexTest { @Test public void filter_by_components_on_non_contextualized_search() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto(), "project"); - ComponentDto file1 = ComponentTesting.newFileDto(project, null, "file1"); + ComponentDto project = newProjectDto(newOrganizationDto(), "project"); + ComponentDto file1 = newFileDto(project, null, "file1"); ComponentDto module = ComponentTesting.newModuleDto(project).setUuid("module"); - ComponentDto file2 = ComponentTesting.newFileDto(module, null, "file2"); + ComponentDto file2 = newFileDto(module, null, "file2"); ComponentDto subModule = ComponentTesting.newModuleDto(module).setUuid("subModule"); - ComponentDto file3 = ComponentTesting.newFileDto(subModule, null, "file3"); + ComponentDto file3 = newFileDto(subModule, null, "file3"); String view = "ABCD"; indexView(view, newArrayList(project.uuid())); @@ -293,10 +299,10 @@ public class IssueIndexTest { @Test public void facets_on_components() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto(), "A"); - ComponentDto file1 = ComponentTesting.newFileDto(project, null, "ABCD"); - ComponentDto file2 = ComponentTesting.newFileDto(project, null, "BCDE"); - ComponentDto file3 = ComponentTesting.newFileDto(project, null, "CDEF"); + ComponentDto project = newProjectDto(newOrganizationDto(), "A"); + ComponentDto file1 = newFileDto(project, null, "ABCD"); + ComponentDto file2 = newFileDto(project, null, "BCDE"); + ComponentDto file3 = newFileDto(project, null, "CDEF"); indexIssues( IssueDocTesting.newDoc("ISSUE1", project), @@ -313,9 +319,9 @@ public class IssueIndexTest { @Test public void filter_by_directories() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file1 = ComponentTesting.newFileDto(project, null).setPath("src/main/xoo/F1.xoo"); - ComponentDto file2 = ComponentTesting.newFileDto(project, null).setPath("F2.xoo"); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file1 = newFileDto(project, null).setPath("src/main/xoo/F1.xoo"); + ComponentDto file2 = newFileDto(project, null).setPath("F2.xoo"); indexIssues( IssueDocTesting.newDoc("ISSUE1", file1).setDirectoryPath("/src/main/xoo"), @@ -328,9 +334,9 @@ public class IssueIndexTest { @Test public void facets_on_directories() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file1 = ComponentTesting.newFileDto(project, null).setPath("src/main/xoo/F1.xoo"); - ComponentDto file2 = ComponentTesting.newFileDto(project, null).setPath("F2.xoo"); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file1 = newFileDto(project, null).setPath("src/main/xoo/F1.xoo"); + ComponentDto file2 = newFileDto(project, null).setPath("F2.xoo"); indexIssues( IssueDocTesting.newDoc("ISSUE1", file1).setDirectoryPath("/src/main/xoo"), @@ -344,9 +350,9 @@ public class IssueIndexTest { @Test public void filter_by_views() { OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project1 = ComponentTesting.newProjectDto(organizationDto); - ComponentDto file1 = ComponentTesting.newFileDto(project1, null); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto); + ComponentDto project1 = newProjectDto(organizationDto); + ComponentDto file1 = newFileDto(project1, null); + ComponentDto project2 = newProjectDto(organizationDto); indexIssues( // Project1 has 2 issues (one on a file and one on the project itself) IssueDocTesting.newDoc("ISSUE1", project1), @@ -370,8 +376,8 @@ public class IssueIndexTest { @Test public void filter_by_severities() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setSeverity(Severity.INFO), @@ -384,8 +390,8 @@ public class IssueIndexTest { @Test public void facets_on_severities() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setSeverity(Severity.INFO), @@ -399,8 +405,8 @@ public class IssueIndexTest { @Test public void filter_by_statuses() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setStatus(Issue.STATUS_CLOSED), @@ -414,8 +420,8 @@ public class IssueIndexTest { @Test public void facets_on_statuses() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setStatus(Issue.STATUS_CLOSED), @@ -429,8 +435,8 @@ public class IssueIndexTest { @Test public void filter_by_resolutions() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setResolution(Issue.RESOLUTION_FALSE_POSITIVE), @@ -446,8 +452,8 @@ public class IssueIndexTest { @Test public void facets_on_resolutions() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setResolution(Issue.RESOLUTION_FALSE_POSITIVE), @@ -461,8 +467,8 @@ public class IssueIndexTest { @Test public void filter_by_resolved() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setStatus(Issue.STATUS_CLOSED).setResolution(Issue.RESOLUTION_FIXED), @@ -476,8 +482,8 @@ public class IssueIndexTest { @Test public void filter_by_rules() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); RuleKey ruleKey = RuleKey.of("repo", "X1"); indexIssues(IssueDocTesting.newDoc("ISSUE1", file).setRuleKey(ruleKey.toString())); @@ -488,8 +494,8 @@ public class IssueIndexTest { @Test public void filter_by_languages() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); RuleKey ruleKey = RuleKey.of("repo", "X1"); indexIssues(IssueDocTesting.newDoc("ISSUE1", file).setRuleKey(ruleKey.toString()).setLanguage("xoo")); @@ -501,8 +507,8 @@ public class IssueIndexTest { @Test public void facets_on_languages() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); RuleKey ruleKey = RuleKey.of("repo", "X1"); indexIssues(IssueDocTesting.newDoc("ISSUE1", file).setRuleKey(ruleKey.toString()).setLanguage("xoo")); @@ -514,8 +520,8 @@ public class IssueIndexTest { @Test public void filter_by_assignees() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAssignee("steph"), @@ -529,8 +535,8 @@ public class IssueIndexTest { @Test public void facets_on_assignees() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAssignee("steph"), @@ -545,8 +551,8 @@ public class IssueIndexTest { @Test public void facets_on_assignees_supports_dashes() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAssignee("j-b"), @@ -562,8 +568,8 @@ public class IssueIndexTest { @Test public void filter_by_assigned() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAssignee("steph"), @@ -577,8 +583,8 @@ public class IssueIndexTest { @Test public void filter_by_authors() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAuthorLogin("steph"), @@ -592,8 +598,8 @@ public class IssueIndexTest { @Test public void facets_on_authors() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAuthorLogin("steph"), @@ -608,8 +614,8 @@ public class IssueIndexTest { @Test public void filter_by_created_after() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDate("2014-09-20")), @@ -624,8 +630,8 @@ public class IssueIndexTest { @Test public void filter_by_created_before() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDate("2014-09-20")), @@ -640,8 +646,8 @@ public class IssueIndexTest { @Test public void filter_by_created_after_and_before() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDate("2014-09-20")), @@ -686,8 +692,8 @@ public class IssueIndexTest { @Test public void filter_by_create_after_and_before_take_into_account_timezone() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDateTime("2014-09-20T00:00:00+0100")), @@ -733,8 +739,8 @@ public class IssueIndexTest { @Test public void filter_by_created_at() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues(IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDate("2014-09-20"))); @@ -873,8 +879,8 @@ public class IssueIndexTest { } private SearchOptions fixtureForCreatedAtFacet() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); IssueDoc issue0 = IssueDocTesting.newDoc("ISSUE0", file).setFuncCreationDate(parseDateTime("2011-04-25T00:05:13+0000")); IssueDoc issue1 = IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDateTime("2014-09-01T12:34:56+0100")); @@ -891,8 +897,8 @@ public class IssueIndexTest { @Test public void paging() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); for (int i = 0; i < 12; i++) { indexIssues(IssueDocTesting.newDoc("ISSUE" + i, file)); } @@ -914,8 +920,8 @@ public class IssueIndexTest { @Test public void search_with_max_limit() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); List<IssueDoc> issues = newArrayList(); for (int i = 0; i < 500; i++) { String key = "ISSUE" + i; @@ -930,8 +936,8 @@ public class IssueIndexTest { @Test public void sort_by_status() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setStatus(Issue.STATUS_OPEN), @@ -953,8 +959,8 @@ public class IssueIndexTest { @Test public void sort_by_severity() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setSeverity(Severity.BLOCKER), @@ -982,8 +988,8 @@ public class IssueIndexTest { @Test public void sort_by_assignee() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setAssignee("steph"), @@ -1004,8 +1010,8 @@ public class IssueIndexTest { @Test public void sort_by_creation_date() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncCreationDate(parseDateTime("2014-09-23T00:00:00+0100")), @@ -1026,8 +1032,8 @@ public class IssueIndexTest { @Test public void sort_by_update_date() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncUpdateDate(parseDateTime("2014-09-23T00:00:00+0100")), @@ -1048,8 +1054,8 @@ public class IssueIndexTest { @Test public void sort_by_close_date() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file = ComponentTesting.newFileDto(project, null); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file = newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("ISSUE1", file).setFuncCloseDate(parseDateTime("2014-09-23T00:00:00+0100")), @@ -1073,9 +1079,9 @@ public class IssueIndexTest { @Test public void sort_by_file_and_line() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); - ComponentDto file1 = ComponentTesting.newFileDto(project, null, "F1").setPath("src/main/xoo/org/sonar/samples/File.xoo"); - ComponentDto file2 = ComponentTesting.newFileDto(project, null, "F2").setPath("src/main/xoo/org/sonar/samples/File2.xoo"); + ComponentDto project = newProjectDto(newOrganizationDto()); + ComponentDto file1 = newFileDto(project, null, "F1").setPath("src/main/xoo/org/sonar/samples/File.xoo"); + ComponentDto file2 = newFileDto(project, null, "F2").setPath("src/main/xoo/org/sonar/samples/File2.xoo"); indexIssues( // file F1 @@ -1115,12 +1121,12 @@ public class IssueIndexTest { @Test public void default_sort_is_by_creation_date_then_project_then_file_then_line_then_issue_key() { OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project1 = ComponentTesting.newProjectDto(organizationDto, "P1"); - ComponentDto file1 = ComponentTesting.newFileDto(project1, null, "F1").setPath("src/main/xoo/org/sonar/samples/File.xoo"); - ComponentDto file2 = ComponentTesting.newFileDto(project1, null, "F2").setPath("src/main/xoo/org/sonar/samples/File2.xoo"); + ComponentDto project1 = newProjectDto(organizationDto, "P1"); + ComponentDto file1 = newFileDto(project1, null, "F1").setPath("src/main/xoo/org/sonar/samples/File.xoo"); + ComponentDto file2 = newFileDto(project1, null, "F2").setPath("src/main/xoo/org/sonar/samples/File2.xoo"); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto, "P2"); - ComponentDto file3 = ComponentTesting.newFileDto(project2, null, "F3").setPath("src/main/xoo/org/sonar/samples/File3.xoo"); + ComponentDto project2 = newProjectDto(organizationDto, "P2"); + ComponentDto file3 = newFileDto(project2, null, "F3").setPath("src/main/xoo/org/sonar/samples/File3.xoo"); indexIssues( // file F1 from project P1 @@ -1144,93 +1150,77 @@ public class IssueIndexTest { @Test public void authorized_issues_on_groups() { - OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project1 = ComponentTesting.newProjectDto(organizationDto).setKey("project1"); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto).setKey("project2"); - ComponentDto project3 = ComponentTesting.newProjectDto(organizationDto).setKey("project3"); - - ComponentDto file1 = ComponentTesting.newFileDto(project1, null).setKey("file1"); - ComponentDto file2 = ComponentTesting.newFileDto(project2, null).setKey("file2"); - ComponentDto file3 = ComponentTesting.newFileDto(project3, null).setKey("file3"); - - // project1 can be seen by sonar-users + OrganizationDto org = newOrganizationDto(); + ComponentDto project1 = newProjectDto(org); + ComponentDto project2 = newProjectDto(org); + ComponentDto project3 = newProjectDto(org); + ComponentDto file1 = newFileDto(project1, null); + ComponentDto file2 = newFileDto(project2, null); + ComponentDto file3 = newFileDto(project3, null); + GroupDto group1 = newGroupDto(); + GroupDto group2 = newGroupDto(); + + // project1 can be seen by group1 indexIssue(IssueDocTesting.newDoc("ISSUE1", file1)); - authorizationIndexerTester.allowOnlyGroup(project1, "sonar-users"); - // project2 can be seen by sonar-admins + authorizationIndexerTester.allowOnlyGroup(project1, group1); + // project2 can be seen by group2 indexIssue(IssueDocTesting.newDoc("ISSUE2", file2)); - authorizationIndexerTester.allowOnlyGroup(project2, "sonar-admins"); + authorizationIndexerTester.allowOnlyGroup(project2, group2); // project3 can be seen by nobody indexIssue(IssueDocTesting.newDoc("ISSUE3", file3)); - userSessionRule.login().setUserGroups("sonar-users"); + userSessionRule.login().setGroups(group1); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1); - userSessionRule.login().setUserGroups("sonar-admins"); + userSessionRule.login().setGroups(group2); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1); - userSessionRule.login().setUserGroups("sonar-users", "sonar-admins"); + userSessionRule.login().setGroups(group1, group2); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(2); - userSessionRule.login().setUserGroups("another group"); + GroupDto otherGroup = newGroupDto(); + userSessionRule.login().setGroups(otherGroup); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).isEmpty(); - userSessionRule.login().setUserGroups("sonar-users", "sonar-admins"); + userSessionRule.login().setGroups(group1, group2); assertThat(underTest.search(IssueQuery.builder().projectUuids(newArrayList(project3.uuid())).build(), new SearchOptions()).getDocs()).isEmpty(); } @Test public void authorized_issues_on_user() { - OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project1 = ComponentTesting.newProjectDto(organizationDto).setKey("project1"); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto).setKey("project2"); - ComponentDto project3 = ComponentTesting.newProjectDto(organizationDto).setKey("project3"); - - ComponentDto file1 = ComponentTesting.newFileDto(project1, null).setKey("file1"); - ComponentDto file2 = ComponentTesting.newFileDto(project2, null).setKey("file2"); - ComponentDto file3 = ComponentTesting.newFileDto(project3, null).setKey("file3"); + OrganizationDto org = newOrganizationDto(); + ComponentDto project1 = newProjectDto(org); + ComponentDto project2 = newProjectDto(org); + ComponentDto project3 = newProjectDto(org); + ComponentDto file1 = newFileDto(project1, null); + ComponentDto file2 = newFileDto(project2, null); + ComponentDto file3 = newFileDto(project3, null); + UserDto user1 = newUserDto(); + UserDto user2 = newUserDto(); // project1 can be seen by john, project2 by max, project3 cannot be seen by anyone indexIssue(IssueDocTesting.newDoc("ISSUE1", file1)); - authorizationIndexerTester.allowOnlyUser(project1, 10); + authorizationIndexerTester.allowOnlyUser(project1, user1); indexIssue(IssueDocTesting.newDoc("ISSUE2", file2)); - authorizationIndexerTester.allowOnlyUser(project2, 11); + authorizationIndexerTester.allowOnlyUser(project2, user2); indexIssue(IssueDocTesting.newDoc("ISSUE3", file3)); - userSessionRule.login("john").setUserId(10); + userSessionRule.login(user1); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1); + assertThat(underTest.search(IssueQuery.builder().projectUuids(newArrayList(project3.key())).build(), new SearchOptions()).getDocs()).hasSize(0); - userSessionRule.login("max").setUserId(11); + userSessionRule.login(user2); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1); - userSessionRule.login("another guy").setUserId(33); + // another user + userSessionRule.login(newUserDto()); assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(0); - - userSessionRule.login("john").setUserId(10); - assertThat(underTest.search(IssueQuery.builder().projectUuids(newArrayList(project3.key())).build(), new SearchOptions()).getDocs()).hasSize(0); - } - - @Test - public void authorized_issues_on_user_and_group() { - OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project1 = ComponentTesting.newProjectDto(organizationDto).setKey("project1"); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto).setKey("project2"); - - ComponentDto file1 = ComponentTesting.newFileDto(project1, null).setKey("file1"); - ComponentDto file2 = ComponentTesting.newFileDto(project2, null).setKey("file2"); - - // project1 can be seen by user 10 and by sonar-users - indexIssue(IssueDocTesting.newDoc("ISSUE1", file1)); - indexIssue(IssueDocTesting.newDoc("ISSUE2", file2)); - authorizationIndexerTester.allowOnlyUser(project1, 10); - - userSessionRule.login("john").setUserGroups("sonar-users").setUserId(10); - assertThat(underTest.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1); } @Test public void search_issues_for_batch_return_needed_fields() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto(), "PROJECT"); - ComponentDto file = ComponentTesting.newFileDto(project, null).setPath("src/File.xoo"); + ComponentDto project = newProjectDto(newOrganizationDto(), "PROJECT"); + ComponentDto file = newFileDto(project, null).setPath("src/File.xoo"); IssueDoc issue = IssueDocTesting.newDoc("ISSUE", file) .setRuleKey("squid:S001") @@ -1265,10 +1255,10 @@ public class IssueIndexTest { @Test public void search_issues_for_batch() { - ComponentDto project = ComponentTesting.newProjectDto(newOrganizationDto()); + ComponentDto project = newProjectDto(newOrganizationDto()); ComponentDto module = ComponentTesting.newModuleDto(project); ComponentDto subModule = ComponentTesting.newModuleDto(module); - ComponentDto file = ComponentTesting.newFileDto(subModule, null); + ComponentDto file = newFileDto(subModule, null); indexIssues( IssueDocTesting.newDoc("ISSUE3", module), @@ -1281,7 +1271,7 @@ public class IssueIndexTest { assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(module))).hasSize(3); assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(subModule))).hasSize(2); assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(file))).hasSize(1); - assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(ComponentTesting.newProjectDto(newOrganizationDto())))).isEmpty(); + assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(newProjectDto(newOrganizationDto())))).isEmpty(); } @Test @@ -1296,30 +1286,33 @@ public class IssueIndexTest { @Test public void search_issues_for_batch_return_only_authorized_issues() { - OrganizationDto organizationDto = newOrganizationDto(); - ComponentDto project1 = ComponentTesting.newProjectDto(organizationDto).setKey("project1"); - ComponentDto project2 = ComponentTesting.newProjectDto(organizationDto).setKey("project2"); - - ComponentDto file1 = ComponentTesting.newFileDto(project1, null).setKey("file1"); - ComponentDto file2 = ComponentTesting.newFileDto(project2, null).setKey("file2"); - - // project1 can be seen by sonar-users + OrganizationDto org = newOrganizationDto(); + ComponentDto project1 = newProjectDto(org); + ComponentDto project2 = newProjectDto(org); + ComponentDto file1 = newFileDto(project1, null); + ComponentDto file2 = newFileDto(project2, null); + GroupDto allowedGroup = newGroupDto(); + GroupDto otherGroup = newGroupDto(); + + // project1 can be seen by allowedGroup indexIssue(IssueDocTesting.newDoc("ISSUE1", file1)); + authorizationIndexerTester.allowOnlyGroup(project1, allowedGroup); // project3 can be seen by nobody indexIssue(IssueDocTesting.newDoc("ISSUE3", file2)); - authorizationIndexerTester.allowOnlyGroup(project1, "sonar-users"); - userSessionRule.setUserGroups("sonar-users"); + userSessionRule.login().setGroups(allowedGroup); assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(project1))).hasSize(1); - userSessionRule.setUserGroups("another group"); + userSessionRule.login().setGroups(otherGroup); assertThat(Lists.newArrayList(underTest.selectIssuesForBatch(project2))).isEmpty(); } private void indexIssues(IssueDoc... issues) { issueIndexer.index(Arrays.asList(issues).iterator()); for (IssueDoc issue : issues) { - authorizationIndexerTester.allow(new PermissionIndexerDao.Dto(issue.projectUuid(), system2.now(), "TRK").addGroupName("Anyone")); + PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(issue.projectUuid(), system2.now(), "TRK"); + access.allowAnyone(); + authorizationIndexerTester.allow(access); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java index 8b08a6eec93..2b126188a8f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java @@ -19,18 +19,22 @@ */ package org.sonar.server.measure.index; -import com.google.common.base.Throwables; import com.google.common.collect.ImmutableMap; +import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.IntStream; -import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; import org.sonar.api.config.MapSettings; import org.sonar.api.resources.Qualifiers; import org.sonar.api.utils.System2; +import org.sonar.db.component.ComponentDto; +import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.organization.OrganizationTesting; +import org.sonar.db.user.GroupDto; +import org.sonar.db.user.UserDto; import org.sonar.server.es.EsTester; import org.sonar.server.es.Facets; import org.sonar.server.es.SearchIdResult; @@ -51,7 +55,9 @@ import static org.sonar.api.measures.CoreMetrics.COVERAGE_KEY; import static org.sonar.api.measures.Metric.Level.ERROR; import static org.sonar.api.measures.Metric.Level.OK; import static org.sonar.api.measures.Metric.Level.WARN; -import static org.sonar.api.security.DefaultGroups.ANYONE; +import static org.sonar.db.component.ComponentTesting.newProjectDto; +import static org.sonar.db.user.GroupTesting.newGroupDto; +import static org.sonar.db.user.UserTesting.newUserDto; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURE; @@ -64,6 +70,15 @@ public class ProjectMeasuresIndexTest { private static final String DUPLICATION = "duplicated_lines_density"; private static final String NCLOC = "ncloc"; + private static final OrganizationDto ORG = OrganizationTesting.newOrganizationDto(); + private static final ComponentDto PROJECT1 = newProjectDto(ORG); + private static final ComponentDto PROJECT2 = newProjectDto(ORG); + private static final ComponentDto PROJECT3 = newProjectDto(ORG); + private static final UserDto USER1 = newUserDto(); + private static final UserDto USER2 = newUserDto(); + private static final GroupDto GROUP1 = newGroupDto(); + private static final GroupDto GROUP2 = newGroupDto(); + @Rule public EsTester es = new EsTester(new ProjectMeasuresIndexDefinition(new MapSettings())); @@ -72,31 +87,27 @@ public class ProjectMeasuresIndexTest { private ProjectMeasuresIndexer projectMeasureIndexer = new ProjectMeasuresIndexer(System2.INSTANCE, null, es.client()); private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es, projectMeasureIndexer); - private ProjectMeasuresIndex underTest = new ProjectMeasuresIndex(es.client(), new AuthorizationTypeSupport(userSession)); @Test - public void empty_search() { - List<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getIds(); - - assertThat(result).isEmpty(); + public void return_empty_if_no_projects() { + assertNoResults(new ProjectMeasuresQuery()); } @Test - public void search_sort_by_name_case_insensitive() { - addDocs(newDoc("P1", "K1", "Windows"), - newDoc("P3", "K3", "apachee"), - newDoc("P2", "K2", "Apache")); + public void search_sort_by_case_insensitive_name() { + ComponentDto projectA = newProjectDto(ORG).setName("Windows"); + ComponentDto projectB = newProjectDto(ORG).setName("apachee"); + ComponentDto projectC = newProjectDto(ORG).setName("Apache"); + index(newDoc(projectA), newDoc(projectB), newDoc(projectC)); - List<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getIds(); - - assertThat(result).containsExactly("P2", "P3", "P1"); + assertResults(new ProjectMeasuresQuery(), projectC, projectB, projectA); } @Test public void search_paginate_results() { IntStream.rangeClosed(1, 9) - .forEach(i -> addDocs(newDoc("P" + i, "K" + i, "P" + i))); + .forEach(i -> index(newDoc(newProjectDto(ORG, "P" + i)))); SearchIdResult<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().setPage(2, 3)); @@ -106,170 +117,147 @@ public class ProjectMeasuresIndexTest { @Test public void filter_with_lower_than() { - addDocs( - newDoc("P1", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 79d), newMeasure(NCLOC, 10_000d))), - newDoc("P2", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 10_000d))), - newDoc("P3", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 81d), newMeasure(NCLOC, 10_000d)))); + index( + newDoc(PROJECT1, COVERAGE, 79d, NCLOC, 10_000d), + newDoc(PROJECT2, COVERAGE, 80d, NCLOC, 10_000d), + newDoc(PROJECT3, COVERAGE, 81d, NCLOC, 10_000d)); - ProjectMeasuresQuery esQuery = new ProjectMeasuresQuery() + ProjectMeasuresQuery query = new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(COVERAGE, Operator.LT, 80d)); - List<String> result = underTest.search(esQuery, new SearchOptions()).getIds(); - assertThat(result).containsExactly("P1"); + assertResults(query, PROJECT1); } @Test public void filter_with_lower_than_or_equals() { - addDocs( - newDoc("P1", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 79d), newMeasure(NCLOC, 10_000d))), - newDoc("P2", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 10_000d))), - newDoc("P3", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 81d), newMeasure(NCLOC, 10_000d)))); + index( + newDoc(PROJECT1, COVERAGE, 79d, NCLOC, 10_000d), + newDoc(PROJECT2, COVERAGE, 80d, NCLOC, 10_000d), + newDoc(PROJECT3, COVERAGE, 81d, NCLOC, 10_000d)); - ProjectMeasuresQuery esQuery = new ProjectMeasuresQuery() + ProjectMeasuresQuery query = new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(COVERAGE, Operator.LTE, 80d)); - List<String> result = underTest.search(esQuery, new SearchOptions()).getIds(); - assertThat(result).containsExactly("P1", "P2"); + assertResults(query, PROJECT1, PROJECT2); } @Test public void filter_with_greater_than() { - addDocs( - newDoc("P1", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 30_000d))), - newDoc("P2", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 30_001d))), - newDoc("P3", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 30_001d)))); + index( + newDoc(PROJECT1, COVERAGE, 80d, NCLOC, 30_000d), + newDoc(PROJECT2, COVERAGE, 80d, NCLOC, 30_001d), + newDoc(PROJECT3, COVERAGE, 80d, NCLOC, 30_001d)); - assertThat(underTest.search(new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GT, 30_000d)), - new SearchOptions()).getIds()).containsExactly("P2", "P3"); - assertThat(underTest.search(new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GT, 100_000d)), - new SearchOptions()).getIds()).isEmpty(); + ProjectMeasuresQuery query = new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GT, 30_000d)); + assertResults(query, PROJECT2, PROJECT3); + + query = new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GT, 100_000d)); + assertNoResults(query); } @Test public void filter_with_greater_than_or_equals() { - addDocs( - newDoc("P1", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 30_000d))), - newDoc("P2", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 30_001d))), - newDoc("P3", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 30_001d)))); + index( + newDoc(PROJECT1, COVERAGE, 80d, NCLOC, 30_000d), + newDoc(PROJECT2, COVERAGE, 80d, NCLOC, 30_001d), + newDoc(PROJECT3, COVERAGE, 80d, NCLOC, 30_001d)); + + ProjectMeasuresQuery query = new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GTE, 30_001d)); + assertResults(query, PROJECT2, PROJECT3); - assertThat(underTest.search(new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GTE, 30_001d)), - new SearchOptions()).getIds()).containsExactly("P2", "P3"); - assertThat(underTest.search(new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GTE, 100_000d)), - new SearchOptions()).getIds()).isEmpty(); + query = new ProjectMeasuresQuery().addMetricCriterion(new MetricCriterion(NCLOC, Operator.GTE, 100_000d)); + assertNoResults(query); } @Test public void filter_with_equals() { - addDocs( - newDoc("P1", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 79d), newMeasure(NCLOC, 10_000d))), - newDoc("P2", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 10_000d))), - newDoc("P3", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 81d), newMeasure(NCLOC, 10_000d)))); + index( + newDoc(PROJECT1, COVERAGE, 79d, NCLOC, 10_000d), + newDoc(PROJECT2, COVERAGE, 80d, NCLOC, 10_000d), + newDoc(PROJECT3, COVERAGE, 81d, NCLOC, 10_000d)); - ProjectMeasuresQuery esQuery = new ProjectMeasuresQuery() + ProjectMeasuresQuery query = new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(COVERAGE, Operator.EQ, 80d)); - List<String> result = underTest.search(esQuery, new SearchOptions()).getIds(); - assertThat(result).containsExactly("P2"); + assertResults(query, PROJECT2); } @Test public void filter_on_several_metrics() { - addDocs( - newDoc("P1", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 81d), newMeasure(NCLOC, 10_001d))), - newDoc("P2", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 80d), newMeasure(NCLOC, 10_001d))), - newDoc("P3", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 79d), newMeasure(NCLOC, 10_000d)))); + index( + newDoc(PROJECT1, COVERAGE, 81d, NCLOC, 10_001d), + newDoc(PROJECT2, COVERAGE, 80d, NCLOC, 10_001d), + newDoc(PROJECT3, COVERAGE, 79d, NCLOC, 10_000d)); ProjectMeasuresQuery esQuery = new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(COVERAGE, Operator.LTE, 80d)) .addMetricCriterion(new MetricCriterion(NCLOC, Operator.GT, 10_000d)) .addMetricCriterion(new MetricCriterion(NCLOC, Operator.LT, 11_000d)); - List<String> result = underTest.search(esQuery, new SearchOptions()).getIds(); - - assertThat(result).containsExactly("P2"); + assertResults(esQuery, PROJECT2); } @Test public void filter_on_quality_gate_status() { - addDocs( - newDoc("P1", "K1", "N1").setQualityGate("OK"), - newDoc("P2", "K2", "N2").setQualityGate("OK"), - newDoc("P3", "K3", "N3").setQualityGate("WARN")); - ProjectMeasuresQuery esQuery = new ProjectMeasuresQuery().setQualityGateStatus(OK); - - List<String> result = underTest.search(esQuery, new SearchOptions()).getIds(); + index( + newDoc(PROJECT1).setQualityGate("OK"), + newDoc(PROJECT2).setQualityGate("OK"), + newDoc(PROJECT3).setQualityGate("WARN")); - assertThat(result).containsExactly("P1", "P2"); + ProjectMeasuresQuery query = new ProjectMeasuresQuery().setQualityGateStatus(OK); + assertResults(query, PROJECT1, PROJECT2); } @Test public void filter_on_ids() { - addDocs( - newDoc("P1", "K1", "N1"), - newDoc("P2", "K2", "N2"), - newDoc("P3", "K3", "N3")); - ProjectMeasuresQuery esQuery = new ProjectMeasuresQuery().setProjectUuids(newHashSet("P1", "P3")); - - List<String> result = underTest.search(esQuery, new SearchOptions()).getIds(); + index( + newDoc(PROJECT1), + newDoc(PROJECT2), + newDoc(PROJECT3)); - assertThat(result).containsExactly("P1", "P3"); + ProjectMeasuresQuery query = new ProjectMeasuresQuery().setProjectUuids(newHashSet(PROJECT1.uuid(), PROJECT3.uuid())); + assertResults(query, PROJECT1, PROJECT3); } @Test public void return_only_projects_authorized_for_user() throws Exception { - userSession.login("john").setUserId(10); - addDocs(10L, null, newDoc("P1", "K1", "Windows")); - addDocs(10L, "dev", newDoc("P2", "K2", "apachee")); - addDocs(33L, null, newDoc("P10", "K10", "N10")); + indexForUser(USER1, newDoc(PROJECT1), newDoc(PROJECT2)); + indexForUser(USER2, newDoc(PROJECT3)); - List<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getIds(); - - assertThat(result).containsOnly("P1", "P2"); + userSession.login(USER1); + assertResults(new ProjectMeasuresQuery(), PROJECT1, PROJECT2); } @Test public void return_only_projects_authorized_for_user_groups() throws Exception { - userSession.setUserGroups("dev"); - addDocs(10L, "dev", newDoc("P1", "K1", "apachee")); - addDocs(null, ANYONE, newDoc("P2", "K2", "N2")); - addDocs(null, "admin", newDoc("P10", "K10", "N10")); - - List<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getIds(); + indexForGroup(GROUP1, newDoc(PROJECT1), newDoc(PROJECT2)); + indexForGroup(GROUP2, newDoc(PROJECT3)); - assertThat(result).containsOnly("P1", "P2"); + userSession.login().setGroups(GROUP1); + assertResults(new ProjectMeasuresQuery(), PROJECT1, PROJECT2); } @Test public void return_only_projects_authorized_for_user_and_groups() throws Exception { - userSession.login("john").setUserId(10).setUserGroups("dev"); - addDocs(10L, null, newDoc("P1", "K1", "Windows")); - addDocs(null, "dev", newDoc("P2", "K2", "Apache")); - addDocs(10L, "dev", newDoc("P3", "K3", "apachee")); - // Current user is not able to see following projects - addDocs(null, "another group", newDoc("P5", "K5", "N5")); - addDocs(33L, null, newDoc("P6", "K6", "N6")); - addDocs((Long) null, null, newDoc("P7", "K7", "N7")); - - List<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getIds(); + indexForUser(USER1, newDoc(PROJECT1), newDoc(PROJECT2)); + indexForGroup(GROUP1, newDoc(PROJECT3)); - assertThat(result).containsOnly("P1", "P2", "P3"); + userSession.login(USER1).setGroups(GROUP1); + assertResults(new ProjectMeasuresQuery(), PROJECT1, PROJECT2, PROJECT3); } @Test - public void anyone_user_can_only_access_projects_authorized_for_anyone() throws Exception { - userSession.anonymous(); - addDocs(null, ANYONE, newDoc("P1", "K1", "N1")); - addDocs(10L, null, newDoc("P2", "K2", "Windows")); - addDocs(null, "admin", newDoc("P3", "K3", "N3")); - - List<String> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getIds(); + public void anonymous_user_can_only_access_projects_authorized_for_anyone() throws Exception { + index(newDoc(PROJECT1)); + indexForUser(USER1, newDoc(PROJECT2)); - assertThat(result).containsOnly("P1"); + userSession.anonymous(); + assertResults(new ProjectMeasuresQuery(), PROJECT1); } @Test public void does_not_return_facet_when_no_facets_in_options() throws Exception { - addDocs( - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 10d), newMeasure(COVERAGE_KEY, 30d), newMeasure(MAINTAINABILITY_RATING, 3d))) + index( + newDoc(PROJECT1, NCLOC, 10d, COVERAGE_KEY, 30d, MAINTAINABILITY_RATING, 3d) .setQualityGate(OK.name())); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getFacets(); @@ -279,28 +267,28 @@ public class ProjectMeasuresIndexTest { @Test public void facet_ncloc() { - addDocs( + index( // 3 docs with ncloc<1K - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 999d))), + newDoc(NCLOC, 0d), + newDoc(NCLOC, 0d), + newDoc(NCLOC, 999d), // 2 docs with ncloc>=1K and ncloc<10K - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 1_000d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 9_999d))), + newDoc(NCLOC, 1_000d), + newDoc(NCLOC, 9_999d), // 4 docs with ncloc>=10K and ncloc<100K - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 10_000d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 10_000d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 11_000d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 99_000d))), + newDoc(NCLOC, 10_000d), + newDoc(NCLOC, 10_000d), + newDoc(NCLOC, 11_000d), + newDoc(NCLOC, 99_000d), // 2 docs with ncloc>=100K and ncloc<500K - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 100_000d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 499_000d))), + newDoc(NCLOC, 100_000d), + newDoc(NCLOC, 499_000d), // 5 docs with ncloc>= 500K - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 500_000d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 100_000_000d))), - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 500_000d))), - newDoc("P54", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 1_000_000d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 100_000_000_000d)))); + newDoc(NCLOC, 500_000d), + newDoc(NCLOC, 100_000_000d), + newDoc(NCLOC, 500_000d), + newDoc(NCLOC, 1_000_000d), + newDoc(NCLOC, 100_000_000_000d)); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(NCLOC)).getFacets(); @@ -314,21 +302,21 @@ public class ProjectMeasuresIndexTest { @Test public void facet_ncloc_is_sticky() { - addDocs( + index( // 1 docs with ncloc<1K - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 999d), newMeasure(COVERAGE, 0d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 999d, COVERAGE, 0d, DUPLICATION, 0d), // 2 docs with ncloc>=1K and ncloc<10K - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 1_000d), newMeasure(COVERAGE, 10d), newMeasure(DUPLICATION, 0d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 9_999d), newMeasure(COVERAGE, 20d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 1_000d, COVERAGE, 10d, DUPLICATION, 0d), + newDoc(NCLOC, 9_999d, COVERAGE, 20d, DUPLICATION, 0d), // 3 docs with ncloc>=10K and ncloc<100K - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 10_000d), newMeasure(COVERAGE, 31d), newMeasure(DUPLICATION, 0d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 11_000d), newMeasure(COVERAGE, 40d), newMeasure(DUPLICATION, 0d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 99_000d), newMeasure(COVERAGE, 50d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 10_000d, COVERAGE, 31d, DUPLICATION, 0d), + newDoc(NCLOC, 11_000d, COVERAGE, 40d, DUPLICATION, 0d), + newDoc(NCLOC, 99_000d, COVERAGE, 50d, DUPLICATION, 0d), // 2 docs with ncloc>=100K and ncloc<500K - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 100_000d), newMeasure(COVERAGE, 71d), newMeasure(DUPLICATION, 0d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 499_000d), newMeasure(COVERAGE, 80d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 100_000d, COVERAGE, 71d, DUPLICATION, 0d), + newDoc(NCLOC, 499_000d, COVERAGE, 80d, DUPLICATION, 0d), // 1 docs with ncloc>= 500K - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 501_000d), newMeasure(COVERAGE, 81d), newMeasure(DUPLICATION, 20d)))); + newDoc(NCLOC, 501_000d, COVERAGE, 81d, DUPLICATION, 20d)); Facets facets = underTest.search(new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(NCLOC, Operator.LT, 10_000d)) @@ -353,27 +341,26 @@ public class ProjectMeasuresIndexTest { @Test public void facet_ncloc_contains_only_projects_authorized_for_user() throws Exception { - userSession.login("john").setUserId(10); - // User can see these projects - addDocs(10L, null, + indexForUser(USER1, // docs with ncloc<1K - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 100d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 999d))), + newDoc(NCLOC, 0d), + newDoc(NCLOC, 100d), + newDoc(NCLOC, 999d), // docs with ncloc>=1K and ncloc<10K - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 1_000d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 9_999d)))); + newDoc(NCLOC, 1_000d), + newDoc(NCLOC, 9_999d)); // User cannot see these projects - addDocs(33L, null, + indexForUser(USER2, // doc with ncloc>=10K and ncloc<100K - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 11_000d))), + newDoc(NCLOC, 11_000d), // doc with ncloc>=100K and ncloc<500K - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 499_000d))), + newDoc(NCLOC, 499_000d), // doc with ncloc>= 500K - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 501_000d)))); + newDoc(NCLOC, 501_000d)); + userSession.login(USER1); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(NCLOC)).getFacets(); assertThat(facets.get(NCLOC)).containsExactly( @@ -386,28 +373,28 @@ public class ProjectMeasuresIndexTest { @Test public void facet_coverage() { - addDocs( + index( // 3 docs with coverage<30% - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 29d))), + newDoc(COVERAGE, 0d), + newDoc(COVERAGE, 0d), + newDoc(COVERAGE, 29d), // 2 docs with coverage>=30% and coverage<50% - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 30d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 49d))), + newDoc(COVERAGE, 30d), + newDoc(COVERAGE, 49d), // 4 docs with coverage>=50% and coverage<70% - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 50d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 60d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 60d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 69d))), + newDoc(COVERAGE, 50d), + newDoc(COVERAGE, 60d), + newDoc(COVERAGE, 60d), + newDoc(COVERAGE, 69d), // 2 docs with coverage>=70% and coverage<80% - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 70d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 79d))), + newDoc(COVERAGE, 70d), + newDoc(COVERAGE, 79d), // 5 docs with coverage>= 80% - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 80d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 80d))), - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 90d))), - newDoc("P54", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 90.5d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 100d)))); + newDoc(COVERAGE, 80d), + newDoc(COVERAGE, 80d), + newDoc(COVERAGE, 90d), + newDoc(COVERAGE, 90.5d), + newDoc(COVERAGE, 100d)); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(COVERAGE)).getFacets(); @@ -421,21 +408,21 @@ public class ProjectMeasuresIndexTest { @Test public void facet_coverage_is_sticky() { - addDocs( + index( // docs with coverage<30% - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(NCLOC, 999d), newMeasure(COVERAGE, 0d), newMeasure(DUPLICATION, 0d))), - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 1_000d), newMeasure(COVERAGE, 10d), newMeasure(DUPLICATION, 0d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(NCLOC, 9_999d), newMeasure(COVERAGE, 20d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 999d, COVERAGE, 0d, DUPLICATION, 0d), + newDoc(NCLOC, 1_000d, COVERAGE, 10d, DUPLICATION, 0d), + newDoc(NCLOC, 9_999d, COVERAGE, 20d, DUPLICATION, 0d), // docs with coverage>=30% and coverage<50% - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 10_000d), newMeasure(COVERAGE, 31d), newMeasure(DUPLICATION, 0d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 11_000d), newMeasure(COVERAGE, 40d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 10_000d, COVERAGE, 31d, DUPLICATION, 0d), + newDoc(NCLOC, 11_000d, COVERAGE, 40d, DUPLICATION, 0d), // docs with coverage>=50% and coverage<70% - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 99_000d), newMeasure(COVERAGE, 50d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 99_000d, COVERAGE, 50d, DUPLICATION, 0d), // docs with coverage>=70% and coverage<80% - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 100_000d), newMeasure(COVERAGE, 71d), newMeasure(DUPLICATION, 0d))), + newDoc(NCLOC, 100_000d, COVERAGE, 71d, DUPLICATION, 0d), // docs with coverage>= 80% - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 499_000d), newMeasure(COVERAGE, 80d), newMeasure(DUPLICATION, 15d))), - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(NCLOC, 501_000d), newMeasure(COVERAGE, 810d), newMeasure(DUPLICATION, 20d)))); + newDoc(NCLOC, 499_000d, COVERAGE, 80d, DUPLICATION, 15d), + newDoc(NCLOC, 501_000d, COVERAGE, 810d, DUPLICATION, 20d)); Facets facets = underTest.search(new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(COVERAGE, Operator.LT, 30d)) @@ -460,27 +447,26 @@ public class ProjectMeasuresIndexTest { @Test public void facet_coverage_contains_only_projects_authorized_for_user() throws Exception { - userSession.login("john").setUserId(10); - // User can see these projects - addDocs(10L, null, + indexForUser(USER1, // docs with coverage<30% - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(COVERAGE, 29d))), + newDoc(COVERAGE, 0d), + newDoc(COVERAGE, 0d), + newDoc(COVERAGE, 29d), // docs with coverage>=30% and coverage<50% - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 30d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(COVERAGE, 49d)))); + newDoc(COVERAGE, 30d), + newDoc(COVERAGE, 49d)); // User cannot see these projects - addDocs(33L, null, + indexForUser(USER2, // docs with coverage>=50% and coverage<70% - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 50d))), + newDoc(COVERAGE, 50d), // docs with coverage>=70% and coverage<80% - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 70d))), + newDoc(COVERAGE, 70d), // docs with coverage>= 80% - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(COVERAGE, 80d)))); + newDoc(COVERAGE, 80d)); + userSession.login(USER1); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(COVERAGE)).getFacets(); assertThat(facets.get(COVERAGE)).containsExactly( @@ -493,28 +479,28 @@ public class ProjectMeasuresIndexTest { @Test public void facet_duplicated_lines_density() { - addDocs( + index( // 3 docs with duplication<3% - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 2.9d))), + newDoc(DUPLICATION, 0d), + newDoc(DUPLICATION, 0d), + newDoc(DUPLICATION, 2.9d), // 2 docs with duplication>=3% and duplication<5% - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(DUPLICATION, 3d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(DUPLICATION, 4.9d))), + newDoc(DUPLICATION, 3d), + newDoc(DUPLICATION, 4.9d), // 4 docs with duplication>=5% and duplication<10% - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 5d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 6d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 6d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 9.9d))), + newDoc(DUPLICATION, 5d), + newDoc(DUPLICATION, 6d), + newDoc(DUPLICATION, 6d), + newDoc(DUPLICATION, 9.9d), // 2 docs with duplication>=10% and duplication<20% - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 10d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 19.9d))), + newDoc(DUPLICATION, 10d), + newDoc(DUPLICATION, 19.9d), // 5 docs with duplication>= 20% - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 20d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 20d))), - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 50d))), - newDoc("P54", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 80d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 100d)))); + newDoc(DUPLICATION, 20d), + newDoc(DUPLICATION, 20d), + newDoc(DUPLICATION, 50d), + newDoc(DUPLICATION, 80d), + newDoc(DUPLICATION, 100d)); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(DUPLICATION)).getFacets(); @@ -528,19 +514,19 @@ public class ProjectMeasuresIndexTest { @Test public void facet_duplicated_lines_density_is_sticky() { - addDocs( + index( // docs with duplication<3% - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 0d), newMeasure(NCLOC, 999d), newMeasure(COVERAGE, 0d))), + newDoc(DUPLICATION, 0d, NCLOC, 999d, COVERAGE, 0d), // docs with duplication>=3% and duplication<5% - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(DUPLICATION, 3d), newMeasure(NCLOC, 5000d), newMeasure(COVERAGE, 0d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(DUPLICATION, 4.9d), newMeasure(NCLOC, 6000d), newMeasure(COVERAGE, 0d))), + newDoc(DUPLICATION, 3d, NCLOC, 5000d, COVERAGE, 0d), + newDoc(DUPLICATION, 4.9d, NCLOC, 6000d, COVERAGE, 0d), // docs with duplication>=5% and duplication<10% - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 5d), newMeasure(NCLOC, 11000d), newMeasure(COVERAGE, 0d))), + newDoc(DUPLICATION, 5d, NCLOC, 11000d, COVERAGE, 0d), // docs with duplication>=10% and duplication<20% - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 10d), newMeasure(NCLOC, 120000d), newMeasure(COVERAGE, 10d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 19.9d), newMeasure(NCLOC, 130000d), newMeasure(COVERAGE, 20d))), + newDoc(DUPLICATION, 10d, NCLOC, 120000d, COVERAGE, 10d), + newDoc(DUPLICATION, 19.9d, NCLOC, 130000d, COVERAGE, 20d), // docs with duplication>= 20% - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 20d), newMeasure(NCLOC, 1000000d), newMeasure(COVERAGE, 40d)))); + newDoc(DUPLICATION, 20d, NCLOC, 1000000d, COVERAGE, 40d)); Facets facets = underTest.search(new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(DUPLICATION, Operator.LT, 10d)) @@ -565,27 +551,26 @@ public class ProjectMeasuresIndexTest { @Test public void facet_duplicated_lines_density_contains_only_projects_authorized_for_user() throws Exception { - userSession.login("john").setUserId(10); - // User can see these projects - addDocs(10L, null, + indexForUser(USER1, // docs with duplication<3% - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(DUPLICATION, 2.9d))), + newDoc(DUPLICATION, 0d), + newDoc(DUPLICATION, 0d), + newDoc(DUPLICATION, 2.9d), // docs with duplication>=3% and duplication<5% - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(DUPLICATION, 3d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(DUPLICATION, 4.9d)))); + newDoc(DUPLICATION, 3d), + newDoc(DUPLICATION, 4.9d)); // User cannot see these projects - addDocs(33L, null, + indexForUser(USER2, // docs with duplication>=5% and duplication<10% - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 5d))), + newDoc(DUPLICATION, 5d), // docs with duplication>=10% and duplication<20% - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 10d))), + newDoc(DUPLICATION, 10d), // docs with duplication>= 20% - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(DUPLICATION, 20d)))); + newDoc(DUPLICATION, 20d)); + userSession.login(USER1); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(DUPLICATION)).getFacets(); assertThat(facets.get(DUPLICATION)).containsExactly( @@ -598,28 +583,28 @@ public class ProjectMeasuresIndexTest { @Test public void facet_maintainability_rating() { - addDocs( + index( // 3 docs with rating A - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d))), + newDoc(MAINTAINABILITY_RATING, 1d), + newDoc(MAINTAINABILITY_RATING, 1d), + newDoc(MAINTAINABILITY_RATING, 1d), // 2 docs with rating B - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 2d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 2d))), + newDoc(MAINTAINABILITY_RATING, 2d), + newDoc(MAINTAINABILITY_RATING, 2d), // 4 docs with rating C - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d))), + newDoc(MAINTAINABILITY_RATING, 3d), + newDoc(MAINTAINABILITY_RATING, 3d), + newDoc(MAINTAINABILITY_RATING, 3d), + newDoc(MAINTAINABILITY_RATING, 3d), // 2 docs with rating D - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 4d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 4d))), + newDoc(MAINTAINABILITY_RATING, 4d), + newDoc(MAINTAINABILITY_RATING, 4d), // 5 docs with rating E - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d))), - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d))), - newDoc("P54", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d)))); + newDoc(MAINTAINABILITY_RATING, 5d), + newDoc(MAINTAINABILITY_RATING, 5d), + newDoc(MAINTAINABILITY_RATING, 5d), + newDoc(MAINTAINABILITY_RATING, 5d), + newDoc(MAINTAINABILITY_RATING, 5d)); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(MAINTAINABILITY_RATING)).getFacets(); @@ -633,25 +618,25 @@ public class ProjectMeasuresIndexTest { @Test public void facet_maintainability_rating_is_sticky() { - addDocs( + index( // docs with rating A - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d), newMeasure(NCLOC, 100d), newMeasure(COVERAGE, 0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d), newMeasure(NCLOC, 200d), newMeasure(COVERAGE, 0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d), newMeasure(NCLOC, 999d), newMeasure(COVERAGE, 0d))), + newDoc(MAINTAINABILITY_RATING, 1d, NCLOC, 100d, COVERAGE, 0d), + newDoc(MAINTAINABILITY_RATING, 1d, NCLOC, 200d, COVERAGE, 0d), + newDoc(MAINTAINABILITY_RATING, 1d, NCLOC, 999d, COVERAGE, 0d), // docs with rating B - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 2d), newMeasure(NCLOC, 2000d), newMeasure(COVERAGE, 0d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 2d), newMeasure(NCLOC, 5000d), newMeasure(COVERAGE, 0d))), + newDoc(MAINTAINABILITY_RATING, 2d, NCLOC, 2000d, COVERAGE, 0d), + newDoc(MAINTAINABILITY_RATING, 2d, NCLOC, 5000d, COVERAGE, 0d), // docs with rating C - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d), newMeasure(NCLOC, 20000d), newMeasure(COVERAGE, 0d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d), newMeasure(NCLOC, 30000d), newMeasure(COVERAGE, 0d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d), newMeasure(NCLOC, 40000d), newMeasure(COVERAGE, 0d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d), newMeasure(NCLOC, 50000d), newMeasure(COVERAGE, 0d))), + newDoc(MAINTAINABILITY_RATING, 3d, NCLOC, 20000d, COVERAGE, 0d), + newDoc(MAINTAINABILITY_RATING, 3d, NCLOC, 30000d, COVERAGE, 0d), + newDoc(MAINTAINABILITY_RATING, 3d, NCLOC, 40000d, COVERAGE, 0d), + newDoc(MAINTAINABILITY_RATING, 3d, NCLOC, 50000d, COVERAGE, 0d), // docs with rating D - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 4d), newMeasure(NCLOC, 120000d), newMeasure(COVERAGE, 0d))), + newDoc(MAINTAINABILITY_RATING, 4d, NCLOC, 120000d, COVERAGE, 0d), // docs with rating E - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d), newMeasure(NCLOC, 600000d), newMeasure(COVERAGE, 40d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d), newMeasure(NCLOC, 700000d), newMeasure(COVERAGE, 50d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d), newMeasure(NCLOC, 800000d), newMeasure(COVERAGE, 60d)))); + newDoc(MAINTAINABILITY_RATING, 5d, NCLOC, 600000d, COVERAGE, 40d), + newDoc(MAINTAINABILITY_RATING, 5d, NCLOC, 700000d, COVERAGE, 50d), + newDoc(MAINTAINABILITY_RATING, 5d, NCLOC, 800000d, COVERAGE, 60d)); Facets facets = underTest.search(new ProjectMeasuresQuery() .addMetricCriterion(new MetricCriterion(MAINTAINABILITY_RATING, Operator.LT, 3d)) @@ -676,27 +661,26 @@ public class ProjectMeasuresIndexTest { @Test public void facet_maintainability_rating_contains_only_projects_authorized_for_user() throws Exception { - userSession.login("john").setUserId(10); - // User can see these projects - addDocs(10L, null, + indexForUser(USER1, // 3 docs with rating A - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 1d))), + newDoc(MAINTAINABILITY_RATING, 1d), + newDoc(MAINTAINABILITY_RATING, 1d), + newDoc(MAINTAINABILITY_RATING, 1d), // 2 docs with rating B - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 2d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 2d)))); + newDoc(MAINTAINABILITY_RATING, 2d), + newDoc(MAINTAINABILITY_RATING, 2d)); // User cannot see these projects - addDocs(33L, null, + indexForUser(USER2, // docs with rating C - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 3d))), + newDoc(MAINTAINABILITY_RATING, 3d), // docs with rating D - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 4d))), + newDoc(MAINTAINABILITY_RATING, 4d), // docs with rating E - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(MAINTAINABILITY_RATING, 5d)))); + newDoc(MAINTAINABILITY_RATING, 5d)); + userSession.login(USER1); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(MAINTAINABILITY_RATING)).getFacets(); assertThat(facets.get(MAINTAINABILITY_RATING)).containsExactly( @@ -709,28 +693,28 @@ public class ProjectMeasuresIndexTest { @Test public void facet_reliability_rating() { - addDocs( + index( // 3 docs with rating A - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 1d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 1d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 1d))), + newDoc(RELIABILITY_RATING, 1d), + newDoc(RELIABILITY_RATING, 1d), + newDoc(RELIABILITY_RATING, 1d), // 2 docs with rating B - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 2d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 2d))), + newDoc(RELIABILITY_RATING, 2d), + newDoc(RELIABILITY_RATING, 2d), // 4 docs with rating C - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 3d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 3d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 3d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 3d))), + newDoc(RELIABILITY_RATING, 3d), + newDoc(RELIABILITY_RATING, 3d), + newDoc(RELIABILITY_RATING, 3d), + newDoc(RELIABILITY_RATING, 3d), // 2 docs with rating D - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 4d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 4d))), + newDoc(RELIABILITY_RATING, 4d), + newDoc(RELIABILITY_RATING, 4d), // 5 docs with rating E - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 5d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 5d))), - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 5d))), - newDoc("P54", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 5d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(RELIABILITY_RATING, 5d)))); + newDoc(RELIABILITY_RATING, 5d), + newDoc(RELIABILITY_RATING, 5d), + newDoc(RELIABILITY_RATING, 5d), + newDoc(RELIABILITY_RATING, 5d), + newDoc(RELIABILITY_RATING, 5d)); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(RELIABILITY_RATING)).getFacets(); @@ -744,28 +728,28 @@ public class ProjectMeasuresIndexTest { @Test public void facet_security_rating() { - addDocs( + index( // 3 docs with rating A - newDoc("P11", "K1", "N1").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 1.0d))), - newDoc("P12", "K1", "N1").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 1.0d))), - newDoc("P13", "K1", "N1").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 1.0d))), + newDoc(SECURITY_RATING, 1.0d), + newDoc(SECURITY_RATING, 1.0d), + newDoc(SECURITY_RATING, 1.0d), // 2 docs with rating B - newDoc("P21", "K2", "N2").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 2.0d))), - newDoc("P22", "K2", "N2").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 2.0d))), + newDoc(SECURITY_RATING, 2.0d), + newDoc(SECURITY_RATING, 2.0d), // 4 docs with rating C - newDoc("P31", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 3.0d))), - newDoc("P32", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 3.0d))), - newDoc("P33", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 3.0d))), - newDoc("P34", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 3.0d))), + newDoc(SECURITY_RATING, 3.0d), + newDoc(SECURITY_RATING, 3.0d), + newDoc(SECURITY_RATING, 3.0d), + newDoc(SECURITY_RATING, 3.0d), // 2 docs with rating D - newDoc("P41", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 4.0d))), - newDoc("P42", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 4.0d))), + newDoc(SECURITY_RATING, 4.0d), + newDoc(SECURITY_RATING, 4.0d), // 5 docs with rating E - newDoc("P51", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 5.0d))), - newDoc("P52", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 5.0d))), - newDoc("P53", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 5.0d))), - newDoc("P54", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 5.0d))), - newDoc("P55", "K3", "N3").setMeasures(newArrayList(newMeasure(SECURITY_RATING, 5.0d)))); + newDoc(SECURITY_RATING, 5.0d), + newDoc(SECURITY_RATING, 5.0d), + newDoc(SECURITY_RATING, 5.0d), + newDoc(SECURITY_RATING, 5.0d), + newDoc(SECURITY_RATING, 5.0d)); Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(SECURITY_RATING)).getFacets(); @@ -779,19 +763,19 @@ public class ProjectMeasuresIndexTest { @Test public void facet_quality_gate() { - addDocs( + index( // 2 docs with QG OK - newDoc("P11", "K1", "N1").setQualityGate(OK.name()), - newDoc("P12", "K1", "N1").setQualityGate(OK.name()), + newDoc().setQualityGate(OK.name()), + newDoc().setQualityGate(OK.name()), // 3 docs with QG WARN - newDoc("P21", "K1", "N1").setQualityGate(WARN.name()), - newDoc("P22", "K1", "N1").setQualityGate(WARN.name()), - newDoc("P23", "K1", "N1").setQualityGate(WARN.name()), + newDoc().setQualityGate(WARN.name()), + newDoc().setQualityGate(WARN.name()), + newDoc().setQualityGate(WARN.name()), // 4 docs with QG ERROR - newDoc("P31", "K1", "N1").setQualityGate(ERROR.name()), - newDoc("P32", "K1", "N1").setQualityGate(ERROR.name()), - newDoc("P33", "K1", "N1").setQualityGate(ERROR.name()), - newDoc("P34", "K1", "N1").setQualityGate(ERROR.name())); + newDoc().setQualityGate(ERROR.name()), + newDoc().setQualityGate(ERROR.name()), + newDoc().setQualityGate(ERROR.name()), + newDoc().setQualityGate(ERROR.name())); LinkedHashMap<String, Long> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(ALERT_STATUS_KEY)).getFacets().get(ALERT_STATUS_KEY); @@ -803,19 +787,19 @@ public class ProjectMeasuresIndexTest { @Test public void facet_quality_gate_is_sticky() { - addDocs( + index( // 2 docs with QG OK - newDoc("P11", "K1", "N1").setQualityGate(OK.name()).setMeasures(newArrayList(newMeasure(NCLOC, 10d), newMeasure(COVERAGE, 0d))), - newDoc("P12", "K1", "N1").setQualityGate(OK.name()).setMeasures(newArrayList(newMeasure(NCLOC, 10d), newMeasure(COVERAGE, 0d))), + newDoc(NCLOC, 10d, COVERAGE, 0d).setQualityGate(OK.name()), + newDoc(NCLOC, 10d, COVERAGE, 0d).setQualityGate(OK.name()), // 3 docs with QG WARN - newDoc("P21", "K1", "N1").setQualityGate(WARN.name()).setMeasures(newArrayList(newMeasure(NCLOC, 100d), newMeasure(COVERAGE, 0d))), - newDoc("P22", "K1", "N1").setQualityGate(WARN.name()).setMeasures(newArrayList(newMeasure(NCLOC, 100d), newMeasure(COVERAGE, 0d))), - newDoc("P23", "K1", "N1").setQualityGate(WARN.name()).setMeasures(newArrayList(newMeasure(NCLOC, 100d), newMeasure(COVERAGE, 0d))), + newDoc(NCLOC, 100d, COVERAGE, 0d).setQualityGate(WARN.name()), + newDoc(NCLOC, 100d, COVERAGE, 0d).setQualityGate(WARN.name()), + newDoc(NCLOC, 100d, COVERAGE, 0d).setQualityGate(WARN.name()), // 4 docs with QG ERROR - newDoc("P31", "K1", "N1").setQualityGate(ERROR.name()).setMeasures(newArrayList(newMeasure(NCLOC, 100d), newMeasure(COVERAGE, 0d))), - newDoc("P32", "K1", "N1").setQualityGate(ERROR.name()).setMeasures(newArrayList(newMeasure(NCLOC, 5000d), newMeasure(COVERAGE, 40d))), - newDoc("P33", "K1", "N1").setQualityGate(ERROR.name()).setMeasures(newArrayList(newMeasure(NCLOC, 12000d), newMeasure(COVERAGE, 50d))), - newDoc("P34", "K1", "N1").setQualityGate(ERROR.name()).setMeasures(newArrayList(newMeasure(NCLOC, 13000d), newMeasure(COVERAGE, 60d)))); + newDoc(NCLOC, 100d, COVERAGE, 0d).setQualityGate(ERROR.name()), + newDoc(NCLOC, 5000d, COVERAGE, 40d).setQualityGate(ERROR.name()), + newDoc(NCLOC, 12000d, COVERAGE, 50d).setQualityGate(ERROR.name()), + newDoc(NCLOC, 13000d, COVERAGE, 60d).setQualityGate(ERROR.name())); Facets facets = underTest.search(new ProjectMeasuresQuery() .setQualityGateStatus(ERROR) @@ -838,26 +822,25 @@ public class ProjectMeasuresIndexTest { @Test public void facet_quality_gate_contains_only_projects_authorized_for_user() throws Exception { - userSession.login("john").setUserId(10); - // User can see these projects - addDocs(10L, null, + indexForUser(USER1, // 2 docs with QG OK - newDoc("P11", "K1", "N1").setQualityGate(OK.name()), - newDoc("P12", "K1", "N1").setQualityGate(OK.name()), + newDoc().setQualityGate(OK.name()), + newDoc().setQualityGate(OK.name()), // 3 docs with QG WARN - newDoc("P21", "K1", "N1").setQualityGate(WARN.name()), - newDoc("P22", "K1", "N1").setQualityGate(WARN.name()), - newDoc("P23", "K1", "N1").setQualityGate(WARN.name())); + newDoc().setQualityGate(WARN.name()), + newDoc().setQualityGate(WARN.name()), + newDoc().setQualityGate(WARN.name())); // User cannot see these projects - addDocs(33L, null, + indexForUser(USER2, // 4 docs with QG ERROR - newDoc("P31", "K1", "N1").setQualityGate(ERROR.name()), - newDoc("P32", "K1", "N1").setQualityGate(ERROR.name()), - newDoc("P33", "K1", "N1").setQualityGate(ERROR.name()), - newDoc("P34", "K1", "N1").setQualityGate(ERROR.name())); + newDoc().setQualityGate(ERROR.name()), + newDoc().setQualityGate(ERROR.name()), + newDoc().setQualityGate(ERROR.name()), + newDoc().setQualityGate(ERROR.name())); + userSession.login(USER1); LinkedHashMap<String, Long> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(ALERT_STATUS_KEY)).getFacets().get(ALERT_STATUS_KEY); assertThat(result).containsExactly( @@ -866,38 +849,78 @@ public class ProjectMeasuresIndexTest { entry(OK.name(), 2L)); } - private void addDocs(ProjectMeasuresDoc... docs) { - addDocs(null, ANYONE, docs); + private void index(ProjectMeasuresDoc... docs) { + es.putDocuments(INDEX_PROJECT_MEASURES, TYPE_PROJECT_MEASURE, docs); + for (ProjectMeasuresDoc doc : docs) { + PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(doc.getId(), System.currentTimeMillis(), Qualifiers.PROJECT); + access.allowAnyone(); + authorizationIndexerTester.allow(access); + } } - private void addDocs(@Nullable Long authorizeUser, @Nullable String authorizedGroup, ProjectMeasuresDoc... docs) { - try { - es.putDocuments(INDEX_PROJECT_MEASURES, TYPE_PROJECT_MEASURE, docs); - - for (ProjectMeasuresDoc doc : docs) { - PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(doc.getId(), System.currentTimeMillis(), Qualifiers.PROJECT); - if (authorizedGroup != null) { - access.addGroupName(authorizedGroup); - } - if (authorizeUser != null) { - access.addUser(authorizeUser); - } - authorizationIndexerTester.allow(access); + private void indexForUser(UserDto user, ProjectMeasuresDoc... docs) { + es.putDocuments(INDEX_PROJECT_MEASURES, TYPE_PROJECT_MEASURE, docs); + for (ProjectMeasuresDoc doc : docs) { + PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(doc.getId(), System.currentTimeMillis(), Qualifiers.PROJECT); + access.addUserId(user.getId()); + authorizationIndexerTester.allow(access); + } + } - } - } catch (Exception e) { - Throwables.propagate(e); + private void indexForGroup(GroupDto group, ProjectMeasuresDoc... docs) { + es.putDocuments(INDEX_PROJECT_MEASURES, TYPE_PROJECT_MEASURE, docs); + for (ProjectMeasuresDoc doc : docs) { + PermissionIndexerDao.Dto access = new PermissionIndexerDao.Dto(doc.getId(), System.currentTimeMillis(), Qualifiers.PROJECT); + access.addGroupId(group.getId()); + authorizationIndexerTester.allow(access); } } - private static ProjectMeasuresDoc newDoc(String uuid, String key, String name) { + private static ProjectMeasuresDoc newDoc(ComponentDto project) { return new ProjectMeasuresDoc() - .setId(uuid) - .setKey(key) - .setName(name); + .setId(project.uuid()) + .setKey(project.key()) + .setName(project.name()); + } + + private static ProjectMeasuresDoc newDoc() { + return newDoc(newProjectDto(ORG)); + } + + private static ProjectMeasuresDoc newDoc(ComponentDto project, String metric1, Object value1) { + return newDoc(project).setMeasures(newArrayList(newMeasure(metric1, value1))); + } + + private static ProjectMeasuresDoc newDoc(ComponentDto project, String metric1, Object value1, String metric2, Object value2) { + return newDoc(project).setMeasures(newArrayList(newMeasure(metric1, value1), newMeasure(metric2, value2))); + } + + private static ProjectMeasuresDoc newDoc(ComponentDto project, String metric1, Object value1, String metric2, Object value2, String metric3, Object value3) { + return newDoc(project).setMeasures(newArrayList(newMeasure(metric1, value1), newMeasure(metric2, value2), newMeasure(metric3, value3))); } - private Map<String, Object> newMeasure(String key, Object value) { + private static Map<String, Object> newMeasure(String key, Object value) { return ImmutableMap.of("key", key, "value", value); } + + private static ProjectMeasuresDoc newDoc(String metric1, Object value1) { + return newDoc(newProjectDto(ORG), metric1, value1); + } + + private static ProjectMeasuresDoc newDoc(String metric1, Object value1, String metric2, Object value2) { + return newDoc(newProjectDto(ORG), metric1, value1, metric2, value2); + } + + private static ProjectMeasuresDoc newDoc(String metric1, Object value1, String metric2, Object value2, String metric3, Object value3) { + return newDoc(newProjectDto(ORG), metric1, value1, metric2, value2, metric3, value3); + } + + private void assertResults(ProjectMeasuresQuery query, ComponentDto... expectedProjects) { + List<String> result = underTest.search(query, new SearchOptions()).getIds(); + assertThat(result).containsExactly(Arrays.stream(expectedProjects).map(ComponentDto::uuid).toArray(String[]::new)); + } + + private void assertNoResults(ProjectMeasuresQuery query) { + assertResults(query); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoTest.java index 2a73cb62fcd..582db411919 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoTest.java @@ -87,30 +87,30 @@ public class PermissionIndexerDaoTest { assertThat(dtos).hasSize(4); PermissionIndexerDao.Dto project1Authorization = getByProjectUuid(project1.uuid(), dtos); - assertThat(project1Authorization.getGroupNames()).containsOnly(group.getName()); + assertThat(project1Authorization.getGroupIds()).containsOnly(group.getId()); assertThat(project1Authorization.isAllowAnyone()).isTrue(); - assertThat(project1Authorization.getUsers()).containsOnly(user1.getId()); + assertThat(project1Authorization.getUserIds()).containsOnly(user1.getId()); assertThat(project1Authorization.getUpdatedAt()).isNotNull(); assertThat(project1Authorization.getQualifier()).isEqualTo(PROJECT); PermissionIndexerDao.Dto view1Authorization = getByProjectUuid(view1.uuid(), dtos); - assertThat(view1Authorization.getGroupNames()).containsOnly(group.getName()); + assertThat(view1Authorization.getGroupIds()).containsOnly(group.getId()); assertThat(view1Authorization.isAllowAnyone()).isTrue(); - assertThat(view1Authorization.getUsers()).containsOnly(user1.getId()); + assertThat(view1Authorization.getUserIds()).containsOnly(user1.getId()); assertThat(view1Authorization.getUpdatedAt()).isNotNull(); assertThat(view1Authorization.getQualifier()).isEqualTo(VIEW); PermissionIndexerDao.Dto project2Authorization = getByProjectUuid(project2.uuid(), dtos); - assertThat(project2Authorization.getGroupNames()).isEmpty(); + assertThat(project2Authorization.getGroupIds()).isEmpty(); assertThat(project2Authorization.isAllowAnyone()).isTrue(); - assertThat(project2Authorization.getUsers()).containsOnly(user1.getId(), user2.getId()); + assertThat(project2Authorization.getUserIds()).containsOnly(user1.getId(), user2.getId()); assertThat(project2Authorization.getUpdatedAt()).isNotNull(); assertThat(project2Authorization.getQualifier()).isEqualTo(PROJECT); PermissionIndexerDao.Dto view2Authorization = getByProjectUuid(view2.uuid(), dtos); - assertThat(view2Authorization.getGroupNames()).isEmpty(); + assertThat(view2Authorization.getGroupIds()).isEmpty(); assertThat(view2Authorization.isAllowAnyone()).isTrue(); - assertThat(view2Authorization.getUsers()).containsOnly(user1.getId(), user2.getId()); + assertThat(view2Authorization.getUserIds()).containsOnly(user1.getId(), user2.getId()); assertThat(view2Authorization.getUpdatedAt()).isNotNull(); assertThat(view2Authorization.getQualifier()).isEqualTo(VIEW); } @@ -125,30 +125,30 @@ public class PermissionIndexerDaoTest { assertThat(dtos).hasSize(4); PermissionIndexerDao.Dto project1Authorization = dtos.get(project1.uuid()); - assertThat(project1Authorization.getGroupNames()).containsOnly(group.getName()); + assertThat(project1Authorization.getGroupIds()).containsOnly(group.getId()); assertThat(project1Authorization.isAllowAnyone()).isTrue(); - assertThat(project1Authorization.getUsers()).containsOnly(user1.getId()); + assertThat(project1Authorization.getUserIds()).containsOnly(user1.getId()); assertThat(project1Authorization.getUpdatedAt()).isNotNull(); assertThat(project1Authorization.getQualifier()).isEqualTo(PROJECT); PermissionIndexerDao.Dto view1Authorization = dtos.get(view1.uuid()); - assertThat(view1Authorization.getGroupNames()).containsOnly(group.getName()); + assertThat(view1Authorization.getGroupIds()).containsOnly(group.getId()); assertThat(view1Authorization.isAllowAnyone()).isTrue(); - assertThat(view1Authorization.getUsers()).containsOnly(user1.getId()); + assertThat(view1Authorization.getUserIds()).containsOnly(user1.getId()); assertThat(view1Authorization.getUpdatedAt()).isNotNull(); assertThat(view1Authorization.getQualifier()).isEqualTo(VIEW); PermissionIndexerDao.Dto project2Authorization = dtos.get(project2.uuid()); - assertThat(project2Authorization.getGroupNames()).isEmpty(); + assertThat(project2Authorization.getGroupIds()).isEmpty(); assertThat(project2Authorization.isAllowAnyone()).isTrue(); - assertThat(project2Authorization.getUsers()).containsOnly(user1.getId(), user2.getId()); + assertThat(project2Authorization.getUserIds()).containsOnly(user1.getId(), user2.getId()); assertThat(project2Authorization.getUpdatedAt()).isNotNull(); assertThat(project2Authorization.getQualifier()).isEqualTo(PROJECT); PermissionIndexerDao.Dto view2Authorization = dtos.get(view2.uuid()); - assertThat(view2Authorization.getGroupNames()).isEmpty(); + assertThat(view2Authorization.getGroupIds()).isEmpty(); assertThat(view2Authorization.isAllowAnyone()).isTrue(); - assertThat(view2Authorization.getUsers()).containsOnly(user1.getId(), user2.getId()); + assertThat(view2Authorization.getUserIds()).containsOnly(user1.getId(), user2.getId()); assertThat(view2Authorization.getUpdatedAt()).isNotNull(); assertThat(view2Authorization.getQualifier()).isEqualTo(VIEW); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java index 60bb699a576..3f55fab877f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java @@ -60,7 +60,7 @@ public class PermissionIndexerTest { private FooIndex fooIndex = new FooIndex(esTester.client(), new AuthorizationTypeSupport(userSession)); private FooIndexer fooIndexer = new FooIndexer(esTester.client()); private PermissionIndexer underTest = new PermissionIndexer( - dbTester.getDbClient(), esTester.client(), new NeedAuthorizationIndexer[] {fooIndexer}); + dbTester.getDbClient(), esTester.client(), fooIndexer); @Before public void setUp() throws Exception { @@ -253,7 +253,7 @@ public class PermissionIndexerTest { } private void verifyAuthorized(ComponentDto project, UserDto user, GroupDto group) { - logIn(user).setUserGroups(group.getName()); + logIn(user).setGroups(group); verifyAuthorized(project, true); } @@ -263,7 +263,7 @@ public class PermissionIndexerTest { } private void verifyNotAuthorized(ComponentDto project, UserDto user, GroupDto group) { - logIn(user).setUserGroups(group.getName()); + logIn(user).setGroups(group); verifyAuthorized(project, false); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java index 29dfa966ab8..2481374bdf8 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java @@ -23,6 +23,8 @@ package org.sonar.server.permission.index; import java.util.Arrays; import java.util.stream.Stream; import org.sonar.db.component.ComponentDto; +import org.sonar.db.user.GroupDto; +import org.sonar.db.user.UserDto; import org.sonar.server.es.EsTester; import static java.util.Arrays.asList; @@ -32,27 +34,27 @@ public class PermissionIndexerTester { private final PermissionIndexer permissionIndexer; public PermissionIndexerTester(EsTester esTester, NeedAuthorizationIndexer indexer, NeedAuthorizationIndexer... others) { - NeedAuthorizationIndexer[] indexers = Stream.concat(Stream.of(indexer), Arrays.stream(others)).toArray(i -> new NeedAuthorizationIndexer[i]); + NeedAuthorizationIndexer[] indexers = Stream.concat(Stream.of(indexer), Arrays.stream(others)).toArray(NeedAuthorizationIndexer[]::new); this.permissionIndexer = new PermissionIndexer(null, esTester.client(), indexers); } public PermissionIndexerTester allowOnlyAnyone(ComponentDto project) { - PermissionIndexerDao.Dto dto = new PermissionIndexerDao.Dto(project.uuid(), System.currentTimeMillis(), project.qualifier()) - .addGroupName("Anyone"); + PermissionIndexerDao.Dto dto = new PermissionIndexerDao.Dto(project.uuid(), System.currentTimeMillis(), project.qualifier()); + dto.allowAnyone(); permissionIndexer.index(asList(dto)); return this; } - public PermissionIndexerTester allowOnlyUser(ComponentDto project, long userId) { + public PermissionIndexerTester allowOnlyUser(ComponentDto project, UserDto user) { PermissionIndexerDao.Dto dto = new PermissionIndexerDao.Dto(project.uuid(), System.currentTimeMillis(), project.qualifier()) - .addUser(userId); + .addUserId(user.getId()); permissionIndexer.index(asList(dto)); return this; } - public PermissionIndexerTester allowOnlyGroup(ComponentDto project, String groupName) { + public PermissionIndexerTester allowOnlyGroup(ComponentDto project, GroupDto group) { PermissionIndexerDao.Dto dto = new PermissionIndexerDao.Dto(project.uuid(), System.currentTimeMillis(), project.qualifier()) - .addGroupName(groupName); + .addGroupId(group.getId()); permissionIndexer.index(asList(dto)); return this; } diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java b/server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java index 418f7877b92..745c18c15d2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java +++ b/server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java @@ -19,8 +19,11 @@ */ package org.sonar.server.tester; +import com.google.common.collect.Sets; import java.util.Collection; import java.util.Collections; +import java.util.Set; +import org.sonar.api.security.DefaultGroups; import org.sonar.db.user.GroupDto; public class AnonymousMockUserSession extends AbstractMockUserSession<AnonymousMockUserSession> { @@ -58,4 +61,9 @@ public class AnonymousMockUserSession extends AbstractMockUserSession<AnonymousM public Collection<GroupDto> getGroups() { return Collections.emptyList(); } + + @Override + public Set<String> getUserGroups() { + return Sets.newHashSet(DefaultGroups.ANYONE); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java b/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java index ebf2acd7833..cdc79c89ceb 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java +++ b/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java @@ -23,6 +23,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.sonar.api.security.DefaultGroups; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; @@ -100,4 +104,10 @@ public class MockUserSession extends AbstractMockUserSession<MockUserSession> { this.groups = asList(groups); return this; } + + @Override + public Set<String> getUserGroups() { + return Stream.concat(Stream.of(DefaultGroups.ANYONE),groups.stream().map(GroupDto::getName)) + .collect(Collectors.toSet()); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java b/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java index 877582c215e..66d0c4fb50a 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java @@ -20,17 +20,20 @@ package org.sonar.server.tester; import org.junit.Test; -import org.sonar.server.user.UserSession; +import org.sonar.db.user.GroupDto; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.db.user.GroupTesting.newGroupDto; public class MockUserSessionTest { @Test public void set_mock_session() { - MockUserSession mock = new MockUserSession("simon").setUserGroups("sonar-users"); + GroupDto group = newGroupDto(); + MockUserSession mock = new MockUserSession("foo").setGroups(group); - assertThat(mock.getLogin()).isEqualTo("simon"); - assertThat(mock.getUserGroups()).containsOnly("sonar-users", "Anyone"); + assertThat(mock.getLogin()).isEqualTo("foo"); + assertThat(mock.getGroups()).extracting(GroupDto::getId).containsOnly(group.getId()); + assertThat(mock.getUserGroups()).containsOnly(group.getName(), "Anyone"); assertThat(mock.globalPermissions()).isEmpty(); assertThat(mock.isLoggedIn()).isTrue(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java b/server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java index b86e7ab2e21..5f0b6cd9501 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java @@ -214,8 +214,12 @@ public class UserSessionRule implements TestRule, UserSession { return this; } - public UserSessionRule setUserGroups(@Nullable String... userGroups) { - ensureAbstractMockUserSession().setUserGroups(userGroups); + /** + * Groups that user is member of. User must be logged in. An exception + * is thrown if session is anonymous. + */ + public UserSessionRule setGroups(GroupDto... groups) { + ensureMockUserSession().setGroups(groups); return this; } diff --git a/server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java index ad95f214a91..2b2982ab26c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java @@ -36,11 +36,21 @@ import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueTesting; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDto; +import org.sonar.db.rule.RuleTesting; import org.sonar.server.es.EsTester; +import org.sonar.server.es.SearchOptions; +import org.sonar.server.es.SearchResult; +import org.sonar.server.issue.IssueQuery; +import org.sonar.server.issue.index.IssueDoc; +import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.issue.index.IssueIndexDefinition; +import org.sonar.server.issue.index.IssueIndexer; +import org.sonar.server.permission.index.AuthorizationTypeSupport; +import org.sonar.server.permission.index.PermissionIndexer; import org.sonar.server.tester.UserSessionRule; import static com.google.common.collect.Lists.newArrayList; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; public class ViewIndexerTest { @@ -58,7 +68,8 @@ public class ViewIndexerTest { private DbClient dbClient = dbTester.getDbClient(); private DbSession dbSession = dbTester.getSession(); - //private PermissionIndexer permissionIndexer = new PermissionIndexer(dbClient, esTester.client(), new NeedAuthorizationIndexer[]{underTest}); + private IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client()); + private PermissionIndexer permissionIndexer = new PermissionIndexer(dbClient, esTester.client(), issueIndexer); private ViewIndexer underTest = (ViewIndexer) new ViewIndexer(system2, dbClient, esTester.client()); @Test @@ -124,45 +135,45 @@ public class ViewIndexerTest { assertThat(view.projects()).containsOnly("KLMN", "JKLM"); } -// @Test -// public void clear_views_lookup_cache_on_index_view_uuid() { -// IssueIndex issueIndex = new IssueIndex(esTester.client(), System2.INSTANCE, userSessionRule, new AuthorizationTypeSupport(userSessionRule)); -// IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client()); -// -// String viewUuid = "ABCD"; -// -// RuleDto rule = RuleTesting.newXooX1(); -// dbClient.ruleDao().insert(dbSession, rule); -// ComponentDto project1 = addProjectWithIssue(rule, dbTester.organizations().insert()); -// issueIndexer.indexAll(); -// permissionIndexer.indexProjectsByUuids(dbSession, project1.uuid()); -// -// OrganizationDto organizationDto = dbTester.organizations().insert(); -// ComponentDto view = ComponentTesting.newView(organizationDto, "ABCD"); -// ComponentDto techProject1 = ComponentTesting.newProjectCopy("CDEF", project1, view); -// dbClient.componentDao().insert(dbSession, view, techProject1); -// dbSession.commit(); -// -// // First view indexation -// underTest.index(viewUuid); -// -// // Execute issue query on view -> 1 issue on view -// SearchResult<IssueDoc> docs = issueIndex.search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new SearchOptions()); -// assertThat(docs.getDocs()).hasSize(1); -// -// // Add a project to the view and index it again -// ComponentDto project2 = addProjectWithIssue(rule, organizationDto); -// issueIndexer.indexAll(); -// permissionIndexer.indexProjectsByUuids(dbSession, project2.uuid()); -// -// ComponentDto techProject2 = ComponentTesting.newProjectCopy("EFGH", project2, view); -// dbClient.componentDao().insert(dbSession, techProject2); -// dbSession.commit(); -// underTest.index(viewUuid); -// -// // Execute issue query on view -> issue of project2 are well taken into account : the cache has been cleared -// assertThat(issueIndex.search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new SearchOptions()).getDocs()).hasSize(2); -// } + @Test + public void clear_views_lookup_cache_on_index_view_uuid() { + IssueIndex issueIndex = new IssueIndex(esTester.client(), System2.INSTANCE, userSessionRule, new AuthorizationTypeSupport(userSessionRule)); + IssueIndexer issueIndexer = new IssueIndexer(system2, dbClient, esTester.client()); + + String viewUuid = "ABCD"; + + RuleDto rule = RuleTesting.newXooX1(); + dbClient.ruleDao().insert(dbSession, rule); + ComponentDto project1 = addProjectWithIssue(rule, dbTester.organizations().insert()); + issueIndexer.indexAll(); + permissionIndexer.indexProjectsByUuids(dbSession, asList(project1.uuid())); + + OrganizationDto organizationDto = dbTester.organizations().insert(); + ComponentDto view = ComponentTesting.newView(organizationDto, "ABCD"); + ComponentDto techProject1 = ComponentTesting.newProjectCopy("CDEF", project1, view); + dbClient.componentDao().insert(dbSession, view, techProject1); + dbSession.commit(); + + // First view indexation + underTest.index(viewUuid); + + // Execute issue query on view -> 1 issue on view + SearchResult<IssueDoc> docs = issueIndex.search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new SearchOptions()); + assertThat(docs.getDocs()).hasSize(1); + + // Add a project to the view and index it again + ComponentDto project2 = addProjectWithIssue(rule, organizationDto); + issueIndexer.indexAll(); + permissionIndexer.indexProjectsByUuids(dbSession, asList(project2.uuid())); + + ComponentDto techProject2 = ComponentTesting.newProjectCopy("EFGH", project2, view); + dbClient.componentDao().insert(dbSession, techProject2); + dbSession.commit(); + underTest.index(viewUuid); + + // Execute issue query on view -> issue of project2 are well taken into account : the cache has been cleared + assertThat(issueIndex.search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new SearchOptions()).getDocs()).hasSize(2); + } private ComponentDto addProjectWithIssue(RuleDto rule, OrganizationDto org) { ComponentDto project = ComponentTesting.newProjectDto(org); diff --git a/sonar-db/src/test/java/org/sonar/db/user/GroupTesting.java b/sonar-db/src/test/java/org/sonar/db/user/GroupTesting.java index 9291bffa9fb..3065bc65405 100644 --- a/sonar-db/src/test/java/org/sonar/db/user/GroupTesting.java +++ b/sonar-db/src/test/java/org/sonar/db/user/GroupTesting.java @@ -32,6 +32,7 @@ public class GroupTesting { public static GroupDto newGroupDto() { GroupDto group = new GroupDto() + .setId(nextLong()) .setOrganizationUuid(randomAlphanumeric(40)) .setName(randomAlphanumeric(255)) .setDescription(randomAlphanumeric(200)) diff --git a/sonar-db/src/test/java/org/sonar/db/user/UserTesting.java b/sonar-db/src/test/java/org/sonar/db/user/UserTesting.java index 9b401afe6cc..24f9b0f17a0 100644 --- a/sonar-db/src/test/java/org/sonar/db/user/UserTesting.java +++ b/sonar-db/src/test/java/org/sonar/db/user/UserTesting.java @@ -23,6 +23,7 @@ import javax.annotation.Nullable; import static java.util.Collections.singletonList; import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; +import static org.apache.commons.lang.math.RandomUtils.nextInt; import static org.apache.commons.lang.math.RandomUtils.nextLong; public class UserTesting { @@ -33,6 +34,7 @@ public class UserTesting { public static UserDto newUserDto(String login, String name, @Nullable String email) { return new UserDto() + .setId((long)nextInt()) .setActive(true) .setLocal(true) .setName(name) @@ -49,6 +51,7 @@ public class UserTesting { public static UserDto newLocalUser(String login, String name, @Nullable String email) { return new UserDto() + .setId((long)nextInt()) .setActive(true) .setLocal(true) .setName(name) @@ -65,6 +68,7 @@ public class UserTesting { public static UserDto newExternalUser(String login, String name, @Nullable String email) { return new UserDto() + .setId((long)nextInt()) .setActive(true) .setLocal(false) .setName(name) @@ -79,6 +83,7 @@ public class UserTesting { public static UserDto newDisabledUser(String login) { return new UserDto() + .setId((long)nextInt()) .setLogin(login) .setActive(false) .setCreatedAt(nextLong()) |