73 lines
3.0 KiB
C#
73 lines
3.0 KiB
C#
using ItWorx.KnowledgeHub.Domain.Projects;
|
|
|
|
namespace ItWorx.KnowledgeHub.Domain.Tests;
|
|
|
|
public sealed class ProjectTests
|
|
{
|
|
private static readonly DateTimeOffset Now = new(2026, 8, 1, 12, 0, 0, TimeSpan.Zero);
|
|
|
|
private static Project CreateProject() =>
|
|
Project.Create(Guid.NewGuid(), "Kennisbank vernieuwing", "Samenvatting", ProjectPriority.Medium, "Huidige stand.", Guid.NewGuid(), Guid.NewGuid(), Now);
|
|
|
|
[Fact]
|
|
public void Create_starts_in_concept_status_with_a_derived_slug()
|
|
{
|
|
var project = CreateProject();
|
|
|
|
Assert.Equal(ProjectLifecycleStatus.Concept, project.Status);
|
|
Assert.Equal("kennisbank-vernieuwing", project.Slug);
|
|
Assert.Empty(project.Technologies);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(ProjectLifecycleStatus.Concept, ProjectLifecycleStatus.Planned, true)]
|
|
[InlineData(ProjectLifecycleStatus.Planned, ProjectLifecycleStatus.Active, true)]
|
|
[InlineData(ProjectLifecycleStatus.Active, ProjectLifecycleStatus.Blocked, true)]
|
|
[InlineData(ProjectLifecycleStatus.Blocked, ProjectLifecycleStatus.Active, true)]
|
|
[InlineData(ProjectLifecycleStatus.Active, ProjectLifecycleStatus.Maintenance, true)]
|
|
[InlineData(ProjectLifecycleStatus.Active, ProjectLifecycleStatus.Completed, true)]
|
|
[InlineData(ProjectLifecycleStatus.Completed, ProjectLifecycleStatus.Paused, true)]
|
|
[InlineData(ProjectLifecycleStatus.Paused, ProjectLifecycleStatus.Active, true)]
|
|
[InlineData(ProjectLifecycleStatus.Concept, ProjectLifecycleStatus.Archived, true)]
|
|
[InlineData(ProjectLifecycleStatus.Concept, ProjectLifecycleStatus.Active, false)]
|
|
[InlineData(ProjectLifecycleStatus.Archived, ProjectLifecycleStatus.Active, false)]
|
|
[InlineData(ProjectLifecycleStatus.Completed, ProjectLifecycleStatus.Active, false)]
|
|
public void ChangeStatus_only_allows_the_documented_lifecycle_transitions(
|
|
ProjectLifecycleStatus from, ProjectLifecycleStatus to, bool expectedAllowed)
|
|
{
|
|
Assert.Equal(expectedAllowed, Project.CanTransition(from, to));
|
|
}
|
|
|
|
[Fact]
|
|
public void ChangeStatus_throws_for_a_disallowed_transition()
|
|
{
|
|
var project = CreateProject();
|
|
|
|
var exception = Record.Exception(() => project.ChangeStatus(ProjectLifecycleStatus.Active, Guid.NewGuid(), Now));
|
|
|
|
Assert.IsType<InvalidOperationException>(exception);
|
|
}
|
|
|
|
[Fact]
|
|
public void ChangeStatus_out_of_archived_is_always_rejected()
|
|
{
|
|
var project = CreateProject();
|
|
project.ChangeStatus(ProjectLifecycleStatus.Archived, Guid.NewGuid(), Now);
|
|
|
|
var exception = Record.Exception(() => project.ChangeStatus(ProjectLifecycleStatus.Active, Guid.NewGuid(), Now));
|
|
|
|
Assert.IsType<InvalidOperationException>(exception);
|
|
Assert.True(project.IsArchived);
|
|
}
|
|
|
|
[Fact]
|
|
public void ReplaceTechnologies_normalizes_trims_deduplicates_and_bounds_the_list()
|
|
{
|
|
var project = CreateProject();
|
|
|
|
project.ReplaceTechnologies([" .NET ", ".net", "PostgreSQL", "", "React"]);
|
|
|
|
Assert.Equal([".NET", "PostgreSQL", "React"], project.Technologies);
|
|
}
|
|
}
|