refactor(db): migrate Gmail review decisions
Move creation ownership from startup reconciliation to an additive provider-aware migration. Preserve legacy decisions during downgrade and add the previously missing MariaDB table path.
This commit is contained in:
@@ -101,6 +101,7 @@ public sealed class MigrationChainTests
|
||||
Assert.Contains("CREATE TABLE IF NOT EXISTS `AiInteractions`", script, StringComparison.Ordinal);
|
||||
Assert.Contains("CREATE TABLE IF NOT EXISTS `SystemEmailSettings`", script, StringComparison.Ordinal);
|
||||
Assert.Contains("CREATE TABLE IF NOT EXISTS `UserRuleSettings`", script, StringComparison.Ordinal);
|
||||
Assert.Contains("CREATE TABLE IF NOT EXISTS `GmailReviewDecisions`", script, StringComparison.Ordinal);
|
||||
Assert.Contains("`UiLanguage` varchar(16)", script, StringComparison.Ordinal);
|
||||
Assert.All(
|
||||
Regex.Matches(script, "CONSTRAINT `([^`]+)`").Select(match => match.Groups[1].Value),
|
||||
@@ -186,6 +187,42 @@ public sealed class MigrationChainTests
|
||||
Assert.Empty(await db.Database.GetPendingMigrationsAsync());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Gmail_review_decision_adoption_preserves_legacy_rows()
|
||||
{
|
||||
await using var connection = new SqliteConnection("Data Source=:memory:");
|
||||
await connection.OpenAsync();
|
||||
await using var db = Context(connection);
|
||||
var migrator = db.GetService<IMigrator>();
|
||||
await migrator.MigrateAsync("20260830121000_AdoptUserRuleSettingsSchema");
|
||||
await ExecuteAsync(connection, """
|
||||
CREATE TABLE "GmailReviewDecisions" (
|
||||
"Id" INTEGER NOT NULL CONSTRAINT "PK_GmailReviewDecisions" PRIMARY KEY AUTOINCREMENT,
|
||||
"OwnerUserId" TEXT NOT NULL,
|
||||
"ThreadId" TEXT NOT NULL,
|
||||
"JobApplicationId" INTEGER NULL,
|
||||
"Decision" TEXT NOT NULL,
|
||||
"Note" TEXT NULL,
|
||||
"UpdatedAt" TEXT NOT NULL
|
||||
);
|
||||
INSERT INTO "GmailReviewDecisions"
|
||||
("OwnerUserId", "ThreadId", "JobApplicationId", "Decision", "Note", "UpdatedAt")
|
||||
VALUES ('owner-fixture', 'thread-fixture', NULL, 'linked', 'Preserve me', '2026-08-30T09:00:00+00:00');
|
||||
""");
|
||||
|
||||
await migrator.MigrateAsync();
|
||||
Assert.Equal("linked", await ScalarAsync<string>(connection,
|
||||
"SELECT Decision FROM GmailReviewDecisions WHERE ThreadId = 'thread-fixture';"));
|
||||
|
||||
await migrator.MigrateAsync("20260830121000_AdoptUserRuleSettingsSchema");
|
||||
Assert.Equal("Preserve me", await ScalarAsync<string>(connection,
|
||||
"SELECT Note FROM GmailReviewDecisions WHERE ThreadId = 'thread-fixture';"));
|
||||
await migrator.MigrateAsync();
|
||||
Assert.Equal("Preserve me", await ScalarAsync<string>(connection,
|
||||
"SELECT Note FROM GmailReviewDecisions WHERE ThreadId = 'thread-fixture';"));
|
||||
Assert.Empty(await db.Database.GetPendingMigrationsAsync());
|
||||
}
|
||||
|
||||
private static JobTrackerContext Context(SqliteConnection connection)
|
||||
{
|
||||
var currentUser = new Mock<ICurrentUserService>();
|
||||
|
||||
Reference in New Issue
Block a user