forked from xiongyuxing/tiku-backend.net
feat: add content assets and import persistence
This commit is contained in:
@@ -23,7 +23,7 @@ public sealed class PersistenceModelTests
|
||||
.Select(entity => entity.GetTableName())
|
||||
.ToHashSet(StringComparer.Ordinal);
|
||||
|
||||
Assert.Equal(37, tableNames.Count);
|
||||
Assert.Equal(45, tableNames.Count);
|
||||
Assert.Contains("tenants", tableNames);
|
||||
Assert.Contains("tenant_settings", tableNames);
|
||||
Assert.Contains("content_entries", tableNames);
|
||||
@@ -39,6 +39,14 @@ public sealed class PersistenceModelTests
|
||||
Assert.Contains("handbook_entries", tableNames);
|
||||
Assert.Contains("question_type_groups", tableNames);
|
||||
Assert.Contains("subject_shares", tableNames);
|
||||
Assert.Contains("content_assets", tableNames);
|
||||
Assert.Contains("content_import_jobs", tableNames);
|
||||
Assert.Contains("content_import_items", tableNames);
|
||||
Assert.Contains("content_import_issues", tableNames);
|
||||
Assert.Contains("images", tableNames);
|
||||
Assert.Contains("app_assets", tableNames);
|
||||
Assert.Contains("video_explanations", tableNames);
|
||||
Assert.Contains("question_videos", tableNames);
|
||||
Assert.Contains("questions", tableNames);
|
||||
Assert.Contains("question_versions", tableNames);
|
||||
Assert.Contains("answer_records", tableNames);
|
||||
@@ -209,4 +217,83 @@ public sealed class PersistenceModelTests
|
||||
.SequenceEqual(propertyNames));
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(typeof(ContentAsset), nameof(ContentAsset.AccessRules), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ContentAsset), nameof(ContentAsset.VerificationDetails), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ContentAsset), nameof(ContentAsset.SecurityFlags), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ContentImportJob), nameof(ContentImportJob.RawPayload), "'[]'::jsonb")]
|
||||
[InlineData(typeof(ContentImportItem), nameof(ContentImportItem.SourcePayload), "'{}'::jsonb")]
|
||||
[InlineData(typeof(ContentImportIssue), nameof(ContentImportIssue.Details), "'{}'::jsonb")]
|
||||
[InlineData(typeof(VideoExplanation), nameof(VideoExplanation.KnowledgeTags), "'[]'::jsonb")]
|
||||
[InlineData(typeof(QuestionVideo), nameof(QuestionVideo.Metadata), "'{}'::jsonb")]
|
||||
public void Asset_import_and_video_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 Import_items_and_question_videos_have_expected_unique_indexes()
|
||||
{
|
||||
using var context = new TikuDbContext(Options);
|
||||
|
||||
AssertHasUniqueIndex<ContentImportItem>(
|
||||
nameof(ContentImportItem.JobId),
|
||||
nameof(ContentImportItem.RowNo));
|
||||
AssertHasUniqueIndex<QuestionVideo>(
|
||||
nameof(QuestionVideo.TenantId),
|
||||
nameof(QuestionVideo.QuestionId),
|
||||
nameof(QuestionVideo.VideoId),
|
||||
nameof(QuestionVideo.VideoType));
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Asset_import_and_video_relations_include_tenant_in_foreign_keys()
|
||||
{
|
||||
using var context = new TikuDbContext(Options);
|
||||
|
||||
var entityTypes = new[]
|
||||
{
|
||||
typeof(ContentAsset),
|
||||
typeof(ContentImportJob),
|
||||
typeof(ContentImportItem),
|
||||
typeof(ContentImportIssue),
|
||||
typeof(VideoExplanation),
|
||||
typeof(QuestionVideo)
|
||||
};
|
||||
|
||||
var compositeForeignKeys = entityTypes
|
||||
.SelectMany(entityType => context.Model.FindEntityType(entityType)!
|
||||
.GetForeignKeys())
|
||||
.Where(foreignKey => foreignKey.Properties.Count > 1)
|
||||
.Select(foreignKey => foreignKey.Properties
|
||||
.Select(property => property.Name)
|
||||
.ToArray());
|
||||
|
||||
Assert.All(
|
||||
compositeForeignKeys,
|
||||
properties => Assert.Contains("TenantId", properties));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user