Skip to content

Commit 4a99844

Browse files
committed
test(backend): enhance PostgreSQL and SQL Server container fixtures
- Upgraded Testcontainers package to v4.10.0 - Updated wait strategies for PostgreSQL and SQL Server container fixtures to improve reliability during integration tests. - Added multiple checks for container readiness, ensuring better synchronization with the test environment. Modified files (2): - PostgreSqlContainerFixture.cs: Enhanced wait strategy for PostgreSQL - SqlServerContainerFixture.cs: Improved wait strategy for SQL Server
1 parent 3d15baa commit 4a99844

3 files changed

Lines changed: 30 additions & 8 deletions

File tree

src/Directory.Packages.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151
<PackageVersion Include="NSubstitute" Version="5.3.0" />
5252
<PackageVersion Include="Bogus" Version="35.6.5" />
5353
<!-- Integration Testing -->
54-
<PackageVersion Include="Testcontainers.MsSql" Version="4.4.0" />
55-
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.4.0" />
54+
<PackageVersion Include="Testcontainers.MsSql" Version="4.10.0" />
55+
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.10.0" />
5656
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0" />
5757
</ItemGroup>
5858
</Project>

src/backend/services/TaskAgent/tests/TaskAgent.Infrastructure.IntegrationTests/Fixtures/PostgreSqlContainerFixture.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using DotNet.Testcontainers.Builders;
22
using Microsoft.EntityFrameworkCore;
3+
using Npgsql;
34
using TaskAgent.Infrastructure.Data;
45
using Testcontainers.PostgreSql;
56

@@ -17,12 +18,23 @@ public class PostgreSqlContainerFixture : IAsyncLifetime
1718

1819
public PostgreSqlContainerFixture()
1920
{
20-
_container = new PostgreSqlBuilder()
21-
.WithImage("postgres:16-alpine")
21+
// Use multiple combined wait strategies for maximum reliability
22+
_container = new PostgreSqlBuilder(image: "postgres:16-alpine")
2223
.WithDatabase("taskagent_integration_test")
2324
.WithUsername("test_user")
2425
.WithPassword("test_password")
25-
.WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("pg_isready", "-U", "test_user"))
26+
.WithWaitStrategy(Wait.ForUnixContainer()
27+
// 1. Verify PostgreSQL port is listening inside container
28+
.UntilInternalTcpPortIsAvailable(5432)
29+
// 2. Execute pg_isready health check command
30+
.UntilCommandIsCompleted("pg_isready", "-U", "test_user")
31+
// 3. Wait for PostgreSQL ready message in logs
32+
.UntilMessageIsLogged("database system is ready to accept connections")
33+
// 4. Verify actual database connection (most reliable check)
34+
.UntilDatabaseIsAvailable(NpgsqlFactory.Instance, o => o
35+
.WithTimeout(TimeSpan.FromMinutes(1)) // PostgreSQL starts faster than SQL Server
36+
.WithInterval(TimeSpan.FromSeconds(1))) // Check every second
37+
)
2638
.Build();
2739
}
2840

src/backend/services/TaskAgent/tests/TaskAgent.Infrastructure.IntegrationTests/Fixtures/SqlServerContainerFixture.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using DotNet.Testcontainers.Builders;
2+
using Microsoft.Data.SqlClient;
23
using Microsoft.EntityFrameworkCore;
34
using TaskAgent.Infrastructure.Data;
45
using Testcontainers.MsSql;
@@ -17,9 +18,18 @@ public class SqlServerContainerFixture : IAsyncLifetime
1718

1819
public SqlServerContainerFixture()
1920
{
20-
_container = new MsSqlBuilder()
21-
.WithImage("mcr.microsoft.com/mssql/server:2022-latest")
22-
.WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(1433))
21+
// Use multiple combined wait strategies for maximum reliability
22+
_container = new MsSqlBuilder(image: "mcr.microsoft.com/mssql/server:2022-latest")
23+
.WithWaitStrategy(Wait.ForUnixContainer()
24+
// 1. Verify SQL Server port is listening inside container
25+
.UntilInternalTcpPortIsAvailable(1433)
26+
// 2. Wait for SQL Server ready message in logs
27+
.UntilMessageIsLogged("SQL Server is now ready for client connections")
28+
// 3. Verify actual database connection (most reliable check)
29+
.UntilDatabaseIsAvailable(SqlClientFactory.Instance, o => o
30+
.WithTimeout(TimeSpan.FromMinutes(2)) // SQL Server can take time to initialize
31+
.WithInterval(TimeSpan.FromSeconds(2))) // Check every 2 seconds
32+
)
2333
.Build();
2434
}
2535

0 commit comments

Comments
 (0)