using ColaFlow.Modules.Identity.Domain.Aggregates.Tenants; using FluentAssertions; using Xunit; namespace ColaFlow.Modules.Identity.Domain.Tests.ValueObjects; public sealed class TenantSlugTests { [Theory] [InlineData("acme")] [InlineData("beta-corp")] [InlineData("test-123")] [InlineData("abc")] public void Create_ShouldSucceed_ForValidSlug(string slug) { // Act var tenantSlug = TenantSlug.Create(slug); // Assert tenantSlug.Value.Should().Be(slug); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData("ab")] // Too short [InlineData("www")] // Reserved [InlineData("api")] // Reserved [InlineData("admin")] // Reserved [InlineData("acme_corp")] // Underscore [InlineData("acme corp")] // Space [InlineData("-acme")] // Starts with hyphen [InlineData("acme-")] // Ends with hyphen [InlineData("acme--corp")] // Double hyphen public void Create_ShouldThrow_ForInvalidSlug(string slug) { // Act & Assert var act = () => TenantSlug.Create(slug); act.Should().Throw(); } [Fact] public void Create_ShouldConvertToLowerCase() { // Act var tenantSlug = TenantSlug.Create("AcmeCorp"); // Assert tenantSlug.Value.Should().Be("acmecorp"); } [Fact] public void Create_ShouldTrimWhitespace() { // Act var tenantSlug = TenantSlug.Create(" acme "); // Assert tenantSlug.Value.Should().Be("acme"); } [Fact] public void Create_ShouldThrow_ForTooLongSlug() { // Arrange var longSlug = new string('a', 51); // Act & Assert var act = () => TenantSlug.Create(longSlug); act.Should().Throw() .WithMessage("*cannot exceed 50 characters*"); } }