Add Database class unit test

This commit is contained in:
2026-05-21 14:12:59 +08:00
parent 1cfb733443
commit 783a795668
3 changed files with 89 additions and 2 deletions
+86
View File
@@ -0,0 +1,86 @@
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<int>(
"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='audio_files';");
Assert.Equal(1, tableCount);
// 2. 核心列存在(抽查)
var columns = conn.Query<string>(
"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<string>(
"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<int>(
"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='audio_files';");
Assert.Equal(1, tableCount);
}
finally
{
if (File.Exists(dbPath)) File.Delete(dbPath);
}
}
}
+2 -2
View File
@@ -11,7 +11,7 @@ public static class Database
/// </summary> /// </summary>
/// <param name="dbName">数据库名称(不含扩展名)</param> /// <param name="dbName">数据库名称(不含扩展名)</param>
/// <returns>数据库连接</returns> /// <returns>数据库连接</returns>
static IDbConnection GetConnection(string dbName = "default") internal static IDbConnection GetConnection(string dbName = "default")
{ {
string connectionString = $"Data Source={dbName}.rdb;Version=3;"; string connectionString = $"Data Source={dbName}.rdb;Version=3;";
return new SQLiteConnection(connectionString); return new SQLiteConnection(connectionString);
@@ -20,7 +20,7 @@ public static class Database
/// <summary> /// <summary>
/// 初始化数据库表结构 /// 初始化数据库表结构
/// </summary> /// </summary>
public static void InitializeDatabase() public static void InitializeDatabase(string databaseName = "default")
{ {
using var connection = GetConnection(); using var connection = GetConnection();
connection.Open(); connection.Open();
+1
View File
@@ -14,5 +14,6 @@
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShoudThrow_FileNotFoundException&lt;/TestId&gt; &lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShoudThrow_FileNotFoundException&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShouldThrow_FileNotFoundException&lt;/TestId&gt; &lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShouldThrow_FileNotFoundException&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest&lt;/TestId&gt; &lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldCreateAudioFilesTable&lt;/TestId&gt;
&lt;/TestAncestor&gt; &lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String></wpf:ResourceDictionary> &lt;/SessionState&gt;</s:String></wpf:ResourceDictionary>