using ColaFlow.Modules.Identity.Domain.Aggregates.Tenants; using ColaFlow.Modules.Identity.Infrastructure.Persistence; using ColaFlow.Modules.Identity.Infrastructure.Persistence.Repositories; using ColaFlow.Modules.Identity.Infrastructure.Services; using FluentAssertions; using Microsoft.EntityFrameworkCore; using Moq; namespace ColaFlow.Modules.Identity.Infrastructure.Tests.Repositories; public class TenantRepositoryTests : IDisposable { private readonly IdentityDbContext _context; private readonly TenantRepository _repository; public TenantRepositoryTests() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString()) .Options; var mockTenantContext = new Mock(); mockTenantContext.Setup(x => x.IsSet).Returns(false); _context = new IdentityDbContext(options, mockTenantContext.Object); _repository = new TenantRepository(_context); } [Fact] public async Task AddAsync_ShouldPersistTenant() { // Arrange var tenant = Tenant.Create( TenantName.Create("Test Company"), TenantSlug.Create("test-company"), SubscriptionPlan.Professional); // Act await _repository.AddAsync(tenant); // Assert var retrieved = await _repository.GetByIdAsync(TenantId.Create(tenant.Id)); retrieved.Should().NotBeNull(); retrieved!.Name.Value.Should().Be("Test Company"); retrieved.Slug.Value.Should().Be("test-company"); retrieved.Plan.Should().Be(SubscriptionPlan.Professional); } [Fact] public async Task GetBySlugAsync_ShouldReturnTenant() { // Arrange var slug = TenantSlug.Create("acme-corp"); var tenant = Tenant.Create( TenantName.Create("Acme Corp"), slug, SubscriptionPlan.Enterprise); await _repository.AddAsync(tenant); // Act var retrieved = await _repository.GetBySlugAsync(slug); // Assert retrieved.Should().NotBeNull(); retrieved!.Slug.Value.Should().Be("acme-corp"); retrieved.Name.Value.Should().Be("Acme Corp"); } [Fact] public async Task ExistsBySlugAsync_ShouldReturnTrue_WhenSlugExists() { // Arrange var slug = TenantSlug.Create("unique-slug"); var tenant = Tenant.Create( TenantName.Create("Unique Company"), slug, SubscriptionPlan.Free); await _repository.AddAsync(tenant); // Act var exists = await _repository.ExistsBySlugAsync(slug); // Assert exists.Should().BeTrue(); } [Fact] public async Task ExistsBySlugAsync_ShouldReturnFalse_WhenSlugDoesNotExist() { // Arrange var slug = TenantSlug.Create("non-existent"); // Act var exists = await _repository.ExistsBySlugAsync(slug); // Assert exists.Should().BeFalse(); } [Fact] public async Task UpdateAsync_ShouldModifyTenant() { // Arrange var tenant = Tenant.Create( TenantName.Create("Original Name"), TenantSlug.Create("original-slug"), SubscriptionPlan.Free); await _repository.AddAsync(tenant); // Act tenant.UpdateName(TenantName.Create("Updated Name")); await _repository.UpdateAsync(tenant); // Assert var retrieved = await _repository.GetByIdAsync(TenantId.Create(tenant.Id)); retrieved.Should().NotBeNull(); retrieved!.Name.Value.Should().Be("Updated Name"); } [Fact] public async Task GetAllAsync_ShouldReturnAllTenants() { // Arrange var tenant1 = Tenant.Create(TenantName.Create("Tenant 1"), TenantSlug.Create("tenant-1"), SubscriptionPlan.Free); var tenant2 = Tenant.Create(TenantName.Create("Tenant 2"), TenantSlug.Create("tenant-2"), SubscriptionPlan.Starter); await _repository.AddAsync(tenant1); await _repository.AddAsync(tenant2); // Act var allTenants = await _repository.GetAllAsync(); // Assert allTenants.Should().HaveCount(2); allTenants.Should().Contain(t => t.Name.Value == "Tenant 1"); allTenants.Should().Contain(t => t.Name.Value == "Tenant 2"); } [Fact] public async Task DeleteAsync_ShouldRemoveTenant() { // Arrange var tenant = Tenant.Create( TenantName.Create("To Delete"), TenantSlug.Create("to-delete"), SubscriptionPlan.Free); await _repository.AddAsync(tenant); // Act await _repository.DeleteAsync(tenant); // Assert var retrieved = await _repository.GetByIdAsync(TenantId.Create(tenant.Id)); retrieved.Should().BeNull(); } public void Dispose() { _context.Dispose(); } }