using System.Data.SQLite; using Dapper; using OCES.Resonance.Core; namespace Core.Tests; public class DatabaseTests { static string NewDbName() => $"test_{Guid.NewGuid():N}"; [Fact] public void InitializeDatabase_ShouldCreateAudioFilesTable() { string dbName = NewDbName(); string dbPath = $"{dbName}.rdb"; try { // Act Database.InitializeDatabase(dbName); // Assert — 用自己的 SQLite 连接验证 using var conn = new SQLiteConnection($"Data Source={dbPath};Version=3;"); conn.Open(); // 1. 表存在 var tableCount = conn.ExecuteScalar( "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='audio_files';"); Assert.Equal(1, tableCount); // 2. 核心列存在(抽查) var columns = conn.Query( "SELECT name FROM pragma_table_info('audio_files') ORDER BY cid;").ToHashSet(); Assert.Contains("id", columns); Assert.Contains("unique_id", columns); Assert.Contains("md5", columns); Assert.Contains("path", columns); Assert.Contains("filename", columns); Assert.Contains("duration", columns); Assert.Contains("bpm", columns); Assert.Contains("description", columns); // 3. 索引存在 var indexes = conn.Query( "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='audio_files';") .ToHashSet(); Assert.Contains("idx_file_name", indexes); Assert.Contains("idx_md5", indexes); Assert.Contains("idx_path", indexes); Assert.Contains("idx_unique_id", indexes); Assert.Contains("idx_description", indexes); } finally { if (File.Exists(dbPath)) File.Delete(dbPath); } } [Fact] public void InitializeDatabase_ShouldBeIdempotent() { string dbName = NewDbName(); string dbPath = $"{dbName}.rdb"; try { // Act — 连续调用两次 Database.InitializeDatabase(dbName); var exception = Record.Exception(() => Database.InitializeDatabase(dbName)); // Assert — 不应抛出异常 Assert.Null(exception); // 表仍然只有一个 using var conn = new SQLiteConnection($"Data Source={dbPath};Version=3;"); conn.Open(); var tableCount = conn.ExecuteScalar( "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='audio_files';"); Assert.Equal(1, tableCount); } finally { if (File.Exists(dbPath)) File.Delete(dbPath); } } }