Add Database class unit test
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -14,5 +14,6 @@
|
|||||||
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShoudThrow_FileNotFoundException</TestId>
|
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShoudThrow_FileNotFoundException</TestId>
|
||||||
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShouldThrow_FileNotFoundException</TestId>
|
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShouldThrow_FileNotFoundException</TestId>
|
||||||
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest</TestId>
|
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest</TestId>
|
||||||
|
<TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldCreateAudioFilesTable</TestId>
|
||||||
</TestAncestor>
|
</TestAncestor>
|
||||||
</SessionState></s:String></wpf:ResourceDictionary>
|
</SessionState></s:String></wpf:ResourceDictionary>
|
||||||
Reference in New Issue
Block a user