From: Janos Gyerik Date: Wed, 13 Jun 2018 06:15:23 +0000 (+0200) Subject: Rewrite dbunit test using dbtester X-Git-Tag: 7.5~888 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=376544a07a2259a0399d7f2d179c3c1c42a443a9;p=sonarqube.git Rewrite dbunit test using dbtester --- diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java index 75530fc4871..4f7ec70247d 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java @@ -53,11 +53,14 @@ import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; +import org.sonar.db.component.SnapshotDto; +import org.sonar.db.issue.IssueDto; import org.sonar.db.measure.MeasureDto; import org.sonar.db.measure.custom.CustomMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.property.PropertyDto; import org.sonar.db.rule.RuleDefinitionDto; +import org.sonar.db.source.FileSourceDto; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -176,13 +179,60 @@ public class PurgeDaoTest { @Test public void close_issues_clean_index_and_file_sources_of_disabled_components_specified_by_uuid_in_configuration() { - dbTester.prepareDbUnit(getClass(), "close_issues_clean_index_and_files_sources_of_specified_components.xml"); - when(system2.now()).thenReturn(1450000000000L); - underTest.purge(dbSession, newConfigurationWith30Days(system2, THE_PROJECT_UUID, "P1", "EFGH", "GHIJ"), PurgeListener.EMPTY, new PurgeProfiler()); + // components and issues, updated 31 days ago + when(system2.now()).thenReturn(DateUtils.addDays(new Date(), -31).getTime()); + RuleDefinitionDto rule = dbTester.rules().insert(); + ComponentDto project = dbTester.components().insertMainBranch(p -> p.setEnabled(false)); + dbTester.components().insertSnapshot(project); + dbTester.components().insertSnapshot(project); + dbTester.components().insertSnapshot(project, s -> s.setLast(false)); + + ComponentDto module = dbTester.components().insertComponent(newModuleDto(project).setEnabled(false)); + ComponentDto dir = dbTester.components().insertComponent(newDirectory(module, "sub").setEnabled(false)); + ComponentDto srcFile = dbTester.components().insertComponent(newFileDto(module, dir).setEnabled(false)); + ComponentDto testFile = dbTester.components().insertComponent(newFileDto(module, dir).setEnabled(false)); + ComponentDto nonSelectedFile = dbTester.components().insertComponent(newFileDto(module, dir).setEnabled(false)); + IssueDto openOnFile = dbTester.issues().insert(rule, project, srcFile, issue -> issue.setStatus("OPEN")); + IssueDto confirmOnFile = dbTester.issues().insert(rule, project, srcFile, issue -> issue.setStatus("CONFIRM")); + IssueDto openOnDir = dbTester.issues().insert(rule, project, dir, issue -> issue.setStatus("OPEN")); + IssueDto confirmOnDir = dbTester.issues().insert(rule, project, dir, issue -> issue.setStatus("CONFIRM")); + IssueDto openOnNonSelected = dbTester.issues().insert(rule, project, nonSelectedFile, issue -> issue.setStatus("OPEN")); + IssueDto confirmOnNonSelected = dbTester.issues().insert(rule, project, nonSelectedFile, issue -> issue.setStatus("CONFIRM")); + + assertThat(dbTester.countSql("select count(*) from snapshots where purge_status = 1")).isEqualTo(0); + + assertThat(dbTester.countSql("select count(*) from issues where status = 'CLOSED'")).isEqualTo(0); + assertThat(dbTester.countSql("select count(*) from issues where resolution = 'REMOVED'")).isEqualTo(0); + + dbTester.fileSources().insertFileSource(srcFile); + dbTester.fileSources().insertFileSource(testFile, f -> f.setDataType("TEST")); + FileSourceDto nonSelectedFileSource = dbTester.fileSources().insertFileSource(nonSelectedFile); + assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(3); + + // back to present + when(system2.now()).thenReturn(new Date().getTime()); + underTest.purge(dbSession, newConfigurationWith30Days(system2, project.uuid(), module.uuid(), dir.uuid(), srcFile.uuid(), testFile.uuid()), PurgeListener.EMPTY, new PurgeProfiler()); dbSession.commit(); - dbTester.assertDbUnit(getClass(), "close_issues_clean_index_and_files_sources_of_specified_components-result.xml", - new String[] {"issue_close_date", "issue_update_date"}, - "projects", "snapshots", "issues"); + + // set purge_status=1 for non-last snapshot + assertThat(dbTester.countSql("select count(*) from snapshots where purge_status = 1")).isEqualTo(1); + + // close open issues of selected + assertThat(dbTester.countSql("select count(*) from issues where status = 'CLOSED'")).isEqualTo(4); + for (IssueDto issue : Arrays.asList(openOnFile, confirmOnFile, openOnDir, confirmOnDir)) { + assertThat(dbTester.getDbClient().issueDao().selectByKey(dbSession, issue.getKey()).get()) + .extracting("status", "resolution") + .containsExactlyInAnyOrder("CLOSED", "REMOVED"); + } + for (IssueDto issue : Arrays.asList(openOnNonSelected, confirmOnNonSelected)) { + assertThat(dbTester.getDbClient().issueDao().selectByKey(dbSession, issue.getKey()).get()) + .extracting("status", "resolution") + .containsExactlyInAnyOrder(issue.getStatus(), null); + } + + // delete file sources of selected + assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1); + assertThat(dbTester.getDbClient().fileSourceDao().selectSourceByFileUuid(dbSession, nonSelectedFileSource.getFileUuid())).isNotNull(); } @Test @@ -520,31 +570,34 @@ public class PurgeDaoTest { @Test public void should_delete_old_closed_issues() { - PurgeListener purgeListener = mock(PurgeListener.class); - dbTester.prepareDbUnit(getClass(), "should_delete_old_closed_issues.xml"); - - underTest.purge(dbSession, newConfigurationWith30Days(), purgeListener, new PurgeProfiler()); - dbSession.commit(); + RuleDefinitionDto rule = dbTester.rules().insert(); + ComponentDto project = dbTester.components().insertMainBranch(); - dbTester.assertDbUnit(getClass(), "should_delete_old_closed_issues-result.xml", "issues", "issue_changes"); + ComponentDto module = dbTester.components().insertComponent(newModuleDto(project)); + ComponentDto file = dbTester.components().insertComponent(newFileDto(module)); - Class> listClass = (Class>) (Class) ArrayList.class; - ArgumentCaptor> issueKeys = ArgumentCaptor.forClass(listClass); - ArgumentCaptor projectUuid = ArgumentCaptor.forClass(String.class); + IssueDto oldClosed = dbTester.issues().insert(rule, project, file, issue -> { + issue.setStatus("CLOSED"); + issue.setIssueCloseDate(DateUtils.addDays(new Date(), -31)); + }); - verify(purgeListener).onIssuesRemoval(projectUuid.capture(), issueKeys.capture()); - assertThat(projectUuid.getValue()).isEqualTo(THE_PROJECT_UUID); - assertThat(issueKeys.getValue()).containsOnly("ISSUE-1", "ISSUE-2"); - } + IssueDto notOldEnoughClosed = dbTester.issues().insert(rule, project, file, issue -> { + issue.setStatus("CLOSED"); + issue.setIssueCloseDate(new Date()); + }); + IssueDto notClosed = dbTester.issues().insert(rule, project, file); - @Test - public void should_delete_all_closed_issues() { - dbTester.prepareDbUnit(getClass(), "should_delete_all_closed_issues.xml"); - PurgeConfiguration conf = new PurgeConfiguration(new IdUuidPair(THE_PROJECT_ID, "1"), emptyList(), - 0, Optional.empty(), System2.INSTANCE, Collections.emptyList()); - underTest.purge(dbSession, conf, PurgeListener.EMPTY, new PurgeProfiler()); + when(system2.now()).thenReturn(new Date().getTime()); + underTest.purge(dbSession, newConfigurationWith30Days(system2, project.uuid()), PurgeListener.EMPTY, new PurgeProfiler()); dbSession.commit(); - dbTester.assertDbUnit(getClass(), "should_delete_all_closed_issues-result.xml", "issues", "issue_changes"); + + // old closed got deleted + assertThat(dbTester.getDbClient().issueDao().selectByKey(dbSession, oldClosed.getKey())).isEmpty(); + + // others remain + assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(2); + assertThat(dbTester.getDbClient().issueDao().selectByKey(dbSession, notOldEnoughClosed.getKey())).isNotEmpty(); + assertThat(dbTester.getDbClient().issueDao().selectByKey(dbSession, notClosed.getKey())).isNotEmpty(); } @Test diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components-result.xml deleted file mode 100644 index 287f41e23de..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components-result.xml +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components.xml deleted file mode 100644 index d371b7cd955..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components.xml +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_all_closed_issues-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_all_closed_issues-result.xml deleted file mode 100644 index 0722a360744..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_all_closed_issues-result.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_all_closed_issues.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_all_closed_issues.xml deleted file mode 100644 index cdb04fe8e7d..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_all_closed_issues.xml +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_old_closed_issues-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_old_closed_issues-result.xml deleted file mode 100644 index d7c45fc5c19..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_old_closed_issues-result.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_old_closed_issues.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_old_closed_issues.xml deleted file mode 100644 index 2d6ceed1865..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/should_delete_old_closed_issues.xml +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueStorageTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueStorageTest.java index 07d488e07af..083689ee498 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueStorageTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueStorageTest.java @@ -21,6 +21,8 @@ package org.sonar.server.issue; import java.util.Collection; import java.util.Date; +import java.util.List; +import java.util.Map; import org.junit.Test; import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.Rule; @@ -39,6 +41,11 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueMapper; +import org.sonar.db.rule.RuleDefinitionDto; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.db.component.ComponentTesting.newFileDto; +import static org.sonar.db.component.ComponentTesting.newModuleDto; public class IssueStorageTest { @@ -47,8 +54,6 @@ public class IssueStorageTest { @org.junit.Rule public DbTester db = DbTester.create(System2.INSTANCE); - private IssueChangeContext context = IssueChangeContext.createUser(new Date(system2.now()), "user_uuid"); - private DbClient dbClient = db.getDbClient(); @Test @@ -81,10 +86,13 @@ public class IssueStorageTest { .setProjectUuid("uuid-10") .setComponentKey("struts:Action"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(0); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(0); + saver.save(issue); - db.assertDbUnit(getClass(), "should_insert_new_issues-result.xml", - new String[] {"id", "created_at", "updated_at", "issue_change_creation_date"}, "issues", "issue_changes"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(1); } @Test @@ -117,11 +125,14 @@ public class IssueStorageTest { .setProjectUuid("uuid-10") .setComponentKey("struts:Action"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(0); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(0); + saver.save(db.getSession(), issue); db.getSession().commit(); - db.assertDbUnit(getClass(), "should_insert_new_issues-result.xml", - new String[] {"id", "created_at", "updated_at", "issue_change_creation_date"}, "issues", "issue_changes"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(1); } @Test @@ -156,100 +167,197 @@ public class IssueStorageTest { .setComponentUuid("component-uuid") .setProjectUuid("project-uuid"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(0); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(0); + saver.save(db.getSession(), issue); db.getSession().commit(); - db.assertDbUnit(getClass(), "should_insert_new_issues-result.xml", new String[] {"id", "created_at", "updated_at", - "issue_change_creation_date"}, "issues", "issue_changes"); + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(1); } @Test public void batch_update_issues() { - db.prepareDbUnit(getClass(), "should_update_issues.xml"); - FakeBatchSaver saver = new FakeBatchSaver(dbClient, new FakeRuleFinder()); - DefaultIssueComment comment = DefaultIssueComment.create("ABCDE", "user_uuid", "the comment"); - // override generated key - comment.setKey("FGHIJ"); + RuleDefinitionDto rule = db.rules().insert(); + ComponentDto project = db.components().insertMainBranch(); + ComponentDto module = db.components().insertComponent(newModuleDto(project)); + ComponentDto file = db.components().insertComponent(newFileDto(module)); Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setType(RuleType.BUG) + .setNew(true) + .setRuleKey(rule.getKey()) + .setProjectUuid(project.uuid()) + .setComponentUuid(file.uuid()) + .setLine(5000) + .setEffort(Duration.create(10L)) + .addComment(DefaultIssueComment.create("ABCDE", "user_uuid", "first comment")) + .setResolution("OPEN") + .setStatus("OPEN") + .setSeverity("BLOCKER") + .setAttribute("foo", "bar") + .setCreationDate(date) + .setUpdateDate(date) + .setCloseDate(date); + + saver.save(issue); + + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(1); + + DefaultIssue updated = new DefaultIssue() + .setKey(issue.key()) + .setType(RuleType.VULNERABILITY) .setNew(false) .setChanged(true) // updated fields - .setLine(5000) - .setEffort(Duration.create(10L)) + .setLine(issue.getLine() + 10) + .setProjectUuid("foo") + .setEffort(Duration.create(issue.effortInMinutes() + 10L)) .setChecksum("FFFFF") .setAuthorLogin("simon") .setAssigneeUuid("loic") - .setFieldChange(context, "severity", "INFO", "BLOCKER") + .setFieldChange(IssueChangeContext.createUser(new Date(), "user_uuid"), "severity", "INFO", "BLOCKER") + .addComment(DefaultIssueComment.create("ABCDE", "user_uuid", "the comment")) .setResolution("FIXED") .setStatus("RESOLVED") - .setSeverity("BLOCKER") - .setAttribute("foo", "bar") - .addComment(comment) - .setCreationDate(date) - .setUpdateDate(date) - .setCloseDate(date) - .setComponentUuid("uuid-100") - .setProjectUuid("uuid-10") + .setSeverity("MAJOR") + .setAttribute("fox", "bax") + .setCreationDate(DateUtils.addDays(date, 1)) + .setUpdateDate(DateUtils.addDays(date, 1)) + .setCloseDate(DateUtils.addDays(date, 1)) // unmodifiable fields .setRuleKey(RuleKey.of("xxx", "unknown")) - .setComponentKey("not:a:component"); - - saver.save(issue); - - db.assertDbUnit(getClass(), "should_update_issues-result.xml", new String[] {"id", "created_at", "updated_at", "issue_change_creation_date"}, "issues", "issue_changes"); + .setComponentKey("struts:Action") + .setProjectKey("struts"); + + saver.save(updated); + + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.selectFirst("select * from issues")) + .containsEntry("ASSIGNEE", updated.assignee()) + .containsEntry("AUTHOR_LOGIN", updated.authorLogin()) + .containsEntry("CHECKSUM", updated.checksum()) + .containsEntry("COMPONENT_UUID", issue.componentUuid()) + .containsEntry("EFFORT", updated.effortInMinutes()) + .containsEntry("ISSUE_ATTRIBUTES", "fox=bax") + .containsEntry("ISSUE_TYPE", (byte) 3) + .containsEntry("KEE", issue.key()) + .containsEntry("LINE", (long) updated.line()) + .containsEntry("PROJECT_UUID", updated.projectUuid()) + .containsEntry("RESOLUTION", updated.resolution()) + .containsEntry("STATUS", updated.status()) + .containsEntry("SEVERITY", updated.severity()); + + List> rows = db.select("select * from issue_changes order by id"); + assertThat(rows).hasSize(3); + assertThat(rows.get(0)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("first comment", "comment", "user_uuid"); + assertThat(rows.get(1)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("the comment", "comment", "user_uuid"); + assertThat(rows.get(2)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("severity=INFO|BLOCKER", "diff", "user_uuid"); } @Test public void server_update_issues() { - db.prepareDbUnit(getClass(), "should_update_issues.xml"); - ComponentDto project = new ComponentDto().setId(10L).setUuid("whatever-uuid"); ComponentDto component = new ComponentDto().setId(100L).setUuid("whatever-uuid-2"); FakeServerSaver saver = new FakeServerSaver(dbClient, new FakeRuleFinder(), component, project); - DefaultIssueComment comment = DefaultIssueComment.create("ABCDE", "user_uuid", "the comment"); - // override generated key - comment.setKey("FGHIJ"); + RuleDefinitionDto rule = db.rules().insert(); Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setType(RuleType.BUG) + .setNew(true) + .setRuleKey(rule.getKey()) + .setProjectUuid(project.uuid()) + .setComponentUuid(component.uuid()) + .setLine(5000) + .setEffort(Duration.create(10L)) + .addComment(DefaultIssueComment.create("ABCDE", "user_uuid", "first comment")) + .setResolution("OPEN") + .setStatus("OPEN") + .setSeverity("BLOCKER") + .setAttribute("foo", "bar") + .setCreationDate(date) + .setUpdateDate(date) + .setCloseDate(date); + + saver.save(issue); + + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.countRowsOfTable("issue_changes")).isEqualTo(1); + + DefaultIssue updated = new DefaultIssue() + .setKey(issue.key()) + .setType(RuleType.VULNERABILITY) .setNew(false) .setChanged(true) // updated fields - .setLine(5000) - .setEffort(Duration.create(10L)) + .setLine(issue.getLine() + 10) + .setProjectUuid("foo") + .setEffort(Duration.create(issue.effortInMinutes() + 10L)) .setChecksum("FFFFF") .setAuthorLogin("simon") .setAssigneeUuid("loic") - .setFieldChange(context, "severity", "INFO", "BLOCKER") + .setFieldChange(IssueChangeContext.createUser(new Date(), "user_uuid"), "severity", "INFO", "BLOCKER") + .addComment(DefaultIssueComment.create("ABCDE", "user_uuid", "the comment")) .setResolution("FIXED") .setStatus("RESOLVED") - .setSeverity("BLOCKER") - .setAttribute("foo", "bar") - .addComment(comment) - .setCreationDate(date) - .setUpdateDate(date) - .setCloseDate(date) - .setProjectUuid("uuid-10") + .setSeverity("MAJOR") + .setAttribute("fox", "bax") + .setCreationDate(DateUtils.addDays(date, 1)) + .setUpdateDate(DateUtils.addDays(date, 1)) + .setCloseDate(DateUtils.addDays(date, 1)) // unmodifiable fields .setRuleKey(RuleKey.of("xxx", "unknown")) - .setComponentKey("not:a:component"); - - saver.save(issue); - - db.assertDbUnit(getClass(), "should_update_issues-result.xml", new String[] {"id", "created_at", "updated_at", "issue_change_creation_date"}, "issues", "issue_changes"); + .setComponentKey("struts:Action") + .setProjectKey("struts"); + + saver.save(updated); + + assertThat(db.countRowsOfTable("issues")).isEqualTo(1); + assertThat(db.selectFirst("select * from issues")) + .containsEntry("ASSIGNEE", updated.assignee()) + .containsEntry("AUTHOR_LOGIN", updated.authorLogin()) + .containsEntry("CHECKSUM", updated.checksum()) + .containsEntry("COMPONENT_UUID", issue.componentUuid()) + .containsEntry("EFFORT", updated.effortInMinutes()) + .containsEntry("ISSUE_ATTRIBUTES", "fox=bax") + .containsEntry("ISSUE_TYPE", (byte) 3) + .containsEntry("KEE", issue.key()) + .containsEntry("LINE", (long) updated.line()) + .containsEntry("PROJECT_UUID", updated.projectUuid()) + .containsEntry("RESOLUTION", updated.resolution()) + .containsEntry("STATUS", updated.status()) + .containsEntry("SEVERITY", updated.severity()); + + List> rows = db.select("select * from issue_changes order by id"); + assertThat(rows).hasSize(3); + assertThat(rows.get(0)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("first comment", "comment", "user_uuid"); + assertThat(rows.get(1)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("the comment", "comment", "user_uuid"); + assertThat(rows.get(2)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("severity=INFO|BLOCKER", "diff", "user_uuid"); } static class FakeBatchSaver extends IssueStorage { diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueStorageTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueStorageTest.java index 023420d92ad..d03f432197e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueStorageTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueStorageTest.java @@ -21,6 +21,8 @@ package org.sonar.server.issue; import java.util.Collection; import java.util.Date; +import java.util.List; +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.sonar.api.rule.RuleKey; @@ -36,11 +38,15 @@ import org.sonar.core.issue.DefaultIssueComment; import org.sonar.core.issue.IssueChangeContext; import org.sonar.db.DbClient; import org.sonar.db.DbTester; +import org.sonar.db.component.ComponentDto; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.server.issue.index.IssueIndexer; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.sonar.db.component.ComponentTesting.newFileDto; +import static org.sonar.db.component.ComponentTesting.newModuleDto; public class ServerIssueStorageTest { @@ -78,21 +84,24 @@ public class ServerIssueStorageTest { @Test public void should_insert_new_issues() { - dbTester.prepareDbUnit(getClass(), "should_insert_new_issues.xml"); + RuleDefinitionDto rule = dbTester.rules().insert(); + ComponentDto project = dbTester.components().insertMainBranch(); + ComponentDto module = dbTester.components().insertComponent(newModuleDto(project)); + ComponentDto file = dbTester.components().insertComponent(newFileDto(module)); - DefaultIssueComment comment = DefaultIssueComment.create("ABCDE", "user_uuid", "the comment"); + String issueKey = "ABCDE"; + DefaultIssueComment comment = DefaultIssueComment.create(issueKey, "user_uuid", "the comment"); // override generated key comment.setKey("FGHIJ"); Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); DefaultIssue issue = new DefaultIssue() - .setKey("ABCDE") + .setKey(issueKey) .setType(RuleType.BUG) .setNew(true) - - .setRuleKey(RuleKey.of("squid", "AvoidCycle")) - .setProjectUuid("ABCD") - .setComponentUuid("BCDE") + .setRuleKey(rule.getKey()) + .setProjectUuid(project.uuid()) + .setComponentUuid(file.uuid()) .setLine(5000) .setEffort(Duration.create(10L)) .setResolution("OPEN") @@ -106,53 +115,107 @@ public class ServerIssueStorageTest { underTest.save(issue); - dbTester.assertDbUnit(getClass(), "should_insert_new_issues-result.xml", - new String[] {"id", "created_at", "updated_at", "issue_change_creation_date"}, "issues", "issue_changes"); + assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); + assertThat(dbTester.selectFirst("select * from issues")) + .containsEntry("PROJECT_UUID", project.uuid()) + .containsEntry("COMPONENT_UUID", file.uuid()) + .containsEntry("KEE", issue.key()) + .containsEntry("RESOLUTION", issue.resolution()) + .containsEntry("STATUS", issue.status()) + .containsEntry("SEVERITY", issue.severity()); + + assertThat(dbTester.countRowsOfTable("issue_changes")).isEqualTo(1); + assertThat(dbTester.selectFirst("select * from issue_changes")) + .containsEntry("KEE", comment.key()) + .containsEntry("ISSUE_KEY", issue.key()) + .containsEntry("CHANGE_DATA", comment.markdownText()) + .containsEntry("USER_LOGIN", comment.userUuid()); } @Test public void should_update_issues() { - dbTester.prepareDbUnit(getClass(), "should_update_issues.xml"); - - IssueChangeContext context = IssueChangeContext.createUser(new Date(), "user_uuid"); - - DefaultIssueComment comment = DefaultIssueComment.create("ABCDE", "user_uuid", "the comment"); - // override generated key - comment.setKey("FGHIJ"); + RuleDefinitionDto rule = dbTester.rules().insert(); + ComponentDto project = dbTester.components().insertMainBranch(); + ComponentDto module = dbTester.components().insertComponent(newModuleDto(project)); + ComponentDto file = dbTester.components().insertComponent(newFileDto(module)); Date date = DateUtils.parseDateTime("2013-05-18T12:00:00+0000"); DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setType(RuleType.BUG) + .setNew(true) + .setRuleKey(rule.getKey()) + .setProjectUuid(project.uuid()) + .setComponentUuid(file.uuid()) + .setLine(5000) + .setEffort(Duration.create(10L)) + .setResolution("OPEN") + .setStatus("OPEN") + .setSeverity("BLOCKER") + .setAttribute("foo", "bar") + .setCreationDate(date) + .setUpdateDate(date) + .setCloseDate(date); + + underTest.save(issue); + + assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); + assertThat(dbTester.countRowsOfTable("issue_changes")).isEqualTo(0); + + DefaultIssue updated = new DefaultIssue() + .setKey(issue.key()) + .setType(RuleType.VULNERABILITY) .setNew(false) .setChanged(true) // updated fields - .setLine(5000) - .setProjectUuid("CDEF") - .setEffort(Duration.create(10L)) + .setLine(issue.getLine() + 10) + .setProjectUuid("foo") + .setEffort(Duration.create(issue.effortInMinutes() + 10L)) .setChecksum("FFFFF") .setAuthorLogin("simon") .setAssigneeUuid("loic") - .setFieldChange(context, "severity", "INFO", "BLOCKER") + .setFieldChange(IssueChangeContext.createUser(new Date(), "user_uuid"), "severity", "INFO", "BLOCKER") + .addComment(DefaultIssueComment.create("ABCDE", "user_uuid", "the comment")) .setResolution("FIXED") .setStatus("RESOLVED") - .setSeverity("BLOCKER") - .setAttribute("foo", "bar") - .addComment(comment) - .setCreationDate(date) - .setUpdateDate(date) - .setCloseDate(date) + .setSeverity("MAJOR") + .setAttribute("fox", "bax") + .setCreationDate(DateUtils.addDays(date, 1)) + .setUpdateDate(DateUtils.addDays(date, 1)) + .setCloseDate(DateUtils.addDays(date, 1)) // unmodifiable fields .setRuleKey(RuleKey.of("xxx", "unknown")) .setComponentKey("struts:Action") .setProjectKey("struts"); - underTest.save(issue); - - dbTester.assertDbUnit(getClass(), "should_update_issues-result.xml", - new String[] {"id", "created_at", "updated_at", "issue_change_creation_date"}, "issues", "issue_changes"); + underTest.save(updated); + + assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); + assertThat(dbTester.selectFirst("select * from issues")) + .containsEntry("ASSIGNEE", updated.assignee()) + .containsEntry("AUTHOR_LOGIN", updated.authorLogin()) + .containsEntry("CHECKSUM", updated.checksum()) + .containsEntry("COMPONENT_UUID", issue.componentUuid()) + .containsEntry("EFFORT", updated.effortInMinutes()) + .containsEntry("ISSUE_ATTRIBUTES", "fox=bax") + .containsEntry("ISSUE_TYPE", (byte) 3) + .containsEntry("KEE", issue.key()) + .containsEntry("LINE", (long) updated.line()) + .containsEntry("PROJECT_UUID", updated.projectUuid()) + .containsEntry("RESOLUTION", updated.resolution()) + .containsEntry("STATUS", updated.status()) + .containsEntry("SEVERITY", updated.severity()); + + List> rows = dbTester.select("select * from issue_changes order by id"); + assertThat(rows).hasSize(2); + assertThat(rows.get(0)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("the comment", "comment", "user_uuid"); + assertThat(rows.get(1)) + .extracting("CHANGE_DATA", "CHANGE_TYPE", "USER_LOGIN") + .containsExactlyInAnyOrder("severity=INFO|BLOCKER", "diff", "user_uuid"); } static class FakeRuleFinder implements RuleFinder { diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_insert_new_issues-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_insert_new_issues-result.xml deleted file mode 100644 index 5bf22423c31..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_insert_new_issues-result.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_update_issues-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_update_issues-result.xml deleted file mode 100644 index 0a39d215e77..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_update_issues-result.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_update_issues.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_update_issues.xml deleted file mode 100644 index 478c01ec27d..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/IssueStorageTest/should_update_issues.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_insert_new_issues-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_insert_new_issues-result.xml deleted file mode 100644 index cb2f3324eed..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_insert_new_issues-result.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_insert_new_issues.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_insert_new_issues.xml deleted file mode 100644 index 222670b1485..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_insert_new_issues.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_update_issues-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_update_issues-result.xml deleted file mode 100644 index 3c0d6b1ed41..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_update_issues-result.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_update_issues.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_update_issues.xml deleted file mode 100644 index 879f7973eb9..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ServerIssueStorageTest/should_update_issues.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - -