@Test public void iterator_over_one_issue() { dbTester.prepareDbUnit(getClass(), "one_issue.xml"); Map<String, IssueDoc> issuesByKey = issuesByKey(); assertThat(issuesByKey).hasSize(1); IssueDoc issue = issuesByKey.get("ABC"); assertThat(issue.key()).isEqualTo("ABC"); assertThat(issue.resolution()).isEqualTo("FIXED"); assertThat(issue.status()).isEqualTo("RESOLVED"); assertThat(issue.severity()).isEqualTo("BLOCKER"); assertThat(issue.assigneeUuid()).isEqualTo("uuid-of-guy1"); assertThat(issue.authorLogin()).isEqualTo("guy2"); assertThat(issue.line()).isEqualTo(444); assertThat(issue.ruleId()).isEqualTo(200); assertThat(issue.componentUuid()).isEqualTo("FILE1"); assertThat(issue.projectUuid()).isEqualTo("PROJECT1"); assertThat(issue.moduleUuid()).isEqualTo("PROJECT1"); assertThat(issue.modulePath()).isEqualTo(".PROJECT1."); assertThat(issue.directoryPath()).isEqualTo("src/main/java"); assertThat(issue.filePath()).isEqualTo("src/main/java/Action.java"); assertThat(issue.getTags()).containsOnly("tag1", "tag2", "tag3"); assertThat(issue.effort().toMinutes()).isGreaterThan(0L); assertThat(issue.type().getDbConstant()).isEqualTo(2); }
@Override protected IssueDoc read(ResultSet rs) throws SQLException { IssueDoc doc = new IssueDoc(Maps.newHashMapWithExpectedSize(30)); doc.setKey(key); doc.setAssigneeUuid(rs.getString(2)); doc.setLine(DatabaseUtils.getInt(rs, 3)); doc.setResolution(rs.getString(4)); doc.setSeverity(rs.getString(5)); doc.setStatus(rs.getString(6)); doc.setEffort(getLong(rs, 7)); doc.setAuthorLogin(rs.getString(8)); doc.setFuncCloseDate(longToDate(getLong(rs, 9))); doc.setFuncCreationDate(longToDate(getLong(rs, 10))); doc.setFuncUpdateDate(longToDate(getLong(rs, 11))); Integer ruleId = rs.getInt(12); doc.setRuleId(ruleId); doc.setLanguage(rs.getString(13)); doc.setComponentUuid(rs.getString(14)); String moduleUuidPath = rs.getString(15); doc.setModuleUuid(extractModule(moduleUuidPath)); doc.setModuleUuidPath(moduleUuidPath); String scope = rs.getString(17); String filePath = extractFilePath(rs.getString(16), scope); doc.setFilePath(filePath); doc.setDirectoryPath(extractDirPath(doc.filePath(), scope)); doc.setOrganizationUuid(rs.getString(18)); String branchUuid = rs.getString(19); String mainBranchProjectUuid = DatabaseUtils.getString(rs, 20); doc.setBranchUuid(branchUuid);
private IndexRequest newIndexRequest(IssueDoc issue) { String projectUuid = issue.projectUuid(); return esClient.prepareIndex(INDEX_TYPE_ISSUE) .setId(issue.key()) .setRouting(projectUuid) .setParent(projectUuid) .setSource(issue.getFields()) .request(); }
assertThat(doc.getId()).isEqualTo(issue.getKey()); assertThat(doc.organizationUuid()).isEqualTo(organization.getUuid()); assertThat(doc.assigneeUuid()).isEqualTo(issue.getAssigneeUuid()); assertThat(doc.authorLogin()).isEqualTo(issue.getAuthorLogin()); assertThat(doc.componentUuid()).isEqualTo(file.uuid()); assertThat(doc.projectUuid()).isEqualTo(project.uuid()); assertThat(doc.branchUuid()).isEqualTo(project.uuid()); assertThat(doc.isMainBranch()).isTrue(); assertThat(doc.closeDate()).isEqualTo(issue.getIssueCloseDate()); assertThat(doc.creationDate()).isEqualToIgnoringMillis(issue.getIssueCreationDate()); assertThat(doc.directoryPath()).isEqualTo(dir.path()); assertThat(doc.filePath()).isEqualTo(file.path()); assertThat(doc.getParent()).isEqualTo(project.uuid()); assertThat(doc.getRouting()).isEqualTo(project.uuid()); assertThat(doc.language()).isEqualTo(issue.getLanguage()); assertThat(doc.line()).isEqualTo(issue.getLine()); assertThat(doc.updateDate()).isEqualToIgnoringMillis(new Date(issue.getIssueUpdateTime())); assertThat(doc.getCwe()).containsExactlyInAnyOrder(UNKNOWN_STANDARD); assertThat(doc.getOwaspTop10()).containsExactlyInAnyOrder(UNKNOWN_STANDARD); assertThat(doc.getSansTop25()).isEmpty();
public static IssueDoc newDoc(String key, ComponentDto componentDto) { String mainBranchProjectUuid = componentDto.getMainBranchProjectUuid(); return newDoc() .setKey(key) .setBranchUuid(componentDto.projectUuid()) .setComponentUuid(componentDto.uuid()) .setModuleUuid(!componentDto.scope().equals(Scopes.PROJECT) ? componentDto.moduleUuid() : componentDto.uuid()) .setModuleUuidPath(componentDto.moduleUuidPath()) .setProjectUuid(mainBranchProjectUuid == null ? componentDto.projectUuid() : mainBranchProjectUuid) .setOrganizationUuid(componentDto.getOrganizationUuid()) // File path make no sens on modules and projects .setFilePath(!componentDto.scope().equals(Scopes.PROJECT) ? componentDto.path() : null) .setIsMainBranch(mainBranchProjectUuid == null); }
assertThat(issue.key()).isEqualTo("ABC"); assertThat(issue.assigneeUuid()).isEqualTo("uuid-of-guy1"); assertThat(issue.componentUuid()).isEqualTo("FILE1"); assertThat(issue.projectUuid()).isEqualTo("PROJECT1"); assertThat(issue.moduleUuid()).isEqualTo("PROJECT1"); assertThat(issue.modulePath()).isEqualTo(".PROJECT1."); assertThat(issue.directoryPath()).isEqualTo("src/main/java"); assertThat(issue.filePath()).isEqualTo("src/main/java/Action.java"); assertThat(issue.getTags()).containsOnly("tag1", "tag2", "tag3"); assertThat(issue.effort().toMinutes()).isGreaterThan(0L); assertThat(issue.type().getDbConstant()).isEqualTo(1); assertThat(issue.key()).isEqualTo("BCD"); assertThat(issue.assigneeUuid()).isEqualTo("uuid-of-guy1"); assertThat(issue.componentUuid()).isEqualTo("MODULE1"); assertThat(issue.projectUuid()).isEqualTo("PROJECT1"); assertThat(issue.moduleUuid()).isEqualTo("MODULE1"); assertThat(issue.modulePath()).isEqualTo(".PROJECT1.MODULE1."); assertThat(issue.directoryPath()).isNull(); assertThat(issue.filePath()).isNull(); assertThat(issue.getTags()).containsOnly("tag1", "tag2", "tag3"); assertThat(issue.effort().toMinutes()).isGreaterThan(0L); assertThat(issue.type().getDbConstant()).isEqualTo(2); assertThat(issue.key()).isEqualTo("DEF"); assertThat(issue.assigneeUuid()).isEqualTo("uuid-of-guy2"); assertThat(issue.componentUuid()).isEqualTo("FILE1"); assertThat(issue.projectUuid()).isEqualTo("PROJECT1"); assertThat(issue.moduleUuid()).isEqualTo("PROJECT1");
@Test public void index_issue_in_non_main_branch() { RuleDefinitionDto rule = db.rules().insert(); ComponentDto project = db.components().insertPrivateProject(organization); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("feature/foo")); ComponentDto dir = db.components().insertComponent(ComponentTesting.newDirectory(branch, "src/main/java/foo")); ComponentDto file = db.components().insertComponent(newFileDto(branch, dir, "F1")); IssueDto issue = db.issues().insertIssue(IssueTesting.newIssue(rule, branch, file)); underTest.indexOnStartup(emptySet()); IssueDoc doc = es.getDocuments(INDEX_TYPE_ISSUE, IssueDoc.class).get(0); assertThat(doc.getId()).isEqualTo(issue.getKey()); assertThat(doc.organizationUuid()).isEqualTo(organization.getUuid()); assertThat(doc.componentUuid()).isEqualTo(file.uuid()); assertThat(doc.projectUuid()).isEqualTo(branch.getMainBranchProjectUuid()); assertThat(doc.branchUuid()).isEqualTo(branch.uuid()); assertThat(doc.isMainBranch()).isFalse(); }
@Override public String getParent() { return projectUuid(); }
@Override public String getId() { return key(); }
/** * This is a technical constraint, to ensure, that the indexers can be called in any order, during startup. */ @Test public void parent_child_relationship_does_not_require_ordering_of_index_requests() { IssueDoc issueDoc = new IssueDoc(); issueDoc.setKey("key"); issueDoc.setProjectUuid("parent-does-not-exist"); new IssueIndexer(es.client(), db.getDbClient(), new IssueIteratorFactory(db.getDbClient())) .index(asList(issueDoc).iterator()); assertThat(es.countDocuments(INDEX_TYPE_ISSUE)).isEqualTo(1L); }
@Test public void list_tags() { RuleDefinitionDto r1 = db.rules().insert(); RuleDefinitionDto r2 = db.rules().insert(); ruleIndexer.commitAndIndex(db.getSession(), asList(r1.getId(), r2.getId())); OrganizationDto org = db.organizations().insert(); OrganizationDto anotherOrg = db.organizations().insert(); ComponentDto project = newPrivateProjectDto(newOrganizationDto()); ComponentDto file = newFileDto(project, null); indexIssues( newDoc("I42", file).setOrganizationUuid(anotherOrg.getUuid()).setRuleId(r1.getId()).setTags(of("another")), newDoc("I1", file).setOrganizationUuid(org.getUuid()).setRuleId(r1.getId()).setTags(of("convention", "java8", "bug")), newDoc("I2", file).setOrganizationUuid(org.getUuid()).setRuleId(r1.getId()).setTags(of("convention", "bug")), newDoc("I3", file).setOrganizationUuid(org.getUuid()).setRuleId(r2.getId()), newDoc("I4", file).setOrganizationUuid(org.getUuid()).setRuleId(r1.getId()).setTags(of("convention"))); assertThat(underTest.searchTags(IssueQuery.builder().organizationUuid(org.getUuid()).build(), null, 100)).containsOnly("convention", "java8", "bug"); assertThat(underTest.searchTags(IssueQuery.builder().organizationUuid(org.getUuid()).build(), null, 2)).containsOnly("bug", "convention"); assertThat(underTest.searchTags(IssueQuery.builder().organizationUuid(org.getUuid()).build(), "vent", 100)).containsOnly("convention"); assertThat(underTest.searchTags(IssueQuery.builder().organizationUuid(org.getUuid()).build(), null, 1)).containsOnly("bug"); assertThat(underTest.searchTags(IssueQuery.builder().organizationUuid(org.getUuid()).build(), null, 100)).containsOnly("convention", "java8", "bug"); assertThat(underTest.searchTags(IssueQuery.builder().organizationUuid(org.getUuid()).build(), "invalidRegexp[", 100)).isEmpty(); assertThat(underTest.searchTags(IssueQuery.builder().build(), null, 100)).containsExactlyInAnyOrder("another", "convention", "java8", "bug"); }
OrganizationDto organizationDto = newOrganizationDto(); ComponentDto project1 = newPrivateProjectDto(organizationDto); IssueDoc project1Issue1 = newDoc(project1).setFuncCreationDate(addDays(now, -10)); IssueDoc project1Issue2 = newDoc(project1).setFuncCreationDate(addDays(now, -20)); ComponentDto project2 = newPrivateProjectDto(organizationDto); IssueDoc project2Issue1 = newDoc(project2).setFuncCreationDate(addDays(now, -15)); IssueDoc project2Issue2 = newDoc(project2).setFuncCreationDate(addDays(now, -30)); indexIssues(project1Issue1, project1Issue2, project2Issue1, project2Issue2); project1Issue1.key()); project1.uuid(), new IssueQuery.PeriodStart(addDays(now, -14), true), project2.uuid(), new IssueQuery.PeriodStart(addDays(now, -25), true))), project1Issue1.key(), project2Issue1.key()); .createdAfterByProjectUuids(ImmutableMap.of( project1.uuid(), new IssueQuery.PeriodStart(addDays(now, -30), true))), project1Issue1.key(), project1Issue2.key());
@Test public void facets_on_authors() { ComponentDto project = ComponentTesting.newPrivateProjectDto(newOrganizationDto()); ComponentDto file = ComponentTesting.newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("I1", file).setAuthorLogin("steph").setEffort(10L), IssueDocTesting.newDoc("I2", file).setAuthorLogin("simon").setEffort(10L), IssueDocTesting.newDoc("I3", file).setAuthorLogin("simon").setEffort(10L), IssueDocTesting.newDoc("I4", file).setAuthorLogin(null).setEffort(10L)); Facets facets = new Facets(underTest.search(newQueryBuilder().build(), new SearchOptions().addFacets(asList("authors"))), system2.getDefaultTimeZone()); assertThat(facets.getNames()).containsOnly("authors", FACET_MODE_EFFORT); assertThat(facets.get("authors")).containsOnly(entry("steph", 10L), entry("simon", 20L)); assertThat(facets.get(FACET_MODE_EFFORT)).containsOnly(entry("total", 40L)); }
@Test public void facets_on_assignees() { ComponentDto project = ComponentTesting.newPrivateProjectDto(newOrganizationDto()); ComponentDto file = ComponentTesting.newFileDto(project, null); indexIssues( IssueDocTesting.newDoc("I1", file).setAssigneeUuid("uuid-steph").setEffort(10L), IssueDocTesting.newDoc("I2", file).setAssigneeUuid("uuid-simon").setEffort(10L), IssueDocTesting.newDoc("I3", file).setAssigneeUuid("uuid-simon").setEffort(10L), IssueDocTesting.newDoc("I4", file).setAssigneeUuid(null).setEffort(10L)); Facets facets = new Facets(underTest.search(newQueryBuilder().build(), new SearchOptions().addFacets(asList("assignees"))), system2.getDefaultTimeZone()); assertThat(facets.getNames()).containsOnly("assignees", FACET_MODE_EFFORT); assertThat(facets.get("assignees")).containsOnly(entry("uuid-steph", 10L), entry("uuid-simon", 20L), entry("", 10L)); assertThat(facets.get(FACET_MODE_EFFORT)).containsOnly(entry("total", 40L)); }
@Test public void filter_by_authors() { ComponentDto project = newPrivateProjectDto(newOrganizationDto()); ComponentDto file = newFileDto(project, null); indexIssues( newDoc("I1", file).setAuthorLogin("steph"), newDoc("I2", file).setAuthorLogin("marcel"), newDoc("I3", file).setAssigneeUuid(null)); assertThatSearchReturnsOnly(IssueQuery.builder().authors(singletonList("steph")), "I1"); assertThatSearchReturnsOnly(IssueQuery.builder().authors(asList("steph", "marcel")), "I1", "I2"); assertThatSearchReturnsEmpty(IssueQuery.builder().authors(singletonList("unknown"))); }
@Test public void extract_directory_path() { dbTester.prepareDbUnit(getClass(), "extract_directory_path.xml"); Map<String, IssueDoc> issuesByKey = issuesByKey(); assertThat(issuesByKey).hasSize(4); // File in sub directoy assertThat(issuesByKey.get("ABC").directoryPath()).isEqualTo("src/main/java"); // File in root directoy assertThat(issuesByKey.get("DEF").directoryPath()).isEqualTo("/"); // Module assertThat(issuesByKey.get("EFG").filePath()).isNull(); // Project assertThat(issuesByKey.get("FGH").filePath()).isNull(); }
@Test public void facets_on_authors_return_100_entries_plus_selected_values() { OrganizationDto organizationDto = newOrganizationDto(); ComponentDto project = newPrivateProjectDto(organizationDto); indexIssues(rangeClosed(1, 110).mapToObj(i -> newDoc(newFileDto(project, null)).setAuthorLogin("a" + i)).toArray(IssueDoc[]::new)); IssueDoc issue1 = newDoc(newFileDto(project, null)).setAuthorLogin("user1"); IssueDoc issue2 = newDoc(newFileDto(project, null)).setAuthorLogin("user2"); indexIssues(issue1, issue2); assertThatFacetHasSize(IssueQuery.builder().build(), "authors", 100); assertThatFacetHasSize(IssueQuery.builder().authors(asList(issue1.authorLogin(), issue2.authorLogin())).build(), "authors", 102); }
@Test public void facets_on_assignees_return_only_100_entries_plus_selected_values() { OrganizationDto organizationDto = newOrganizationDto(); ComponentDto project = newPrivateProjectDto(organizationDto); indexIssues(rangeClosed(1, 110).mapToObj(i -> newDoc(newFileDto(project, null)).setAssigneeUuid("a" + i)).toArray(IssueDoc[]::new)); IssueDoc issue1 = newDoc(newFileDto(project, null)).setAssigneeUuid("user1"); IssueDoc issue2 = newDoc(newFileDto(project, null)).setAssigneeUuid("user2"); indexIssues(issue1, issue2); assertThatFacetHasSize(IssueQuery.builder().build(), "assignees", 100); assertThatFacetHasSize(IssueQuery.builder().assigneeUuids(asList(issue1.assigneeUuid(), issue2.assigneeUuid())).build(), "assignees", 102); }
@Test public void facets_on_assignees_supports_dashes() { ComponentDto project = newPrivateProjectDto(newOrganizationDto()); ComponentDto file = newFileDto(project, null); indexIssues( newDoc("I1", file).setAssigneeUuid("j-b-uuid"), newDoc("I2", file).setAssigneeUuid("marcel-uuid"), newDoc("I3", file).setAssigneeUuid("marcel-uuid"), newDoc("I4", file).setAssigneeUuid(null)); assertThatFacetHasOnly(IssueQuery.builder().assigneeUuids(singletonList("j-b")), "assignees", entry("j-b-uuid", 1L), entry("marcel-uuid", 2L), entry("", 1L)); }
@Test public void list_authors() { OrganizationDto org = newOrganizationDto(); ComponentDto project = newPrivateProjectDto(org); indexIssues( newDoc("issue1", project).setAuthorLogin("luke.skywalker"), newDoc("issue2", project).setAuthorLogin("luke@skywalker.name"), newDoc("issue3", project).setAuthorLogin(null), newDoc("issue4", project).setAuthorLogin("anakin@skywalker.name")); IssueQuery query = IssueQuery.builder().build(); assertThat(underTest.searchAuthors(query, null, 5)).containsExactly("anakin@skywalker.name", "luke.skywalker", "luke@skywalker.name"); assertThat(underTest.searchAuthors(query, null, 2)).containsExactly("anakin@skywalker.name", "luke.skywalker"); assertThat(underTest.searchAuthors(query, "uke", 5)).containsExactly("luke.skywalker", "luke@skywalker.name"); assertThat(underTest.searchAuthors(query, null, 1)).containsExactly("anakin@skywalker.name"); assertThat(underTest.searchAuthors(query, null, Integer.MAX_VALUE)).containsExactly("anakin@skywalker.name", "luke.skywalker", "luke@skywalker.name"); }