53 lines
1.4 KiB
C#
53 lines
1.4 KiB
C#
using Microsoft.Data.Sqlite;
|
|
using VolcanicCore.Persistence;
|
|
using VolcanicCore.Persistence.Migrations;
|
|
|
|
namespace VolcanicCore.Tests;
|
|
|
|
public class MigratorTests
|
|
{
|
|
private sealed class M1 : IMigration
|
|
{
|
|
public int Version => 1;
|
|
public void Apply(SqliteConnection conn)
|
|
{
|
|
using var cmd = conn.CreateCommand();
|
|
cmd.CommandText = "CREATE TABLE t (id INTEGER PRIMARY KEY);";
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
|
|
private sealed class M2 : IMigration
|
|
{
|
|
public int Version => 2;
|
|
public void Apply(SqliteConnection conn)
|
|
{
|
|
using var cmd = conn.CreateCommand();
|
|
cmd.CommandText = "ALTER TABLE t ADD COLUMN name TEXT;";
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Migrator_applies_missing_migrations_in_order_and_sets_user_version()
|
|
{
|
|
using var conn = new SqliteConnection("Data Source=:memory:");
|
|
conn.Open();
|
|
var mig = new Migrator(new IMigration[] { new M2(), new M1() });
|
|
|
|
mig.Apply(conn);
|
|
|
|
Assert.Equal(2, ReadUserVersion(conn));
|
|
// Re-applying is a no-op.
|
|
mig.Apply(conn);
|
|
Assert.Equal(2, ReadUserVersion(conn));
|
|
}
|
|
|
|
private static int ReadUserVersion(SqliteConnection conn)
|
|
{
|
|
using var cmd = conn.CreateCommand();
|
|
cmd.CommandText = "PRAGMA user_version;";
|
|
return Convert.ToInt32(cmd.ExecuteScalar());
|
|
}
|
|
}
|