using Microsoft.Data.Sqlite; using YKanBan.Storage; using YKanBan.Storage.Workspace; namespace YKanBan.Tests.TestUtilities; /// Shared helpers for storage tests. public static class SqliteTestHelper { /// Executes a non-query SQL statement and returns the affected row count. public static int Exec(SqliteConnection connection, string sql, params (string Name, object? Value)[] parameters) { using var command = connection.CreateCommand(); command.CommandText = sql; foreach ((string name, object? value) in parameters) { command.Parameters.AddWithValue(name, value); } return command.ExecuteNonQuery(); } /// Returns the scalar result of a SQL query as a string. public static string ScalarString(SqliteConnection connection, string sql) { using var command = connection.CreateCommand(); command.CommandText = sql; return (string)command.ExecuteScalar()!; } /// Returns the scalar result of a SQL query as a long. public static long ScalarLong(SqliteConnection connection, string sql) { using var command = connection.CreateCommand(); command.CommandText = sql; return (long)command.ExecuteScalar()!; } /// Returns true when a table with the given name exists. public static bool TableExists(SqliteConnection connection, string tableName) { using var command = connection.CreateCommand(); command.CommandText = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=$name;"; command.Parameters.AddWithValue("$name", tableName); return (long)command.ExecuteScalar()! == 1; } /// Returns the titles of all columns, ordered by id. public static List GetColumnTitles(SqliteConnection connection) { using var command = connection.CreateCommand(); command.CommandText = "SELECT title FROM columns ORDER BY id ASC;"; using var reader = command.ExecuteReader(); var titles = new List(); while (reader.Read()) { titles.Add(reader.GetString(0)); } return titles; } /// Opens a workspace database with the real migration list. public static SqliteConnection OpenWorkspace(string folderPath) { return SqliteDatabase.Open(WorkspacePaths.Database(folderPath), WorkspaceSchema.Migrations); } }