forked from gongxuegit/tiku-backend.net
feat: add operations content and audit persistence
This commit is contained in:
@@ -5,6 +5,7 @@ using Tiku.Domain.Commerce;
|
||||
using Tiku.Domain.Content;
|
||||
using Tiku.Domain.Growth;
|
||||
using Tiku.Domain.Learning;
|
||||
using Tiku.Domain.Operations;
|
||||
using Tiku.Domain.QuestionBanks;
|
||||
using Tiku.Domain.Tenancy;
|
||||
using Tiku.Infrastructure.Persistence;
|
||||
@@ -27,7 +28,7 @@ public sealed class PersistenceModelTests
|
||||
.Select(entity => entity.GetTableName())
|
||||
.ToHashSet(StringComparer.Ordinal);
|
||||
|
||||
Assert.Equal(90, tableNames.Count);
|
||||
Assert.Equal(100, tableNames.Count);
|
||||
Assert.Contains("tenants", tableNames);
|
||||
Assert.Contains("tenant_settings", tableNames);
|
||||
Assert.Contains("content_entries", tableNames);
|
||||
@@ -96,6 +97,16 @@ public sealed class PersistenceModelTests
|
||||
Assert.Contains("tenant_commission_settings", tableNames);
|
||||
Assert.Contains("commission_settlements", tableNames);
|
||||
Assert.Contains("commission_settlement_items", tableNames);
|
||||
Assert.Contains("banners", tableNames);
|
||||
Assert.Contains("faqs", tableNames);
|
||||
Assert.Contains("announcements", tableNames);
|
||||
Assert.Contains("audit_logs", tableNames);
|
||||
Assert.Contains("user_notifications", tableNames);
|
||||
Assert.Contains("badges", tableNames);
|
||||
Assert.Contains("user_badges", tableNames);
|
||||
Assert.Contains("tenant_content_notifications", tableNames);
|
||||
Assert.Contains("tenant_theme_templates", tableNames);
|
||||
Assert.Contains("tenant_theme_configs", tableNames);
|
||||
Assert.Contains("questions", tableNames);
|
||||
Assert.Contains("question_versions", tableNames);
|
||||
Assert.Contains("answer_records", tableNames);
|
||||
@@ -586,4 +597,68 @@ public sealed class PersistenceModelTests
|
||||
Assert.Equal(scale, property.GetScale());
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(typeof(AuditLog), nameof(AuditLog.Details), "'{}'::jsonb")]
|
||||
[InlineData(typeof(UserNotification), nameof(UserNotification.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(Badge), nameof(Badge.ConditionExtra), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantContentNotification), nameof(TenantContentNotification.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantThemeTemplate), nameof(TenantThemeTemplate.Theme), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantThemeTemplate), nameof(TenantThemeTemplate.PublicAssets), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantThemeConfig), nameof(TenantThemeConfig.ActiveTheme), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantThemeConfig), nameof(TenantThemeConfig.ActivePublicAssets), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantThemeConfig), nameof(TenantThemeConfig.DraftTheme), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantThemeConfig), nameof(TenantThemeConfig.DraftPublicAssets), "'{}'::jsonb")]
|
||||
public void Operations_json_properties_are_mapped_to_jsonb(
|
||||
Type entityType,
|
||||
string propertyName,
|
||||
string expectedDefaultValueSql)
|
||||
{
|
||||
using var context = new TikuDbContext(Options);
|
||||
|
||||
var property = context.Model.FindEntityType(entityType)!
|
||||
.FindProperty(propertyName)!;
|
||||
|
||||
Assert.Equal("jsonb", property.GetColumnType());
|
||||
Assert.Equal(expectedDefaultValueSql, property.GetDefaultValueSql());
|
||||
Assert.Equal(typeof(System.Text.Json.JsonElement), property.ClrType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Operations_tables_have_expected_unique_indexes_and_condition_precision()
|
||||
{
|
||||
using var context = new TikuDbContext(Options);
|
||||
|
||||
AssertHasUniqueIndex<Banner>(nameof(Banner.TenantId), nameof(Banner.LegacyId));
|
||||
AssertHasUniqueIndex<UserNotification>(
|
||||
nameof(UserNotification.TenantId),
|
||||
nameof(UserNotification.UserId),
|
||||
nameof(UserNotification.NotificationType),
|
||||
nameof(UserNotification.DedupeKey));
|
||||
AssertHasUniqueIndex<Badge>(nameof(Badge.TenantId), nameof(Badge.LegacyId));
|
||||
AssertHasUniqueIndex<UserBadge>(
|
||||
nameof(UserBadge.TenantId),
|
||||
nameof(UserBadge.UserId),
|
||||
nameof(UserBadge.BadgeId));
|
||||
AssertHasUniqueIndex<TenantThemeTemplate>(nameof(TenantThemeTemplate.Code));
|
||||
AssertHasUniqueIndex<TenantThemeConfig>(nameof(TenantThemeConfig.TenantId));
|
||||
|
||||
var conditionValue = context.Model.FindEntityType(typeof(Badge))!
|
||||
.FindProperty(nameof(Badge.ConditionValue))!;
|
||||
|
||||
Assert.Equal(18, conditionValue.GetPrecision());
|
||||
Assert.Equal(4, conditionValue.GetScale());
|
||||
|
||||
void AssertHasUniqueIndex<TEntity>(params string[] propertyNames)
|
||||
{
|
||||
var indexes = context.Model.FindEntityType(typeof(TEntity))!.GetIndexes();
|
||||
|
||||
Assert.Contains(
|
||||
indexes,
|
||||
index => index.IsUnique
|
||||
&& index.Properties
|
||||
.Select(property => property.Name)
|
||||
.SequenceEqual(propertyNames));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user