Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

MovedIssueVisitorTest.java 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 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 com.google.common.base.Optional;
  22. import java.util.Date;
  23. import org.junit.Before;
  24. import org.junit.Test;
  25. import org.junit.rules.ExpectedException;
  26. import org.mockito.ArgumentCaptor;
  27. import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
  28. import org.sonar.ce.task.projectanalysis.component.Component;
  29. import org.sonar.ce.task.projectanalysis.component.ReportComponent;
  30. import org.sonar.ce.task.projectanalysis.filemove.MovedFilesRepository;
  31. import org.sonar.core.issue.DefaultIssue;
  32. import org.sonar.core.issue.IssueChangeContext;
  33. import org.sonar.server.issue.IssueFieldsSetter;
  34. import static org.assertj.core.api.Assertions.assertThat;
  35. import static org.mockito.ArgumentMatchers.any;
  36. import static org.mockito.ArgumentMatchers.eq;
  37. import static org.mockito.Mockito.mock;
  38. import static org.mockito.Mockito.verify;
  39. import static org.mockito.Mockito.verifyNoMoreInteractions;
  40. import static org.mockito.Mockito.verifyZeroInteractions;
  41. import static org.mockito.Mockito.when;
  42. public class MovedIssueVisitorTest {
  43. private static final long ANALYSIS_DATE = 894521;
  44. private static final String FILE_UUID = "file uuid";
  45. private static final Component FILE = ReportComponent.builder(Component.Type.FILE, 1)
  46. .setKey("key_1")
  47. .setPublicKey("public_key_1")
  48. .setUuid(FILE_UUID)
  49. .build();
  50. @org.junit.Rule
  51. public ExpectedException expectedException = ExpectedException.none();
  52. @org.junit.Rule
  53. public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule();
  54. private MovedFilesRepository movedFilesRepository = mock(MovedFilesRepository.class);
  55. private MovedIssueVisitor underTest = new MovedIssueVisitor(analysisMetadataHolder, movedFilesRepository, new IssueFieldsSetter());
  56. @Before
  57. public void setUp() {
  58. analysisMetadataHolder.setAnalysisDate(ANALYSIS_DATE);
  59. when(movedFilesRepository.getOriginalFile(any(Component.class)))
  60. .thenReturn(Optional.absent());
  61. }
  62. @Test
  63. public void onIssue_does_not_alter_issue_if_component_is_not_a_file() {
  64. DefaultIssue issue = mock(DefaultIssue.class);
  65. underTest.onIssue(ReportComponent.builder(Component.Type.DIRECTORY, 1).build(), issue);
  66. verifyZeroInteractions(issue);
  67. }
  68. @Test
  69. public void onIssue_does_not_alter_issue_if_component_file_but_issue_has_the_same_component_uuid() {
  70. DefaultIssue issue = mockIssue(FILE_UUID);
  71. underTest.onIssue(FILE, issue);
  72. verify(issue).componentUuid();
  73. verifyNoMoreInteractions(issue);
  74. }
  75. @Test
  76. public void onIssue_throws_ISE_if_issue_has_different_component_uuid_but_component_has_no_original_file() {
  77. DefaultIssue issue = mockIssue("other component uuid");
  78. when(issue.toString()).thenReturn("[bad issue, bad!]");
  79. expectedException.expect(IllegalStateException.class);
  80. expectedException.expectMessage("Issue [bad issue, bad!] for component ReportComponent{ref=1, key='key_1', type=FILE} " +
  81. "has a different component key but no original file exist in MovedFilesRepository");
  82. underTest.onIssue(FILE, issue);
  83. }
  84. @Test
  85. public void onIssue_throws_ISE_if_issue_has_different_component_uuid_from_component_but_it_is_not_the_one_of_original_file() {
  86. DefaultIssue issue = mockIssue("other component uuid");
  87. when(issue.toString()).thenReturn("[bad issue, bad!]");
  88. when(movedFilesRepository.getOriginalFile(FILE))
  89. .thenReturn(Optional.of(new MovedFilesRepository.OriginalFile(6451, "original uuid", "original key")));
  90. expectedException.expect(IllegalStateException.class);
  91. expectedException.expectMessage("Issue [bad issue, bad!] doesn't belong to file original uuid registered as original " +
  92. "file of current file ReportComponent{ref=1, key='key_1', type=FILE}");
  93. underTest.onIssue(FILE, issue);
  94. }
  95. @Test
  96. public void onIssue_update_component_and_module_fields_to_component_and_flag_issue_has_changed() {
  97. MovedFilesRepository.OriginalFile originalFile = new MovedFilesRepository.OriginalFile(6451, "original uuid", "original key");
  98. DefaultIssue issue = mockIssue(originalFile.getUuid());
  99. when(movedFilesRepository.getOriginalFile(FILE))
  100. .thenReturn(Optional.of(originalFile));
  101. underTest.onIssue(FILE, issue);
  102. verify(issue).setComponentUuid(FILE.getUuid());
  103. verify(issue).setComponentKey(FILE.getKey());
  104. verify(issue).setModuleUuid(null);
  105. verify(issue).setModuleUuidPath(null);
  106. verify(issue).setChanged(true);
  107. ArgumentCaptor<IssueChangeContext> issueChangeContextCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
  108. verify(issue).setFieldChange(issueChangeContextCaptor.capture(), eq("file"), eq(originalFile.getUuid()), eq(FILE.getUuid()));
  109. assertThat(issueChangeContextCaptor.getValue().date()).isEqualTo(new Date(ANALYSIS_DATE));
  110. assertThat(issueChangeContextCaptor.getValue().userUuid()).isNull();
  111. assertThat(issueChangeContextCaptor.getValue().scan()).isFalse();
  112. }
  113. private DefaultIssue mockIssue(String fileUuid) {
  114. DefaultIssue issue = mock(DefaultIssue.class);
  115. when(issue.componentUuid()).thenReturn(fileUuid);
  116. return issue;
  117. }
  118. }