using System; using System.IO; using System.Linq; using Migrato.Core; using Xunit; namespace Migrato.Tests; public class MigrationLoaderTests : IDisposable { private readonly string _tempDirectory = Directory.CreateTempSubdirectory("migrato-tests-").FullName; [Fact] public void LoadFromDirectory_ReturnsMigrationsOrderedByVersion() { WriteFile("20260103000000_third.sql"); WriteFile("20260101000000_first.sql"); WriteFile("20260102000000_second.sql"); var migrations = MigrationLoader.LoadFromDirectory(_tempDirectory); Assert.Equal( new[] { "first", "second", "third" }, migrations.Select(m => m.Name).ToArray()); } [Fact] public void LoadFromDirectory_MissingDirectory_Throws() { var missingDirectory = Path.Combine(_tempDirectory, "does-not-exist"); Assert.Throws(() => MigrationLoader.LoadFromDirectory(missingDirectory)); } [Fact] public void LoadFromDirectory_DuplicateVersions_Throws() { WriteFile("20260101000000_first.sql"); WriteFile("20260101000000_also_first.sql"); Assert.Throws(() => MigrationLoader.LoadFromDirectory(_tempDirectory)); } private void WriteFile(string fileName) { var path = Path.Combine(_tempDirectory, fileName); File.WriteAllText(path, "-- +migrato Up\nSELECT 1;\n-- +migrato Down\nSELECT 2;\n"); } public void Dispose() { Directory.Delete(_tempDirectory, recursive: true); } }