mirror of https://github.com/Squidex/squidex.git
13 changed files with 261 additions and 37 deletions
@ -0,0 +1,37 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using Newtonsoft.Json; |
||||
|
using Squidex.Infrastructure.Json.Newtonsoft; |
||||
|
|
||||
|
namespace Squidex.Domain.Apps.Core.Contents.Json |
||||
|
{ |
||||
|
public sealed class WorkflowConverter : JsonClassConverter<Workflows> |
||||
|
{ |
||||
|
protected override void WriteValue(JsonWriter writer, Workflows value, JsonSerializer serializer) |
||||
|
{ |
||||
|
var json = new Dictionary<Guid, Workflow>(value.Count); |
||||
|
|
||||
|
foreach (var workflow in value) |
||||
|
{ |
||||
|
json.Add(workflow.Key, workflow.Value); |
||||
|
} |
||||
|
|
||||
|
serializer.Serialize(writer, json); |
||||
|
} |
||||
|
|
||||
|
protected override Workflows ReadValue(JsonReader reader, Type objectType, JsonSerializer serializer) |
||||
|
{ |
||||
|
var json = serializer.Deserialize<Dictionary<Guid, Workflow>>(reader); |
||||
|
|
||||
|
return new Workflows(json.ToArray()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System; |
||||
|
using System.ComponentModel; |
||||
|
using System.Globalization; |
||||
|
|
||||
|
namespace Squidex.Domain.Apps.Core.Contents |
||||
|
{ |
||||
|
public sealed class StatusConverter : TypeConverter |
||||
|
{ |
||||
|
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) |
||||
|
{ |
||||
|
return sourceType == typeof(string); |
||||
|
} |
||||
|
|
||||
|
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) |
||||
|
{ |
||||
|
return destinationType == typeof(string); |
||||
|
} |
||||
|
|
||||
|
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) |
||||
|
{ |
||||
|
return new Status(value?.ToString()); |
||||
|
} |
||||
|
|
||||
|
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) |
||||
|
{ |
||||
|
return value.ToString(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using FluentAssertions; |
||||
|
using Squidex.Domain.Apps.Core.Contents; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Squidex.Domain.Apps.Core.Model.Contents |
||||
|
{ |
||||
|
public class WorkflowJsonTests |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void Should_serialize_and_deserialize() |
||||
|
{ |
||||
|
var workflow = Workflow.Default; |
||||
|
|
||||
|
var serialized = workflow.SerializeAndDeserialize(); |
||||
|
|
||||
|
serialized.Should().BeEquivalentTo(workflow); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_serialize_and_deserialize_workflows() |
||||
|
{ |
||||
|
var workflow = Workflows.Empty.Set(Workflow.Default); |
||||
|
|
||||
|
var serialized = workflow.SerializeAndDeserialize(); |
||||
|
|
||||
|
serialized.Should().BeEquivalentTo(workflow); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,116 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using Squidex.Domain.Apps.Core.Contents; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Squidex.Domain.Apps.Core.Model.Contents |
||||
|
{ |
||||
|
public class WorkflowTests |
||||
|
{ |
||||
|
private readonly Workflow workflow = new Workflow( |
||||
|
new Dictionary<Status, WorkflowStep> |
||||
|
{ |
||||
|
[Status.Draft] = |
||||
|
new WorkflowStep( |
||||
|
new Dictionary<Status, WorkflowTransition> |
||||
|
{ |
||||
|
[Status.Archived] = new WorkflowTransition("ToArchivedExpr", "ToArchivedRole"), |
||||
|
[Status.Published] = new WorkflowTransition("ToPublishedExpr", "ToPublishedRole") |
||||
|
}, |
||||
|
StatusColors.Draft), |
||||
|
[Status.Archived] = |
||||
|
new WorkflowStep( |
||||
|
new Dictionary<Status, WorkflowTransition>(), |
||||
|
StatusColors.Archived, true), |
||||
|
[Status.Published] = |
||||
|
new WorkflowStep( |
||||
|
new Dictionary<Status, WorkflowTransition>(), |
||||
|
StatusColors.Archived) |
||||
|
}, Status.Draft); |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_provide_initial_state() |
||||
|
{ |
||||
|
var (status, step) = workflow.GetInitialStep(); |
||||
|
|
||||
|
Assert.Equal(Status.Draft, status); |
||||
|
Assert.Equal(StatusColors.Draft, step.Color); |
||||
|
Assert.Same(workflow.Steps[Status.Draft], step); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_provide_step() |
||||
|
{ |
||||
|
var found = workflow.TryGetStep(Status.Draft, out var step); |
||||
|
|
||||
|
Assert.True(found); |
||||
|
Assert.Same(workflow.Steps[Status.Draft], step); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_not_provide_unknown_step() |
||||
|
{ |
||||
|
var found = workflow.TryGetStep(default, out var step); |
||||
|
|
||||
|
Assert.False(found); |
||||
|
Assert.Null(step); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_provide_transition() |
||||
|
{ |
||||
|
var found = workflow.TryGetTransition(Status.Draft, Status.Archived, out var transition); |
||||
|
|
||||
|
Assert.True(found); |
||||
|
Assert.Equal("ToArchivedExpr", transition.Expression); |
||||
|
Assert.Equal("ToArchivedRole", transition.Role); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_not_provide_transition_from_unknown_step() |
||||
|
{ |
||||
|
var found = workflow.TryGetTransition(default, Status.Archived, out var transition); |
||||
|
|
||||
|
Assert.False(found); |
||||
|
Assert.Null(transition); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_not_provide_transition_to_unknown_step() |
||||
|
{ |
||||
|
var found = workflow.TryGetTransition(Status.Draft, default, out var transition); |
||||
|
|
||||
|
Assert.False(found); |
||||
|
Assert.Null(transition); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_provide_transitions() |
||||
|
{ |
||||
|
var transitions = workflow.GetTransitions(Status.Draft).ToArray(); |
||||
|
|
||||
|
Assert.Equal(2, transitions.Length); |
||||
|
|
||||
|
var (status1, step1, transition1) = transitions[0]; |
||||
|
|
||||
|
Assert.Equal(Status.Archived, status1); |
||||
|
Assert.Equal("ToArchivedExpr", transition1.Expression); |
||||
|
Assert.Equal("ToArchivedRole", transition1.Role); |
||||
|
Assert.Same(workflow.Steps[Status.Archived], 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); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue