forked from gongxuegit/tiku-backend.net
perf: remove backoffice catalog query amplification
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Tiku.Application.Security;
|
||||
using Tiku.Domain.Operations;
|
||||
using Tiku.Domain.Platform;
|
||||
using Tiku.Domain.Tenancy;
|
||||
using Tiku.Infrastructure.Bootstrap;
|
||||
using Tiku.Infrastructure.Persistence;
|
||||
using Tiku.IntegrationTests.Infrastructure;
|
||||
|
||||
namespace Tiku.IntegrationTests.Bootstrap;
|
||||
|
||||
public sealed class BuiltinBackofficeCatalogSeederTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Seed_populates_complete_catalog_and_is_idempotent()
|
||||
{
|
||||
using var database = PostgresTestDatabase.Create();
|
||||
await using var dbContext = CreateDbContext(database.ConnectionString);
|
||||
var seeder = new BuiltinBackofficeCatalogSeeder(dbContext);
|
||||
|
||||
await seeder.SeedAsync();
|
||||
dbContext.ChangeTracker.Clear();
|
||||
await seeder.SeedAsync();
|
||||
|
||||
Assert.Equal(15, await dbContext.SaasFeatures.CountAsync());
|
||||
Assert.Equal(26, await dbContext.PermissionModules.CountAsync());
|
||||
Assert.Equal(35, await dbContext.BackendPermissions.CountAsync());
|
||||
Assert.Equal(21, await dbContext.BackendMenus.CountAsync());
|
||||
Assert.Equal(15, await dbContext.SaasFeatures.Select(item => item.Code).Distinct().CountAsync());
|
||||
Assert.Equal(26, await dbContext.PermissionModules.Select(item => item.Code).Distinct().CountAsync());
|
||||
Assert.Equal(35, await dbContext.BackendPermissions.Select(item => item.Code).Distinct().CountAsync());
|
||||
Assert.Equal(21, await dbContext.BackendMenus.Select(item => item.Code).Distinct().CountAsync());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Seed_preserves_existing_values_and_fills_partial_catalog()
|
||||
{
|
||||
using var database = PostgresTestDatabase.Create();
|
||||
await using var dbContext = CreateDbContext(database.ConnectionString);
|
||||
dbContext.SaasFeatures.Add(new SaasFeature
|
||||
{
|
||||
Code = SaasFeatureCatalog.CoreBackoffice,
|
||||
Name = "Custom feature name",
|
||||
Category = "custom",
|
||||
IsCore = true,
|
||||
Status = SaasFeatureStatus.Active
|
||||
});
|
||||
dbContext.PermissionModules.Add(new PermissionModule
|
||||
{
|
||||
Code = "tenant_dashboard",
|
||||
Name = "Custom module name",
|
||||
Area = BackendPermissionArea.Tenant
|
||||
});
|
||||
dbContext.BackendPermissions.Add(new BackendPermission
|
||||
{
|
||||
Code = BackendPermissions.TenantDashboardView,
|
||||
Name = "Custom permission name",
|
||||
Area = BackendPermissionArea.Tenant,
|
||||
PermissionModuleCode = "tenant_dashboard",
|
||||
IsSystem = true
|
||||
});
|
||||
dbContext.BackendMenus.Add(new BackendMenu
|
||||
{
|
||||
Code = "tenant.dashboard",
|
||||
Title = "Custom menu title",
|
||||
Area = BackendPermissionArea.Tenant,
|
||||
Path = "/custom-dashboard",
|
||||
PermissionCode = BackendPermissions.TenantDashboardView,
|
||||
IsActive = true
|
||||
});
|
||||
await dbContext.SaveChangesAsync();
|
||||
dbContext.ChangeTracker.Clear();
|
||||
|
||||
await new BuiltinBackofficeCatalogSeeder(dbContext).SeedAsync();
|
||||
|
||||
Assert.Equal("Custom feature name", (await dbContext.SaasFeatures.SingleAsync(
|
||||
item => item.Code == SaasFeatureCatalog.CoreBackoffice)).Name);
|
||||
Assert.Equal("Custom module name", (await dbContext.PermissionModules.SingleAsync(
|
||||
item => item.Code == "tenant_dashboard")).Name);
|
||||
Assert.Equal("Custom permission name", (await dbContext.BackendPermissions.SingleAsync(
|
||||
item => item.Code == BackendPermissions.TenantDashboardView)).Name);
|
||||
Assert.Equal("Custom menu title", (await dbContext.BackendMenus.SingleAsync(
|
||||
item => item.Code == "tenant.dashboard")).Title);
|
||||
Assert.Equal(15, await dbContext.SaasFeatures.CountAsync());
|
||||
Assert.Equal(26, await dbContext.PermissionModules.CountAsync());
|
||||
Assert.Equal(35, await dbContext.BackendPermissions.CountAsync());
|
||||
Assert.Equal(21, await dbContext.BackendMenus.CountAsync());
|
||||
Assert.False(await dbContext.PermissionModules.AnyAsync(module =>
|
||||
module.RequiredFeatureCode != null &&
|
||||
!dbContext.SaasFeatures.Any(feature => feature.Code == module.RequiredFeatureCode)));
|
||||
Assert.False(await dbContext.BackendPermissions.AnyAsync(permission =>
|
||||
!dbContext.PermissionModules.Any(module => module.Code == permission.PermissionModuleCode)));
|
||||
Assert.False(await dbContext.BackendMenus.AnyAsync(menu =>
|
||||
menu.PermissionCode != null &&
|
||||
!dbContext.BackendPermissions.Any(permission => permission.Code == menu.PermissionCode)));
|
||||
}
|
||||
|
||||
private static TikuDbContext CreateDbContext(string connectionString)
|
||||
{
|
||||
var options = new DbContextOptionsBuilder<TikuDbContext>()
|
||||
.UseNpgsql(connectionString, npgsql =>
|
||||
npgsql.MigrationsAssembly(typeof(TikuDbContext).Assembly.FullName))
|
||||
.Options;
|
||||
return new TikuDbContext(options);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user