diff --git a/Darling/Darling.Tests/ScratchPostgres.cs b/Darling/Darling.Tests/ScratchPostgres.cs index 66a570270f..e65d5aa72d 100644 --- a/Darling/Darling.Tests/ScratchPostgres.cs +++ b/Darling/Darling.Tests/ScratchPostgres.cs @@ -23,8 +23,15 @@ internal sealed class ScratchPostgres : IAsyncDisposable public string ConnectionString { get; } - private ScratchPostgres(string adminConnectionString, string databaseName, string connectionString) + /// + /// The same store WITHOUT the session time-zone pin, so a session opened through it reports the database's own + /// default zone. It exists for tests that must observe that default (e.g. to prove the product pin overrides it). + /// + public string UnpinnedConnectionString { get; } + + private ScratchPostgres(string adminConnectionString, string databaseName, string connectionString, string unpinnedConnectionString) { + UnpinnedConnectionString = unpinnedConnectionString; _adminConnectionString = adminConnectionString; DatabaseName = databaseName; ConnectionString = connectionString; @@ -48,7 +55,13 @@ public static async Task CreateAsync(string baseConnectionStrin Pooling = false, }; - return new ScratchPostgres(baseConnectionString, databaseName, builder.ConnectionString); + /* Pinned to UTC the way every product store connection is, so a cluster whose default zone is behind UTC + cannot skew timestamp round trips (a chunk's range_end read back through a ::timestamp cast). */ + return new ScratchPostgres( + baseConnectionString, + databaseName, + PerformanceMonitor.Darling.Storage.DarlingStoreConnection.PinSessionTimeZoneUtc(builder.ConnectionString), + builder.ConnectionString); } public async ValueTask DisposeAsync() diff --git a/Darling/Darling.Tests/StoreSessionTimeZoneLiveTests.cs b/Darling/Darling.Tests/StoreSessionTimeZoneLiveTests.cs index 72e8194d4c..0f446e78b5 100644 --- a/Darling/Darling.Tests/StoreSessionTimeZoneLiveTests.cs +++ b/Darling/Darling.Tests/StoreSessionTimeZoneLiveTests.cs @@ -64,7 +64,7 @@ shares DARLING_TEST_PG's own database. */ /* ALTER DATABASE ... SET only takes effect for sessions opened AFTER it commits, so migrate through a fresh connection rather than the admin one above. */ - await using (var migrate = new NpgsqlConnection(scratch.ConnectionString)) + await using (var migrate = new NpgsqlConnection(scratch.UnpinnedConnectionString)) { await migrate.OpenAsync(ct); await PgMigrations.MigrateAsync(migrate, ct); @@ -72,14 +72,14 @@ fresh connection rather than the admin one above. */ /* The database's own default, UNPINNED — confirms the fixture set up a genuinely non-UTC store before asserting that the product's pin overrides it. */ - await using (var unpinned = new NpgsqlConnection(scratch.ConnectionString)) + await using (var unpinned = new NpgsqlConnection(scratch.UnpinnedConnectionString)) { await unpinned.OpenAsync(ct); Assert.Equal("America/New_York", await ShowTimeZoneAsync(unpinned, ct)); } /* The way the product opens a STORE connection: PinSessionTimeZoneUtc first, then the connection. */ - var pinnedConnectionString = DarlingStoreConnection.PinSessionTimeZoneUtc(scratch.ConnectionString); + var pinnedConnectionString = DarlingStoreConnection.PinSessionTimeZoneUtc(scratch.UnpinnedConnectionString); await using var connection = new NpgsqlConnection(pinnedConnectionString); await connection.OpenAsync(ct);