diff --git a/Kyoo.Tests/Library/RepositoryTests.cs b/Kyoo.Tests/Library/RepositoryTests.cs index 78f52cb5..f8b5b7a4 100644 --- a/Kyoo.Tests/Library/RepositoryTests.cs +++ b/Kyoo.Tests/Library/RepositoryTests.cs @@ -20,9 +20,6 @@ namespace Kyoo.Tests { Repositories = repositories; _repository = Repositories.LibraryManager.GetRepository(); - Repositories.Context.AddTest(); - if (new T() is not Show) - Repositories.Context.AddTest(); } [Fact] diff --git a/Kyoo.Tests/Library/TestContext.cs b/Kyoo.Tests/Library/TestContext.cs index 8a1d1a64..ed3e46c4 100644 --- a/Kyoo.Tests/Library/TestContext.cs +++ b/Kyoo.Tests/Library/TestContext.cs @@ -1,8 +1,10 @@ using System; using System.Threading.Tasks; +using Kyoo.Postgresql; using Kyoo.SqLite; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; +using Npgsql; using Xunit; namespace Kyoo.Tests @@ -13,18 +15,24 @@ namespace Kyoo.Tests /// The internal sqlite connection used by all context returned by this class. /// private readonly SqliteConnection _connection; + + /// + /// The context's options that specify to use an in memory Sqlite database. + /// + private readonly DbContextOptions _context; public SqLiteTestContext() { _connection = new SqliteConnection("DataSource=:memory:"); _connection.Open(); - Context = new DbContextOptionsBuilder() + _context = new DbContextOptionsBuilder() .UseSqlite(_connection) .Options; using DatabaseContext context = New(); - context.Database.Migrate(); + context.Database.EnsureCreated(); + TestSample.FillDatabase(context); } public override void Dispose() @@ -39,7 +47,7 @@ namespace Kyoo.Tests public override DatabaseContext New() { - return new SqLiteContext(Context); + return new SqLiteContext(_context); } } @@ -47,33 +55,83 @@ namespace Kyoo.Tests public class PostgresCollection : ICollectionFixture {} - public class PostgresFixture + public sealed class PostgresFixture : IDisposable { + private readonly PostgresContext _context; + public string Template { get; } + + public string Connection => PostgresTestContext.GetConnectionString(Template); + + public PostgresFixture() + { + string id = Guid.NewGuid().ToString().Replace('-', '_'); + Template = $"kyoo_template_{id}"; + + DbContextOptions options = new DbContextOptionsBuilder() + .UseNpgsql(Connection) + .Options; + + _context = new PostgresContext(options); + _context.Database.EnsureCreated(); + TestSample.FillDatabase(_context); + _context.Database.CloseConnection(); + } + + public void Dispose() + { + _context.Database.EnsureDeleted(); + _context.Dispose(); + } } public sealed class PostgresTestContext : TestContext { - private readonly PostgresFixture _template; + private readonly NpgsqlConnection _connection; + private readonly DbContextOptions _context; public PostgresTestContext(PostgresFixture template) { - _template = template; + string id = Guid.NewGuid().ToString().Replace('-', '_'); + string database = $"kyoo_test_{id}"; + + using (NpgsqlConnection connection = new(template.Connection)) + { + connection.Open(); + using NpgsqlCommand cmd = new($"CREATE DATABASE {database} WITH TEMPLATE {template.Template}", connection); + cmd.ExecuteNonQuery(); + } + + _connection = new NpgsqlConnection(GetConnectionString(database)); + _connection.Open(); + + _context = new DbContextOptionsBuilder() + .UseNpgsql(_connection) + .Options; + } + + public static string GetConnectionString(string database) + { + return $"Server=127.0.0.1;Port=5432;Database={database};User ID=kyoo;Password=kyooPassword"; } public override void Dispose() { - throw new NotImplementedException(); + using DatabaseContext db = New(); + db.Database.EnsureDeleted(); + _connection.Close(); } - public override ValueTask DisposeAsync() + public override async ValueTask DisposeAsync() { - throw new NotImplementedException(); + await using DatabaseContext db = New(); + await db.Database.EnsureDeletedAsync(); + await _connection.CloseAsync(); } public override DatabaseContext New() { - throw new NotImplementedException(); + return new PostgresContext(_context); } } @@ -83,33 +141,6 @@ namespace Kyoo.Tests /// public abstract class TestContext : IDisposable, IAsyncDisposable { - /// - /// The context's options that specify to use an in memory Sqlite database. - /// - protected DbContextOptions Context; - - /// - /// Fill the database with pre defined values using a clean context. - /// - public void AddTest() - where T : class - { - using DatabaseContext context = New(); - context.Set().Add(TestSample.Get()); - context.SaveChanges(); - } - - /// - /// Fill the database with pre defined values using a clean context. - /// - public async Task AddTestAsync() - where T : class - { - await using DatabaseContext context = New(); - await context.Set().AddAsync(TestSample.Get()); - await context.SaveChangesAsync(); - } - /// /// Add an arbitrary data to the test context. /// diff --git a/Kyoo.Tests/Library/TestSample.cs b/Kyoo.Tests/Library/TestSample.cs index 7abf1ed1..6a729286 100644 --- a/Kyoo.Tests/Library/TestSample.cs +++ b/Kyoo.Tests/Library/TestSample.cs @@ -84,5 +84,14 @@ namespace Kyoo.Tests { return (T)Samples[typeof(T)](); } + + public static void FillDatabase(DatabaseContext context) + { + context.Shows.Add(Get()); + context.Seasons.Add(Get()); + // context.Episodes.Add(Get()); + // context.People.Add(Get()); + context.SaveChanges(); + } } } \ No newline at end of file