Skip to content

Commit 3295e40

Browse files
committed
Enable use of Testcontainers
1 parent 2b0e1f1 commit 3295e40

File tree

3 files changed

+89
-1
lines changed

3 files changed

+89
-1
lines changed

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@
6969
<PackageReference Include="FirebirdSql.Data.FirebirdClient" Version="9.1.1" />
7070
<PackageReference Include="Npgsql" Version="8.0.3" />
7171
<PackageReference Include="MySql.Data" Version="8.0.30" />
72+
<PackageReference Include="Testcontainers.Db2" Version="4.8.1" />
73+
<PackageReference Include="Testcontainers.FirebirdSql" Version="4.8.1" />
74+
<PackageReference Include="Testcontainers.MariaDb" Version="4.8.1" />
75+
<PackageReference Include="Testcontainers.MsSql" Version="4.8.1" />
76+
<PackageReference Include="Testcontainers.MySql" Version="4.8.1" />
77+
<PackageReference Include="Testcontainers.Oracle" Version="4.8.1" />
78+
<PackageReference Include="Testcontainers.PostgreSql" Version="4.8.1" />
7279
</ItemGroup>
7380
<ItemGroup Condition="$(NhNetFx)">
7481
<Reference Include="System.Configuration" />

src/NHibernate.Test/TestConfigurationHelper.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ public static Configuration GetDefaultConfiguration()
4747
Configuration result = new Configuration();
4848
if (hibernateConfigFile != null)
4949
result.Configure(hibernateConfigFile);
50+
51+
var connectionString = result.GetProperty(Cfg.Environment.ConnectionString);
52+
if (connectionString?.StartsWith("testcontainers=") == true)
53+
{
54+
result.SetProperty(Cfg.Environment.ConnectionString, TestContainerSetup.GetConnectionString(connectionString));
55+
}
5056
return result;
5157
}
5258

@@ -71,4 +77,4 @@ private static string FindCurrentTestConfigurationFile(string filename)
7177
return null;
7278
}
7379
}
74-
}
80+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
namespace NHibernate.Test
2+
{
3+
using System;
4+
using System.Threading.Tasks;
5+
using DotNet.Testcontainers.Containers;
6+
using NUnit.Framework;
7+
using Testcontainers.Db2;
8+
using Testcontainers.FirebirdSql;
9+
using Testcontainers.MariaDb;
10+
using Testcontainers.MsSql;
11+
using Testcontainers.MySql;
12+
using Testcontainers.Oracle;
13+
using Testcontainers.PostgreSql;
14+
15+
public class TestContainerSetup
16+
{
17+
private static IDatabaseContainer _container;
18+
private static readonly object _lock = new object();
19+
20+
internal static string GetConnectionString(string connectionString)
21+
{
22+
var parts = connectionString.Split(['='], System.StringSplitOptions.RemoveEmptyEntries);
23+
if (parts.Length != 2 || parts[0] != "testcontainers")
24+
{
25+
throw new System.ArgumentException("Invalid testcontainers connection string format. Expected format: testcontainers=DbType");
26+
}
27+
// For now, only one container is supported. In the future, we can extend this to support multiple containers.
28+
if (_container == null)
29+
{
30+
lock (_lock)
31+
{
32+
if (_container == null)
33+
{
34+
var container = GetContainer(parts[1]);
35+
Task.Run(() => container.StartAsync()).GetAwaiter().GetResult();
36+
_container = container;
37+
}
38+
}
39+
}
40+
return _container.GetConnectionString();
41+
}
42+
43+
private static IDatabaseContainer GetContainer(string dbType)
44+
{
45+
switch (dbType.ToLower())
46+
{
47+
case "mssql":
48+
return new PostgreSqlBuilder().Build();
49+
case "postgresql":
50+
return new MsSqlBuilder().Build();
51+
case "mysql":
52+
return new MySqlBuilder().Build();
53+
case "mariadb":
54+
return new MariaDbBuilder().Build();
55+
case "firebirdsql":
56+
return new FirebirdSqlBuilder().Build();
57+
case "oracle":
58+
return new OracleBuilder().Build();
59+
case "db2":
60+
return new Db2Builder().Build();
61+
default:
62+
throw new NotSupportedException("Database type not supported: " + dbType);
63+
}
64+
}
65+
66+
[OneTimeTearDown]
67+
public async Task TearDown()
68+
{
69+
if (_container != null)
70+
{
71+
await _container.DisposeAsync();
72+
}
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)