@Test public void do_not_automatically_reopen_closed_issue_which_have_no_previous_status_in_changelog() { DefaultIssue[] issues = Arrays.stream(SUPPORTED_RESOLUTIONS_FOR_UNCLOSING) .map(IssueWorkflowTest::newClosedIssue) .toArray(DefaultIssue[]::new); Date now = new Date(); workflow.start(); Arrays.stream(issues).forEach(issue -> { workflow.doAutomaticTransition(issue, IssueChangeContext.createScan(now)); assertThat(issue.status()).isEqualTo(STATUS_CLOSED); assertThat(issue.updateDate()).isNull(); }); }
@Test public void fail_if_unknown_status_when_listing_transitions() { workflow.start(); DefaultIssue issue = new DefaultIssue().setStatus("xxx"); try { workflow.outTransitions(issue); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage("Unknown status: xxx"); } }
@Override public void start() { StateMachine.Builder builder = StateMachine.builder() // order is important for UI .states(Issue.STATUS_OPEN, Issue.STATUS_CONFIRMED, Issue.STATUS_REOPENED, Issue.STATUS_RESOLVED, Issue.STATUS_CLOSED); buildManualTransitions(builder); buildAutomaticTransitions(builder); buildSecurityHotspotTransitions(builder); machine = builder.build(); }
@Test public void init_state_machine() { assertThat(workflow.machine()).isNull(); workflow.start(); assertThat(workflow.machine()).isNotNull(); assertThat(workflow.machine().state(STATUS_OPEN)).isNotNull(); assertThat(workflow.machine().state(STATUS_CONFIRMED)).isNotNull(); assertThat(workflow.machine().state(STATUS_CLOSED)).isNotNull(); assertThat(workflow.machine().state(STATUS_REOPENED)).isNotNull(); assertThat(workflow.machine().state(STATUS_RESOLVED)).isNotNull(); workflow.stop(); }
@Test public void list_statuses() { workflow.start(); // order is important for UI assertThat(workflow.statusKeys()).containsSubsequence(STATUS_OPEN, STATUS_CONFIRMED, STATUS_REOPENED, STATUS_RESOLVED, STATUS_CLOSED); }
public void doAutomaticTransition(DefaultIssue issue) { workflow.doAutomaticTransition(issue, changeContext); }
public void checkTransitionPermission(String transitionKey, DefaultIssue defaultIssue) { String projectUuid = requireNonNull(defaultIssue.projectUuid()); workflow.outTransitions(defaultIssue) .stream() .filter(transition -> transition.key().equals(transitionKey) && isNotBlank(transition.requiredProjectPermission())) .forEach(transition -> userSession.checkComponentUuidPermission(transition.requiredProjectPermission(), projectUuid)); }
@Test public void flag_as_false_positive() { DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setStatus(STATUS_OPEN) .setRuleKey(RuleKey.of("squid", "AvoidCycle")) .setAssigneeUuid("morgan"); workflow.start(); workflow.doManualTransition(issue, DefaultTransitions.FALSE_POSITIVE, IssueChangeContext.createScan(new Date())); assertThat(issue.resolution()).isEqualTo(RESOLUTION_FALSE_POSITIVE); assertThat(issue.status()).isEqualTo(STATUS_RESOLVED); // should remove assignee assertThat(issue.assignee()).isNull(); }
@Before public void setUp() { issueWorkflow.start(); }
public void doAutomaticTransition(DefaultIssue issue, IssueChangeContext issueChangeContext) { Transition transition = stateOf(issue).outAutomaticTransition(issue); if (transition != null) { functionExecutor.execute(transition.functions(), issue, issueChangeContext); updater.setStatus(issue, transition.to(), issueChangeContext); } }
@Override public void start() { StateMachine.Builder builder = StateMachine.builder() // order is important for UI .states(Issue.STATUS_OPEN, Issue.STATUS_CONFIRMED, Issue.STATUS_REOPENED, Issue.STATUS_RESOLVED, Issue.STATUS_CLOSED); buildManualTransitions(builder); buildAutomaticTransitions(builder); machine = builder.build(); }
public boolean doTransition(DefaultIssue defaultIssue, IssueChangeContext issueChangeContext, String transitionKey) { checkArgument(!defaultIssue.isFromExternalRuleEngine(), "Transition is not allowed on issues imported from external rule engines"); return workflow.doManualTransition(defaultIssue, transitionKey, issueChangeContext); }
@Test public void doAutomaticTransition() { DefaultIssue issue = new DefaultIssue(); underTest.doAutomaticTransition(issue); verify(workflow).doAutomaticTransition(issue, issueChangeContext); }
public List<Transition> listTransitions(DefaultIssue issue) { if (issue.isFromExternalRuleEngine()){ return Collections.emptyList(); } String projectUuid = requireNonNull(issue.projectUuid()); return workflow.outTransitions(issue) .stream() .filter(transition -> (userSession.isLoggedIn() && isBlank(transition.requiredProjectPermission())) || userSession.hasComponentUuidPermission(transition.requiredProjectPermission(), projectUuid)) .collect(MoreCollectors.toList()); }
@Test public void wont_fix() { DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setStatus(STATUS_OPEN) .setRuleKey(RuleKey.of("squid", "AvoidCycle")) .setAssigneeUuid("morgan"); workflow.start(); workflow.doManualTransition(issue, DefaultTransitions.WONT_FIX, IssueChangeContext.createScan(new Date())); assertThat(issue.resolution()).isEqualTo(RESOLUTION_WONT_FIX); assertThat(issue.status()).isEqualTo(STATUS_RESOLVED); // should remove assignee assertThat(issue.assignee()).isNull(); }
@Before public void setUp() throws Exception { workflow.start(); }
public boolean doManualTransition(DefaultIssue issue, String transitionKey, IssueChangeContext issueChangeContext) { Transition transition = stateOf(issue).transition(transitionKey); if (!transition.automatic()) { functionExecutor.execute(transition.functions(), issue, issueChangeContext); updater.setStatus(issue, transition.to(), issueChangeContext); return true; } return false; }
@Test @UseDataProvider("allStatusesLeadingToClosed") public void do_not_automatically_reopen_closed_issues_of_security_hotspots(String previousStatus) { DefaultIssue[] issues = Arrays.stream(SUPPORTED_RESOLUTIONS_FOR_UNCLOSING) .map(resolution -> { DefaultIssue issue = newClosedIssue(resolution); setStatusPreviousToClosed(issue, previousStatus); issue.setType(RuleType.SECURITY_HOTSPOT); return issue; }) .toArray(DefaultIssue[]::new); Date now = new Date(); workflow.start(); Arrays.stream(issues).forEach(issue -> { workflow.doAutomaticTransition(issue, IssueChangeContext.createScan(now)); assertThat(issue.status()).isEqualTo(STATUS_CLOSED); assertThat(issue.updateDate()).isNull(); }); }
@Test public void list_no_out_transition_from_status_closed() { workflow.start(); DefaultIssue issue = new DefaultIssue().setStatus(STATUS_CLOSED).setRuleKey(RuleKey.of("java", "R1 ")); List<Transition> transitions = workflow.outTransitions(issue); assertThat(transitions).isEmpty(); }
public void doAutomaticTransition(DefaultIssue issue) { workflow.doAutomaticTransition(issue, changeContext); }