forked from xiongyuxing/tiku-backend.net
feat: add referral crm and commission persistence
This commit is contained in:
@@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Tiku.Domain.Commerce;
|
||||
using Tiku.Domain.Content;
|
||||
using Tiku.Domain.Growth;
|
||||
using Tiku.Domain.Learning;
|
||||
using Tiku.Domain.QuestionBanks;
|
||||
using Tiku.Domain.Tenancy;
|
||||
@@ -26,7 +27,7 @@ public sealed class PersistenceModelTests
|
||||
.Select(entity => entity.GetTableName())
|
||||
.ToHashSet(StringComparer.Ordinal);
|
||||
|
||||
Assert.Equal(79, tableNames.Count);
|
||||
Assert.Equal(90, tableNames.Count);
|
||||
Assert.Contains("tenants", tableNames);
|
||||
Assert.Contains("tenant_settings", tableNames);
|
||||
Assert.Contains("content_entries", tableNames);
|
||||
@@ -84,6 +85,17 @@ public sealed class PersistenceModelTests
|
||||
Assert.Contains("tenant_payment_accounts", tableNames);
|
||||
Assert.Contains("tenant_subscriptions", tableNames);
|
||||
Assert.Contains("tenant_usage_records", tableNames);
|
||||
Assert.Contains("referral_tracks", tableNames);
|
||||
Assert.Contains("referral_codes", tableNames);
|
||||
Assert.Contains("referral_leads", tableNames);
|
||||
Assert.Contains("referral_team_edges", tableNames);
|
||||
Assert.Contains("referral_qrcodes", tableNames);
|
||||
Assert.Contains("crm_config", tableNames);
|
||||
Assert.Contains("crm_webhook_queue", tableNames);
|
||||
Assert.Contains("crm_webhook_log", tableNames);
|
||||
Assert.Contains("tenant_commission_settings", tableNames);
|
||||
Assert.Contains("commission_settlements", tableNames);
|
||||
Assert.Contains("commission_settlement_items", tableNames);
|
||||
Assert.Contains("questions", tableNames);
|
||||
Assert.Contains("question_versions", tableNames);
|
||||
Assert.Contains("answer_records", tableNames);
|
||||
@@ -503,4 +515,75 @@ public sealed class PersistenceModelTests
|
||||
.SequenceEqual(propertyNames));
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(typeof(ReferralTrack), nameof(ReferralTrack.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ReferralCode), nameof(ReferralCode.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ReferralLead), nameof(ReferralLead.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ReferralTeamEdge), nameof(ReferralTeamEdge.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ReferralQrcode), nameof(ReferralQrcode.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(CrmConfig), nameof(CrmConfig.AssignmentPool), "'[]'::jsonb")]
|
||||
[InlineData(typeof(CrmConfig), nameof(CrmConfig.AssignmentConfig), "'{}'::jsonb")]
|
||||
[InlineData(typeof(CrmWebhookQueueItem), nameof(CrmWebhookQueueItem.Payload), "'{}'::jsonb")]
|
||||
[InlineData(typeof(CrmWebhookLog), nameof(CrmWebhookLog.RequestPayload), "'{}'::jsonb")]
|
||||
[InlineData(typeof(TenantCommissionSetting), nameof(TenantCommissionSetting.Config), "'{}'::jsonb")]
|
||||
[InlineData(typeof(CommissionSettlement), nameof(CommissionSettlement.Metadata), "'{}'::jsonb")]
|
||||
[InlineData(typeof(CommissionSettlementItem), nameof(CommissionSettlementItem.Metadata), "'{}'::jsonb")]
|
||||
public void Growth_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 Growth_tables_have_expected_unique_indexes_and_decimal_precision()
|
||||
{
|
||||
using var context = new TikuDbContext(Options);
|
||||
|
||||
AssertHasUniqueIndex<ReferralCode>(nameof(ReferralCode.TenantId), nameof(ReferralCode.Code));
|
||||
AssertHasUniqueIndex<ReferralLead>(nameof(ReferralLead.TenantId), nameof(ReferralLead.StudentUserId));
|
||||
AssertHasUniqueIndex<CrmConfig>(nameof(CrmConfig.TenantId));
|
||||
AssertHasUniqueIndex<CrmWebhookQueueItem>(nameof(CrmWebhookQueueItem.TenantId), nameof(CrmWebhookQueueItem.IdempotencyKey));
|
||||
AssertHasUniqueIndex<CommissionSettlement>(
|
||||
nameof(CommissionSettlement.TenantId),
|
||||
nameof(CommissionSettlement.SettlementNo));
|
||||
AssertHasUniqueIndex<CommissionSettlementItem>(
|
||||
nameof(CommissionSettlementItem.TenantId),
|
||||
nameof(CommissionSettlementItem.SourceType),
|
||||
nameof(CommissionSettlementItem.SourceId));
|
||||
|
||||
AssertPrecision<TenantCommissionSetting>(nameof(TenantCommissionSetting.DefaultRate), 6, 4);
|
||||
AssertPrecision<CommissionSettlement>(nameof(CommissionSettlement.DefaultRate), 6, 4);
|
||||
AssertPrecision<CommissionSettlementItem>(nameof(CommissionSettlementItem.CommissionRate), 6, 4);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
void AssertPrecision<TEntity>(string propertyName, int precision, int scale)
|
||||
{
|
||||
var property = context.Model.FindEntityType(typeof(TEntity))!
|
||||
.FindProperty(propertyName)!;
|
||||
|
||||
Assert.Equal(precision, property.GetPrecision());
|
||||
Assert.Equal(scale, property.GetScale());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user