public static Transition create(String key, String from, String to) { return builder(key).from(from).to(to).build(); }
@Test public void key_should_be_lower_case() { try { Transition.builder("CLOSE").from("OPEN").to("CLOSED").build(); fail(); } catch (Exception e) { assertThat(e).hasMessage("Transition key must be lower-case"); } }
@Test public void originating_status_should_be_set() { try { Transition.builder("close").from("").to("CLOSED").build(); fail(); } catch (Exception e) { assertThat(e).hasMessage("Originating status must be set"); } }
@Test public void should_verify_conditions() { DefaultIssue issue = new DefaultIssue(); Transition transition = Transition.builder("close") .from("OPEN").to("CLOSED") .conditions(condition1, condition2) .build(); when(condition1.matches(issue)).thenReturn(true); when(condition2.matches(issue)).thenReturn(false); assertThat(transition.supports(issue)).isFalse(); when(condition1.matches(issue)).thenReturn(true); when(condition2.matches(issue)).thenReturn(true); assertThat(transition.supports(issue)).isTrue(); }
@Test public void destination_status_should_be_set() { try { Transition.builder("close").from("OPEN").to("").build(); fail(); } catch (Exception e) { assertThat(e).hasMessage("Destination status must be set"); } }
@Test public void key_should_be_set() { try { Transition.builder("").from("OPEN").to("CLOSED").build(); fail(); } catch (Exception e) { assertThat(e).hasMessage("Transition key must be set"); } }
@Test public void test_simplest_transition() { Transition transition = Transition.builder("close") .from("OPEN").to("CLOSED") .build(); assertThat(transition.key()).isEqualTo("close"); assertThat(transition.from()).isEqualTo("OPEN"); assertThat(transition.to()).isEqualTo("CLOSED"); assertThat(transition.conditions()).isEmpty(); assertThat(transition.functions()).isEmpty(); assertThat(transition.requiredProjectPermission()).isNull(); }
@Test public void test_automatic_transition() { Transition transition = Transition.builder("close") .from("OPEN").to("CLOSED") .automatic() .build(); assertThat(transition.automatic()).isTrue(); } }
@Test public void test_builder() { Transition transition = Transition.builder("close") .from("OPEN").to("CLOSED") .conditions(condition1, condition2) .functions(function1, function2) .requiredProjectPermission(UserRole.ISSUE_ADMIN) .build(); assertThat(transition.key()).isEqualTo("close"); assertThat(transition.from()).isEqualTo("OPEN"); assertThat(transition.to()).isEqualTo("CLOSED"); assertThat(transition.conditions()).containsOnly(condition1, condition2); assertThat(transition.functions()).containsOnly(function1, function2); assertThat(transition.automatic()).isFalse(); assertThat(transition.requiredProjectPermission()).isEqualTo(UserRole.ISSUE_ADMIN); }
@Test public void stateKey() { StateMachine machine = StateMachine.builder() .states("OPEN", "RESOLVED", "CLOSED") .transition(Transition.builder("resolve").from("OPEN").to("RESOLVED").build()) .build(); assertThat(machine.state("OPEN")).isNotNull(); assertThat(machine.state("OPEN").transition("resolve")).isNotNull(); } }
private static void buildManualTransitions(StateMachine.Builder builder) { builder .transition(Transition.builder(DefaultTransitions.CONFIRM) .from(Issue.STATUS_OPEN).to(Issue.STATUS_CONFIRMED) .conditions(IsNotHotspotNorManualVulnerability.INSTANCE) .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.CONFIRM) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_CONFIRMED) .conditions(IsNotHotspotNorManualVulnerability.INSTANCE) .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.UNCONFIRM) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_REOPENED) .conditions(IsNotHotspotNorManualVulnerability.INSTANCE) .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.RESOLVE) .from(Issue.STATUS_OPEN).to(Issue.STATUS_RESOLVED) .conditions(IsNotHotspotNorManualVulnerability.INSTANCE) .functions(new SetResolution(Issue.RESOLUTION_FIXED)) .build()) .transition(Transition.builder(DefaultTransitions.RESOLVE) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_RESOLVED) .conditions(IsNotHotspotNorManualVulnerability.INSTANCE) .functions(new SetResolution(Issue.RESOLUTION_FIXED)) .build()) .transition(Transition.builder(DefaultTransitions.RESOLVE) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_RESOLVED) .conditions(IsNotHotspotNorManualVulnerability.INSTANCE)
.transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_OPEN).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .automatic() .build()) .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .automatic() .build()) .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .automatic() .build()) .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .transition(Transition.builder("automaticreopen") .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_REOPENED) .conditions(new NotCondition(IsBeingClosed.INSTANCE), new HasResolution(Issue.RESOLUTION_FIXED), IsNotHotspotNorManualVulnerability.INSTANCE) .transition(Transition.builder("automaticuncloseopen") .from(Issue.STATUS_CLOSED).to(Issue.STATUS_OPEN) .conditions(
private static void buildSecurityHotspotTransitions(StateMachine.Builder builder) { builder .transition(Transition.builder(DefaultTransitions.DETECT) .from(Issue.STATUS_OPEN).to(Issue.STATUS_OPEN) .conditions(new HasType(RuleType.SECURITY_HOTSPOT)) .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN) .build()) .transition(Transition.builder(DefaultTransitions.DETECT) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_OPEN) .conditions(new HasType(RuleType.SECURITY_HOTSPOT)) .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN) .build()) .transition(Transition.builder(DefaultTransitions.DETECT) .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_OPEN) .conditions(new HasType(RuleType.SECURITY_HOTSPOT), new HasResolution(Issue.RESOLUTION_WONT_FIX)) .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN) .build()) .transition(Transition.builder(DefaultTransitions.DISMISS) .from(Issue.STATUS_OPEN).to(Issue.STATUS_REOPENED) .conditions(IsManualVulnerability.INSTANCE) .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN) .build()) .transition(Transition.builder(DefaultTransitions.REQUEST_REVIEW) .from(Issue.STATUS_OPEN).to(Issue.STATUS_RESOLVED) .conditions(IsManualVulnerability.INSTANCE) .functions(new SetType(RuleType.SECURITY_HOTSPOT), new SetResolution(Issue.RESOLUTION_FIXED))
public static Transition create(String key, String from, String to) { return builder(key).from(from).to(to).build(); }
private static void buildManualTransitions(StateMachine.Builder builder) { builder.transition(Transition.builder(DefaultTransitions.CONFIRM) .from(Issue.STATUS_OPEN).to(Issue.STATUS_CONFIRMED) .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.CONFIRM) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_CONFIRMED) .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.UNCONFIRM) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_REOPENED) .functions(new SetResolution(null)) .build()) .transition(Transition.builder(DefaultTransitions.RESOLVE) .from(Issue.STATUS_OPEN).to(Issue.STATUS_RESOLVED) .functions(new SetResolution(Issue.RESOLUTION_FIXED)) .build()) .transition(Transition.builder(DefaultTransitions.RESOLVE) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_RESOLVED) .functions(new SetResolution(Issue.RESOLUTION_FIXED)) .build()) .transition(Transition.builder(DefaultTransitions.RESOLVE) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_RESOLVED) .functions(new SetResolution(Issue.RESOLUTION_FIXED)) .build()) .transition(Transition.builder(DefaultTransitions.REOPEN) .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_REOPENED) .functions(new SetResolution(null)) .transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE)
private static void buildAutomaticTransitions(StateMachine.Builder builder) { .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_OPEN).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .automatic() .build()) .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_REOPENED).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .automatic() .build()) .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_CONFIRMED).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .automatic() .build()) .transition(Transition.builder(AUTOMATIC_CLOSE_TRANSITION) .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_CLOSED) .conditions(IsBeingClosed.INSTANCE) .transition(Transition.builder("automaticreopen") .from(Issue.STATUS_RESOLVED).to(Issue.STATUS_REOPENED) .conditions(new NotCondition(IsBeingClosed.INSTANCE), new HasResolution(Issue.RESOLUTION_FIXED))