MdpSourceIdentityBackfillContractTests.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Xunit;
  2. namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform;
  3. public class MdpSourceIdentityBackfillContractTests
  4. {
  5. [Fact]
  6. public void StartupPath_DefersHistoricalBackfillUntilApplicationStarted()
  7. {
  8. var aligner = ReadPluginSource("DataPlatform/Schema/MdpSchemaAligner.cs");
  9. var worker = ReadPluginSource("DataPlatform/Schema/MdpSourceIdentityBackfillWorker.cs");
  10. var startup = ReadPluginSource("Startup.cs");
  11. var ensureStart = aligner.IndexOf("public static async Task EnsureSourceIdentityAsync", StringComparison.Ordinal);
  12. var backfillDeclaration = aligner.IndexOf("public static async Task BackfillProvenSourceAsync", StringComparison.Ordinal);
  13. Assert.True(ensureStart >= 0 && backfillDeclaration > ensureStart);
  14. Assert.DoesNotContain(
  15. "BackfillProvenSourceAsync(",
  16. aligner[ensureStart..backfillDeclaration],
  17. StringComparison.Ordinal);
  18. Assert.Contains("ApplicationStarted.Register", worker, StringComparison.Ordinal);
  19. Assert.Contains("await started.Task.WaitAsync", worker, StringComparison.Ordinal);
  20. Assert.Contains("BackfillProvenSourceAsync", worker, StringComparison.Ordinal);
  21. Assert.Contains("AddHostedService<Admin.NET.Plugin.AiDOP.DataPlatform.Schema.MdpSourceIdentityBackfillWorker>", startup);
  22. }
  23. [Fact]
  24. public void Backfill_BuildsCandidatesPerTableAndFailsClosedOnConflicts()
  25. {
  26. var aligner = ReadPluginSource("DataPlatform/Schema/MdpSchemaAligner.cs");
  27. Assert.Contains("CREATE TEMPORARY TABLE tmp_mdp_proven_source", aligner, StringComparison.Ordinal);
  28. Assert.Contains("foreach (var table in stgNames)", aligner, StringComparison.Ordinal);
  29. Assert.Contains("ON DUPLICATE KEY UPDATE", aligner, StringComparison.Ordinal);
  30. Assert.Contains("g.tenant_id IS NOT NULL", aligner, StringComparison.Ordinal);
  31. Assert.Contains("x.conflicted=0", aligner, StringComparison.Ordinal);
  32. Assert.DoesNotContain("var union = string.Join(\" UNION ALL \"", aligner, StringComparison.Ordinal);
  33. }
  34. private static string ReadPluginSource(string relativePath)
  35. => File.ReadAllText(Path.Combine(
  36. RepoRoot(), "server", "Plugins", "Admin.NET.Plugin.AiDOP",
  37. relativePath.Replace('/', Path.DirectorySeparatorChar)));
  38. private static string RepoRoot()
  39. {
  40. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  41. while (dir != null && !Directory.Exists(Path.Combine(dir.FullName, "server")))
  42. dir = dir.Parent;
  43. return dir?.FullName ?? throw new DirectoryNotFoundException("Repository root not found.");
  44. }
  45. }