From b791e8675ad545b82dd9efa2a633dd90db7dc64f Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 2 Jul 2019 17:10:28 +0200 Subject: [PATCH] Allow to go to initial state if state not found. --- .../Contents/Workflow.cs | 19 ++++++++++-- .../Contents/WorkflowTransition.cs | 2 ++ .../Model/Contents/WorkflowTests.cs | 31 +++++++++++++++++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/Workflow.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/Workflow.cs index 859e546ef..4e67af712 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/Workflow.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/Workflow.cs @@ -61,16 +61,29 @@ namespace Squidex.Domain.Apps.Core.Contents yield return (transition.Key, Steps[transition.Key], transition.Value); } } + else if (TryGetStep(Initial, out var initial)) + { + yield return (Initial, initial, WorkflowTransition.Default); + } } public bool TryGetTransition(Status from, Status to, out WorkflowTransition transition) { - if (TryGetStep(from, out var step) && step.Transitions.TryGetValue(to, out transition)) + transition = null; + + if (TryGetStep(from, out var step)) { - return true; + if (step.Transitions.TryGetValue(to, out transition)) + { + return true; + } } + else if (to == Initial) + { + transition = WorkflowTransition.Default; - transition = null; + return true; + } return false; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs index 5beed9a62..a41c5ba73 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs @@ -9,6 +9,8 @@ namespace Squidex.Domain.Apps.Core.Contents { public sealed class WorkflowTransition { + public static readonly WorkflowTransition Default = new WorkflowTransition(); + public string Expression { get; } public string Role { get; } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowTests.cs index 21515232d..26c0fb5c5 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowTests.cs @@ -77,10 +77,20 @@ namespace Squidex.Domain.Apps.Core.Model.Contents Assert.Equal("ToArchivedRole", transition.Role); } + [Fact] + public void Should_provide_transition_to_initial_if_step_not_found() + { + var found = workflow.TryGetTransition(new Status("Other"), Status.Draft, out var transition); + + Assert.True(found); + Assert.Null(transition.Expression); + Assert.Null(transition.Role); + } + [Fact] public void Should_not_provide_transition_from_unknown_step() { - var found = workflow.TryGetTransition(default, Status.Archived, out var transition); + var found = workflow.TryGetTransition(new Status("Other"), Status.Archived, out var transition); Assert.False(found); Assert.Null(transition); @@ -107,14 +117,29 @@ namespace Squidex.Domain.Apps.Core.Model.Contents Assert.Equal(Status.Archived, status1); Assert.Equal("ToArchivedExpr", transition1.Expression); Assert.Equal("ToArchivedRole", transition1.Role); - Assert.Same(workflow.Steps[Status.Archived], step1); + Assert.Same(workflow.Steps[status1], step1); var (status2, step2, transition2) = transitions[1]; Assert.Equal(Status.Published, status2); Assert.Equal("ToPublishedExpr", transition2.Expression); Assert.Equal("ToPublishedRole", transition2.Role); - Assert.Same(workflow.Steps[Status.Published], step2); + Assert.Same(workflow.Steps[status2], step2); + } + + [Fact] + public void Should_provide_transitions_to_initial_step_if_status_not_found() + { + var transitions = workflow.GetTransitions(new Status("Other")).ToArray(); + + Assert.Single(transitions); + + var (status1, step1, transition1) = transitions[0]; + + Assert.Equal(Status.Draft, status1); + Assert.Null(transition1.Expression); + Assert.Null(transition1.Role); + Assert.Same(workflow.Steps[status1], step1); } } }