Files
ColaFlow/colaflow-api/tests/Modules/Identity/ColaFlow.Modules.Identity.Infrastructure.Tests/Repositories/TenantRepositoryTests.cs
Yaojia Wang 1f66b25f30
Some checks failed
Code Coverage / Generate Coverage Report (push) Has been cancelled
Tests / Run Tests (9.0.x) (push) Has been cancelled
Tests / Docker Build Test (push) Has been cancelled
Tests / Test Summary (push) Has been cancelled
In progress
2025-11-03 14:00:24 +01:00

161 lines
4.9 KiB
C#

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<IdentityDbContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.Options;
var mockTenantContext = new Mock<ITenantContext>();
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();
}
}