Browse Source

Allow to go to initial state if state not found.

pull/383/head
Sebastian Stehle 7 years ago
parent
commit
b791e8675a
  1. 17
      src/Squidex.Domain.Apps.Core.Model/Contents/Workflow.cs
  2. 2
      src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs
  3. 31
      tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowTests.cs

17
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); 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) 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))
{
if (step.Transitions.TryGetValue(to, out transition))
{ {
return true; return true;
} }
}
else if (to == Initial)
{
transition = WorkflowTransition.Default;
transition = null; return true;
}
return false; return false;
} }

2
src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs

@ -9,6 +9,8 @@ namespace Squidex.Domain.Apps.Core.Contents
{ {
public sealed class WorkflowTransition public sealed class WorkflowTransition
{ {
public static readonly WorkflowTransition Default = new WorkflowTransition();
public string Expression { get; } public string Expression { get; }
public string Role { get; } public string Role { get; }

31
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); 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] [Fact]
public void Should_not_provide_transition_from_unknown_step() 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.False(found);
Assert.Null(transition); Assert.Null(transition);
@ -107,14 +117,29 @@ namespace Squidex.Domain.Apps.Core.Model.Contents
Assert.Equal(Status.Archived, status1); Assert.Equal(Status.Archived, status1);
Assert.Equal("ToArchivedExpr", transition1.Expression); Assert.Equal("ToArchivedExpr", transition1.Expression);
Assert.Equal("ToArchivedRole", transition1.Role); Assert.Equal("ToArchivedRole", transition1.Role);
Assert.Same(workflow.Steps[Status.Archived], step1); Assert.Same(workflow.Steps[status1], step1);
var (status2, step2, transition2) = transitions[1]; var (status2, step2, transition2) = transitions[1];
Assert.Equal(Status.Published, status2); Assert.Equal(Status.Published, status2);
Assert.Equal("ToPublishedExpr", transition2.Expression); Assert.Equal("ToPublishedExpr", transition2.Expression);
Assert.Equal("ToPublishedRole", transition2.Role); 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);
} }
} }
} }

Loading…
Cancel
Save