Files
git.stella-ops.org/src/__Libraries/__Tests/StellaOps.Infrastructure.Postgres.Tests/PostgresFixtureTests.cs
StellaOps Bot 2548abc56f
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
up
2025-11-29 01:35:49 +02:00

102 lines
3.1 KiB
C#

using FluentAssertions;
using StellaOps.Infrastructure.Postgres.Testing;
using Testcontainers.PostgreSql;
using Xunit;
namespace StellaOps.Infrastructure.Postgres.Tests;
/// <summary>
/// Integration tests for PostgresFixture.
/// Uses Testcontainers to spin up a real PostgreSQL instance.
/// </summary>
public sealed class PostgresFixtureTests : IAsyncLifetime
{
private PostgreSqlContainer? _container;
public async Task InitializeAsync()
{
_container = new PostgreSqlBuilder()
.WithImage("postgres:16-alpine")
.Build();
await _container.StartAsync();
}
public async Task DisposeAsync()
{
if (_container != null)
{
await _container.DisposeAsync();
}
}
[Fact]
public async Task Initialize_CreatesSchema()
{
// Arrange
var connectionString = _container!.GetConnectionString();
await using var fixture = PostgresFixtureFactory.Create(connectionString, nameof(Initialize_CreatesSchema));
// Act
await fixture.InitializeAsync();
// Assert
var options = fixture.CreateOptions();
options.SchemaName.Should().StartWith("test_initialize_createsschema_");
}
[Fact]
public async Task TruncateAllTables_ClearsTables()
{
// Arrange
var connectionString = _container!.GetConnectionString();
await using var fixture = PostgresFixtureFactory.CreateRandom(connectionString);
await fixture.InitializeAsync();
// Create a test table and insert data
await fixture.ExecuteSqlAsync($"""
CREATE TABLE {fixture.SchemaName}.test_table (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO {fixture.SchemaName}.test_table (name) VALUES ('test1'), ('test2');
""");
// Act
await fixture.TruncateAllTablesAsync();
// Assert - table should be empty
await using var conn = new Npgsql.NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using var cmd = new Npgsql.NpgsqlCommand(
$"SELECT COUNT(*) FROM {fixture.SchemaName}.test_table", conn);
var count = await cmd.ExecuteScalarAsync();
count.Should().Be(0L);
}
[Fact]
public async Task Dispose_DropsSchema()
{
// Arrange
var connectionString = _container!.GetConnectionString();
string schemaName;
// Create and dispose fixture
{
await using var fixture = PostgresFixtureFactory.CreateRandom(connectionString);
await fixture.InitializeAsync();
schemaName = fixture.SchemaName;
}
// Assert - schema should not exist
await using var conn = new Npgsql.NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using var cmd = new Npgsql.NpgsqlCommand(
"SELECT EXISTS(SELECT 1 FROM information_schema.schemata WHERE schema_name = @name)",
conn);
cmd.Parameters.AddWithValue("name", schemaName);
var exists = await cmd.ExecuteScalarAsync();
exists.Should().Be(false);
}
}