您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

UpdateConflictResolverTest.java 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2020 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.ce.task.projectanalysis.issue;
  21. import org.junit.Test;
  22. import org.mockito.ArgumentCaptor;
  23. import org.sonar.api.issue.Issue;
  24. import org.sonar.api.rule.RuleKey;
  25. import org.sonar.api.rule.Severity;
  26. import org.sonar.api.utils.DateUtils;
  27. import org.sonar.core.issue.DefaultIssue;
  28. import org.sonar.db.issue.IssueDto;
  29. import org.sonar.db.issue.IssueMapper;
  30. import static org.assertj.core.api.Assertions.assertThat;
  31. import static org.mockito.Mockito.mock;
  32. import static org.mockito.Mockito.verify;
  33. import static org.sonar.api.issue.Issue.STATUS_OPEN;
  34. import static org.sonar.api.rules.RuleType.CODE_SMELL;
  35. public class UpdateConflictResolverTest {
  36. @Test
  37. public void should_reload_issue_and_resolve_conflict() {
  38. DefaultIssue issue = new DefaultIssue()
  39. .setKey("ABCDE")
  40. .setType(CODE_SMELL)
  41. .setRuleKey(RuleKey.of("squid", "AvoidCycles"))
  42. .setProjectUuid("U1")
  43. .setComponentUuid("U2")
  44. .setNew(false)
  45. .setStatus(STATUS_OPEN);
  46. // Issue as seen and changed by end-user
  47. IssueMapper mapper = mock(IssueMapper.class);
  48. IssueDto issueDto = new IssueDto()
  49. .setKee("ABCDE")
  50. .setType(CODE_SMELL)
  51. .setRuleUuid("uuid-10")
  52. .setRuleKey("squid", "AvoidCycles")
  53. .setProjectUuid("U1")
  54. .setComponentUuid("U2")
  55. .setLine(10)
  56. .setStatus(STATUS_OPEN)
  57. // field changed by user
  58. .setAssigneeUuid("arthur-uuid");
  59. new UpdateConflictResolver().resolve(issue, issueDto, mapper);
  60. ArgumentCaptor<IssueDto> argument = ArgumentCaptor.forClass(IssueDto.class);
  61. verify(mapper).update(argument.capture());
  62. IssueDto updatedIssue = argument.getValue();
  63. assertThat(updatedIssue.getKee()).isEqualTo("ABCDE");
  64. assertThat(updatedIssue.getAssigneeUuid()).isEqualTo("arthur-uuid");
  65. }
  66. @Test
  67. public void should_keep_changes_made_by_user() {
  68. DefaultIssue issue = new DefaultIssue()
  69. .setKey("ABCDE")
  70. .setRuleKey(RuleKey.of("squid", "AvoidCycles"))
  71. .setComponentKey("struts:org.apache.struts.Action")
  72. .setNew(false);
  73. // Before starting scan
  74. issue.setAssigneeUuid(null);
  75. issue.setCreationDate(DateUtils.parseDate("2012-01-01"));
  76. issue.setUpdateDate(DateUtils.parseDate("2012-02-02"));
  77. // Changed by scan
  78. issue.setLine(200);
  79. issue.setSeverity(Severity.BLOCKER);
  80. issue.setManualSeverity(false);
  81. issue.setAuthorLogin("simon");
  82. issue.setChecksum("CHECKSUM-ABCDE");
  83. issue.setResolution(null);
  84. issue.setStatus(Issue.STATUS_REOPENED);
  85. // Issue as seen and changed by end-user
  86. IssueDto dbIssue = new IssueDto()
  87. .setKee("ABCDE")
  88. .setRuleUuid("uuid-10")
  89. .setRuleKey("squid", "AvoidCycles")
  90. .setComponentUuid("100")
  91. .setComponentKey("struts:org.apache.struts.Action")
  92. .setLine(10)
  93. .setResolution(Issue.RESOLUTION_FALSE_POSITIVE)
  94. .setStatus(Issue.STATUS_RESOLVED)
  95. .setAssigneeUuid("arthur")
  96. .setSeverity(Severity.MAJOR)
  97. .setManualSeverity(false);
  98. new UpdateConflictResolver().mergeFields(dbIssue, issue);
  99. assertThat(issue.key()).isEqualTo("ABCDE");
  100. assertThat(issue.componentKey()).isEqualTo("struts:org.apache.struts.Action");
  101. // Scan wins on :
  102. assertThat(issue.line()).isEqualTo(200);
  103. assertThat(issue.severity()).isEqualTo(Severity.BLOCKER);
  104. assertThat(issue.manualSeverity()).isFalse();
  105. // User wins on :
  106. assertThat(issue.assignee()).isEqualTo("arthur");
  107. assertThat(issue.resolution()).isEqualTo(Issue.RESOLUTION_FALSE_POSITIVE);
  108. assertThat(issue.status()).isEqualTo(Issue.STATUS_RESOLVED);
  109. }
  110. @Test
  111. public void severity_changed_by_user_should_be_kept() {
  112. DefaultIssue issue = new DefaultIssue()
  113. .setKey("ABCDE")
  114. .setRuleKey(RuleKey.of("squid", "AvoidCycles"))
  115. .setComponentKey("struts:org.apache.struts.Action")
  116. .setNew(false)
  117. .setStatus(STATUS_OPEN);
  118. // Changed by scan
  119. issue.setSeverity(Severity.BLOCKER);
  120. issue.setManualSeverity(false);
  121. // Issue as seen and changed by end-user
  122. IssueDto dbIssue = new IssueDto()
  123. .setKee("ABCDE")
  124. .setStatus(STATUS_OPEN)
  125. .setSeverity(Severity.INFO)
  126. .setManualSeverity(true);
  127. new UpdateConflictResolver().mergeFields(dbIssue, issue);
  128. assertThat(issue.severity()).isEqualTo(Severity.INFO);
  129. assertThat(issue.manualSeverity()).isTrue();
  130. }
  131. }