using dy.net.extension; using dy.net.model.entity; using dy.net.service; using dy.net.Tests.TestInfrastructure; using Microsoft.Data.Sqlite; using Microsoft.Extensions.DependencyInjection; using SqlSugar; namespace dy.net.Tests; public class LegacyDatabaseUpgradeTests { [Fact] public void LegacyDatabase_UpgradeBacksUpAndPreservesRowsWhileAddingMigrationSchema() { using var temporary = new TemporaryDirectory(); var dbRoot = Path.Combine(temporary.Path, "db"); Directory.CreateDirectory(Path.Combine(dbRoot, "keys")); File.WriteAllText(Path.Combine(dbRoot, "keys", "key.xml"), "persistent-key"); var databasePath = Path.Combine(dbRoot, "dy.sqlite"); using (var connection = new SqliteConnection($"Data Source={databasePath}")) { connection.Open(); using var command = connection.CreateCommand(); command.CommandText = "CREATE TABLE dy_collect_video (Id TEXT PRIMARY KEY, AwemeId TEXT, VideoSavePath TEXT);" + "INSERT INTO dy_collect_video (Id, AwemeId, VideoSavePath) VALUES ('old-1','aweme-old','/old/video.mp4');"; command.ExecuteNonQuery(); } var backup = DatabaseUpgradeBackup.Prepare(temporary.Path); var services = new ServiceCollection(); services.AddSqlsugar(temporary.Path); using var provider = services.BuildServiceProvider(); using var scope = provider.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); Assert.Equal("/old/video.mp4", db.Queryable().Where(x => x.Id == "old-1").Select(x => x.VideoSavePath).Single()); Assert.True(db.DbMaintenance.IsAnyTable("storage_migration_task", false)); Assert.True(db.DbMaintenance.IsAnyTable("storage_migration_item", false)); Assert.True(db.DbMaintenance.IsAnyTable("video_download_task", false)); Assert.True(db.DbMaintenance.IsAnyTable("video_download_task_item", false)); Assert.True(db.DbMaintenance.IsAnyTable("media_storage_health", false)); Assert.True(db.DbMaintenance.IsAnyTable("dy_openlist_settings", false)); Assert.True(db.DbMaintenance.IsAnyTable("openlist_transfer_job", false)); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("storage_migration_task", false), x => x.DbColumnName == "RemovedCount"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("storage_migration_task", false), x => x.DbColumnName == "IsArchived"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("storage_migration_task", false), x => x.DbColumnName == "TargetStorageType"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("storage_migration_item", false), x => x.DbColumnName == "SourceStorageType"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("storage_migration_item", false), x => x.DbColumnName == "AdoptExistingTarget"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_collect_video", false), x => x.DbColumnName == "StorageType"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_rd_video", false), x => x.DbColumnName == "TaskId"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_delete_video", false), x => x.DbColumnName == "RestoreSnapshotJson"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_cookie", false), x => x.DbColumnName == "SourceCooldownUntil"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_cookie", false), x => x.DbColumnName == "SourceRequiresAuthorization"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_cookie", false), x => x.DbColumnName == "LiveCheckCooldownUntil"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_follow", false), x => x.DbColumnName == "LiveMonitorEnabled"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_follow", false), x => x.DbColumnName == "LiveStatus"); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("dy_follow", false), x => x.DbColumnName == "LiveEmailNotificationEnabled"); Assert.True(db.DbMaintenance.IsAnyTable("dy_email_notification_settings", false)); Assert.Contains(db.DbMaintenance.GetColumnInfosByTableName("video_download_task_item", false), x => x.DbColumnName == "HttpStatusCode"); var backupDirectory = Directory.GetDirectories(Path.Combine(dbRoot, "upgrade-backups")).Single(); Assert.True(File.Exists(Path.Combine(backupDirectory, "dy.sqlite"))); Assert.Equal("persistent-key", File.ReadAllText(Path.Combine(backupDirectory, "keys", "key.xml"))); backup.MarkSchemaReady(); } }