using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects;
using ColaFlow.Modules.ProjectManagement.Domain.Exceptions;
using FluentAssertions;
namespace ColaFlow.Domain.Tests.ValueObjects;
///
/// Unit tests for ProjectKey value object
///
public class ProjectKeyTests
{
[Fact]
public void Create_WithValidKey_ShouldCreateProjectKey()
{
// Arrange
var key = "COLA";
// Act
var projectKey = ProjectKey.Create(key);
// Assert
projectKey.Should().NotBeNull();
projectKey.Value.Should().Be(key);
}
[Theory]
[InlineData("A")]
[InlineData("AB")]
[InlineData("ABC")]
[InlineData("ABCD")]
[InlineData("ABCDEFGHIJ")] // 10 characters - max allowed
public void Create_WithValidLengthKeys_ShouldSucceed(string key)
{
// Act
var projectKey = ProjectKey.Create(key);
// Assert
projectKey.Value.Should().Be(key);
}
[Theory]
[InlineData("TEST")]
[InlineData("COLA")]
[InlineData("FLOW")]
[InlineData("PROJECT1")]
[InlineData("ABC123")]
public void Create_WithUppercaseLettersAndNumbers_ShouldSucceed(string key)
{
// Act
var projectKey = ProjectKey.Create(key);
// Assert
projectKey.Value.Should().Be(key);
}
[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Create_WithEmptyKey_ShouldThrowDomainException(string invalidKey)
{
// Act
Action act = () => ProjectKey.Create(invalidKey);
// Assert
act.Should().Throw()
.WithMessage("Project key cannot be empty");
}
[Fact]
public void Create_WithKeyExceeding10Characters_ShouldThrowDomainException()
{
// Arrange
var key = "ABCDEFGHIJK"; // 11 characters
// Act
Action act = () => ProjectKey.Create(key);
// Assert
act.Should().Throw()
.WithMessage("Project key cannot exceed 10 characters");
}
[Theory]
[InlineData("test")] // lowercase
[InlineData("Test")] // mixed case
[InlineData("TEST-1")] // hyphen
[InlineData("TEST_1")] // underscore
[InlineData("TEST 1")] // space
[InlineData("TEST.1")] // dot
[InlineData("TEST@1")] // special char
public void Create_WithInvalidCharacters_ShouldThrowDomainException(string invalidKey)
{
// Act
Action act = () => ProjectKey.Create(invalidKey);
// Assert
act.Should().Throw()
.WithMessage("Project key must contain only uppercase letters and numbers");
}
[Fact]
public void Equals_WithSameValue_ShouldReturnTrue()
{
// Arrange
var key = "TEST";
var projectKey1 = ProjectKey.Create(key);
var projectKey2 = ProjectKey.Create(key);
// Act & Assert
projectKey1.Should().Be(projectKey2);
projectKey1.Equals(projectKey2).Should().BeTrue();
}
[Fact]
public void Equals_WithDifferentValue_ShouldReturnFalse()
{
// Arrange
var projectKey1 = ProjectKey.Create("TEST1");
var projectKey2 = ProjectKey.Create("TEST2");
// Act & Assert
projectKey1.Should().NotBe(projectKey2);
projectKey1.Equals(projectKey2).Should().BeFalse();
}
[Fact]
public void GetHashCode_WithSameValue_ShouldReturnSameHashCode()
{
// Arrange
var key = "TEST";
var projectKey1 = ProjectKey.Create(key);
var projectKey2 = ProjectKey.Create(key);
// Act & Assert
projectKey1.GetHashCode().Should().Be(projectKey2.GetHashCode());
}
[Fact]
public void ToString_ShouldReturnKeyValue()
{
// Arrange
var key = "COLA";
var projectKey = ProjectKey.Create(key);
// Act
var result = projectKey.ToString();
// Assert
result.Should().Be(key);
}
[Fact]
public void ValueObject_ShouldBeImmutable()
{
// Arrange
var key = "TEST";
var projectKey = ProjectKey.Create(key);
var originalValue = projectKey.Value;
// Act - Try to get the value multiple times
var value1 = projectKey.Value;
var value2 = projectKey.Value;
// Assert
value1.Should().Be(originalValue);
value2.Should().Be(originalValue);
}
[Theory]
[InlineData("123")]
[InlineData("789")]
[InlineData("1234567890")]
public void Create_WithOnlyNumbers_ShouldSucceed(string key)
{
// Act
var projectKey = ProjectKey.Create(key);
// Assert
projectKey.Value.Should().Be(key);
}
}