Files
douyin/tests/dy.net.Tests/LegacyDatabaseUpgradeTests.cs

67 lines
4.7 KiB
C#

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<ISqlSugarClient>();
Assert.Equal("/old/video.mp4", db.Queryable<DouyinVideo>().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();
}
}