mirror of https://github.com/Squidex/squidex.git
9 changed files with 293 additions and 31 deletions
@ -0,0 +1,262 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschränkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Security.Claims; |
||||
|
using System.Threading.Tasks; |
||||
|
using FakeItEasy; |
||||
|
using FluentAssertions; |
||||
|
using Squidex.Domain.Apps.Core.Contents; |
||||
|
using Squidex.Domain.Apps.Core.Scripting; |
||||
|
using Squidex.Domain.Apps.Entities.Apps; |
||||
|
using Squidex.Domain.Apps.Entities.Schemas; |
||||
|
using Squidex.Infrastructure; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Squidex.Domain.Apps.Entities.Contents |
||||
|
{ |
||||
|
public class DynamicContentWorkflowTests |
||||
|
{ |
||||
|
private readonly NamedId<Guid> appId = NamedId.Of(Guid.NewGuid(), "my-app"); |
||||
|
private readonly IAppProvider appProvider = A.Fake<IAppProvider>(); |
||||
|
private readonly IAppEntity appEntity = A.Fake<IAppEntity>(); |
||||
|
private readonly DynamicContentWorkflow sut; |
||||
|
|
||||
|
private readonly Workflow workflow = new Workflow( |
||||
|
new Dictionary<Status, WorkflowStep> |
||||
|
{ |
||||
|
[Status.Archived] = |
||||
|
new WorkflowStep( |
||||
|
new Dictionary<Status, WorkflowTransition> |
||||
|
{ |
||||
|
[Status.Draft] = new WorkflowTransition() |
||||
|
}, |
||||
|
StatusColors.Archived, true), |
||||
|
[Status.Draft] = |
||||
|
new WorkflowStep( |
||||
|
new Dictionary<Status, WorkflowTransition> |
||||
|
{ |
||||
|
[Status.Archived] = new WorkflowTransition(), |
||||
|
[Status.Published] = new WorkflowTransition("data.field.iv === 2", "Editor") |
||||
|
}, |
||||
|
StatusColors.Draft), |
||||
|
[Status.Published] = |
||||
|
new WorkflowStep( |
||||
|
new Dictionary<Status, WorkflowTransition> |
||||
|
{ |
||||
|
[Status.Archived] = new WorkflowTransition(), |
||||
|
[Status.Draft] = new WorkflowTransition() |
||||
|
}, |
||||
|
StatusColors.Published) |
||||
|
}, |
||||
|
Status.Draft); |
||||
|
|
||||
|
public DynamicContentWorkflowTests() |
||||
|
{ |
||||
|
A.CallTo(() => appProvider.GetAppAsync(appId.Id)) |
||||
|
.Returns(appEntity); |
||||
|
|
||||
|
A.CallTo(() => appEntity.Workflows) |
||||
|
.Returns(Workflows.Empty.Set(workflow)); |
||||
|
|
||||
|
sut = new DynamicContentWorkflow(new JintScriptEngine(), appProvider); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_draft_as_initial_status() |
||||
|
{ |
||||
|
var expected = new StatusInfo(Status.Draft, StatusColors.Draft); |
||||
|
|
||||
|
var result = await sut.GetInitialStatusAsync(CreateSchema()); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_check_is_valid_next() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Draft, 2); |
||||
|
|
||||
|
var result = await sut.CanMoveToAsync(content, Status.Published, User("Editor")); |
||||
|
|
||||
|
Assert.True(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_not_allow_transition_if_role_is_not_allowed() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Draft, 2); |
||||
|
|
||||
|
var result = await sut.CanMoveToAsync(content, Status.Published, User("Developer")); |
||||
|
|
||||
|
Assert.False(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_not_allow_transition_if_expression_does_not_evauate_to_true() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Draft, 4); |
||||
|
|
||||
|
var result = await sut.CanMoveToAsync(content, Status.Published, User("Editor")); |
||||
|
|
||||
|
Assert.False(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_be_able_to_update_published() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Published, 2); |
||||
|
|
||||
|
var result = await sut.CanUpdateAsync(content); |
||||
|
|
||||
|
Assert.True(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_be_able_to_update_draft() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Published, 2); |
||||
|
|
||||
|
var result = await sut.CanUpdateAsync(content); |
||||
|
|
||||
|
Assert.True(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_not_be_able_to_update_archived() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Archived, 2); |
||||
|
|
||||
|
var result = await sut.CanUpdateAsync(content); |
||||
|
|
||||
|
Assert.False(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_get_next_statuses_for_draft() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Draft, 2); |
||||
|
|
||||
|
var expected = new[] |
||||
|
{ |
||||
|
new StatusInfo(Status.Archived, StatusColors.Archived) |
||||
|
}; |
||||
|
|
||||
|
var result = await sut.GetNextsAsync(content, User("Developer")); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_limit_next_statuses_if_expression_does_not_evauate_to_true() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Draft, 4); |
||||
|
|
||||
|
var expected = new[] |
||||
|
{ |
||||
|
new StatusInfo(Status.Archived, StatusColors.Archived) |
||||
|
}; |
||||
|
|
||||
|
var result = await sut.GetNextsAsync(content, User("Editor")); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_limit_next_statuses_if_role_is_not_allowed() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Draft, 2); |
||||
|
|
||||
|
var expected = new[] |
||||
|
{ |
||||
|
new StatusInfo(Status.Archived, StatusColors.Archived), |
||||
|
new StatusInfo(Status.Published, StatusColors.Published) |
||||
|
}; |
||||
|
|
||||
|
var result = await sut.GetNextsAsync(content, User("Editor")); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_get_next_statuses_for_archived() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Archived, 2); |
||||
|
|
||||
|
var expected = new[] |
||||
|
{ |
||||
|
new StatusInfo(Status.Draft, StatusColors.Draft) |
||||
|
}; |
||||
|
|
||||
|
var result = await sut.GetNextsAsync(content, null); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_get_next_statuses_for_published() |
||||
|
{ |
||||
|
var content = CreateContent(Status.Published, 2); |
||||
|
|
||||
|
var expected = new[] |
||||
|
{ |
||||
|
new StatusInfo(Status.Archived, StatusColors.Archived), |
||||
|
new StatusInfo(Status.Draft, StatusColors.Draft) |
||||
|
}; |
||||
|
|
||||
|
var result = await sut.GetNextsAsync(content, null); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_return_all_statuses() |
||||
|
{ |
||||
|
var expected = new[] |
||||
|
{ |
||||
|
new StatusInfo(Status.Archived, StatusColors.Archived), |
||||
|
new StatusInfo(Status.Draft, StatusColors.Draft), |
||||
|
new StatusInfo(Status.Published, StatusColors.Published) |
||||
|
}; |
||||
|
|
||||
|
var result = await sut.GetAllAsync(CreateSchema()); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
|
||||
|
private ISchemaEntity CreateSchema() |
||||
|
{ |
||||
|
var schema = A.Fake<ISchemaEntity>(); |
||||
|
|
||||
|
A.CallTo(() => schema.AppId).Returns(appId); |
||||
|
|
||||
|
return schema; |
||||
|
} |
||||
|
|
||||
|
private IContentEntity CreateContent(Status status, int value) |
||||
|
{ |
||||
|
var data = |
||||
|
new NamedContentData() |
||||
|
.AddField("field", |
||||
|
new ContentFieldData() |
||||
|
.AddValue("iv", value)); |
||||
|
|
||||
|
return new ContentEntity { AppId = appId, Status = status, DataDraft = data }; |
||||
|
} |
||||
|
|
||||
|
private ClaimsPrincipal User(string role) |
||||
|
{ |
||||
|
var userIdentity = new ClaimsIdentity(); |
||||
|
var userPrincipal = new ClaimsPrincipal(userIdentity); |
||||
|
|
||||
|
userIdentity.AddClaim(new Claim(ClaimTypes.Role, role)); |
||||
|
|
||||
|
return userPrincipal; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue