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);
}
}
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))
{
if (step.Transitions.TryGetValue(to, out transition))
{
return true;
}
}
else if (to == Initial)
{
transition = WorkflowTransition.Default;
transition = null;
return true;
}
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 static readonly WorkflowTransition Default = new WorkflowTransition();
public string Expression { 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);
}
[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);
}
}
}

Loading…
Cancel
Save