diff --git a/Tests/EntityIdTests/TestMultiDb.cs b/Tests/EntityIdTests/TestMultiDb.cs index a2395df8..ecee2704 100644 --- a/Tests/EntityIdTests/TestMultiDb.cs +++ b/Tests/EntityIdTests/TestMultiDb.cs @@ -15,8 +15,7 @@ public class MultiDbEntity [TestMethod] public async Task save_entity_works() { - await DB.InitAsync(dbName); - + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); DB.DatabaseFor(dbName); @@ -38,7 +37,7 @@ public async Task save_entity_works() [TestMethod] public async Task relationships_work() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); DB.DatabaseFor(dbName); @@ -97,7 +96,7 @@ public async Task multiple_initializations_should_not_throw() [TestMethod] public async Task dropping_collections() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); DB.DatabaseFor(dbName); diff --git a/Tests/Init.cs b/Tests/Init.cs index a751af22..4f0e5bcd 100644 --- a/Tests/Init.cs +++ b/Tests/Init.cs @@ -1,14 +1,38 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Threading.Tasks; +using MongoDB.Driver; namespace MongoDB.Entities.Tests; [TestClass] public static class InitTest { + private static MongoClientSettings ClientSettings { get; set; } + static bool UseTestContainers; + [AssemblyInitialize] public static async Task Init(TestContext _) { - await DB.InitAsync("mongodb-entities-test"); + UseTestContainers = System.Environment.GetEnvironmentVariable("MONGODB_ENTITIES_TESTCONTAINERS") != null; + + if (UseTestContainers) + { + var testContainer = await TestDatabase.CreateDatabase(); + ClientSettings = MongoClientSettings.FromConnectionString(testContainer.GetConnectionString()); + } + + await InitTestDatabase("mongodb-entities-test"); + } + + public static async Task InitTestDatabase(string databaseName) + { + if (UseTestContainers) + { + await DB.InitAsync(databaseName, ClientSettings); + } + else + { + await DB.InitAsync(databaseName); + } } } \ No newline at end of file diff --git a/Tests/TestDatabase.cs b/Tests/TestDatabase.cs new file mode 100644 index 00000000..330ec2df --- /dev/null +++ b/Tests/TestDatabase.cs @@ -0,0 +1,42 @@ +using System.Threading; +using System.Threading.Tasks; +using Testcontainers.MongoDb; + +public static class TestDatabase +{ + private static SemaphoreSlim _semaphore = new(1, 1); + private static MongoDbContainer? _testContainer; + + public static async Task CreateDatabase() + { + await _semaphore.WaitAsync(); + try + { + var database = await CreateTestDatabase(); + + return database; + } + finally + { + _semaphore.Release(); + } + } + + private static async Task CreateTestDatabase() + { + if (_testContainer != null) + { + return _testContainer; + } + _testContainer = new MongoDbBuilder() + .WithPortBinding(27017) + .WithPassword("username") + .WithUsername("password") + .WithReplicaSet() + .Build(); + + await _testContainer.StartAsync(); + + return _testContainer; + } +} \ No newline at end of file diff --git a/Tests/TestFileEntity.cs b/Tests/TestFileEntity.cs index 3c1e2017..717ea9d1 100644 --- a/Tests/TestFileEntity.cs +++ b/Tests/TestFileEntity.cs @@ -41,7 +41,7 @@ public async Task uploading_data_from_http_stream() [TestMethod] public async Task uploading_data_from_file_stream() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 800, Width = 600, Name = "Test.Png" }; @@ -61,7 +61,7 @@ public async Task uploading_data_from_file_stream() [TestMethod] public async Task uploading_with_wrong_hash() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 800, Width = 600, Name = "Test-bad-hash.png", MD5 = "wrong-hash" }; @@ -76,7 +76,7 @@ await Assert.ThrowsExceptionAsync(async () [TestMethod] public async Task uploading_with_correct_hash() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 800, Width = 600, Name = "Test-correct-hash.png", MD5 = "cccfa116f0acf41a217cbefbe34cd599" }; @@ -96,7 +96,7 @@ public async Task uploading_with_correct_hash() [TestMethod] public async Task file_smaller_than_chunk_size() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 100, Width = 100, Name = "Test-small.Png" }; @@ -116,7 +116,7 @@ public async Task file_smaller_than_chunk_size() [TestMethod] public async Task deleting_entity_deletes_all_chunks() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { ID = Guid.NewGuid().ToString(), Height = 400, Width = 400, Name = "Test-Delete.Png" }; @@ -148,7 +148,7 @@ await DB.Database(dbName).GetCollection(DB.CollectionName( [TestMethod] public async Task deleting_only_chunks() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 400, Width = 400, Name = "Test-Delete.Png" }; @@ -179,7 +179,7 @@ await DB.Database(dbName).GetCollection(DB.CollectionName( [TestMethod] public async Task downloading_file_chunks_works() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 500, Width = 500, Name = "Test-Download.Png" }; @@ -205,7 +205,7 @@ public async Task downloading_file_chunks_works() [TestMethod] public async Task downloading_file_chunks_directly() { - await DB.InitAsync(dbName); + await InitTest.InitTestDatabase(dbName); DB.DatabaseFor(dbName); var img = new Image { Height = 500, Width = 500, Name = "Test-Download.Png" }; @@ -231,7 +231,7 @@ public async Task downloading_file_chunks_directly() [TestMethod] public void trying_to_download_when_no_chunks_present() { - DB.InitAsync(dbName).GetAwaiter().GetResult(); + InitTest.InitTestDatabase(dbName).GetAwaiter().GetResult(); Assert.ThrowsException( () => diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index ba98ccd0..e6e2ebf2 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -14,6 +14,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive