Skip to content

Commit 794da81

Browse files
fix(tests): restore non-redirecting clients and harden keep-alive init
- Restore AllowAutoRedirect=false clients via Factory.Inner.CreateClient(...) in IntegrationTestBase and McpTestHelper - Initialize keep-alive SQLite connection in WebApplicationFactory constructor - Keep per-factory schema initialization gate to prevent EnsureCreated races in CI
1 parent 4cc987d commit 794da81

3 files changed

Lines changed: 11 additions & 10 deletions

File tree

EssentialCSharp.Web.Tests/IntegrationTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public abstract class IntegrationTestBase : WebApplicationTest<WebApplicationFac
1313
/// silently following them.
1414
/// </summary>
1515
protected HttpClient CreateClientWithoutAutoRedirect() =>
16-
Factory.CreateClient();
16+
Factory.Inner.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false });
1717

1818
/// <summary>
1919
/// Executes an initial GET and follows redirect responses with subsequent GET requests.

EssentialCSharp.Web.Tests/McpTestHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace EssentialCSharp.Web.Tests;
1616
internal static class McpTestHelper
1717
{
1818
public static HttpClient CreateClient(TracedWebApplicationFactory<Program> factory) =>
19-
factory.CreateClient();
19+
factory.Inner.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false });
2020

2121
public static HttpRequestMessage CreateInitializeRequest(string path = "/mcp")
2222
{

EssentialCSharp.Web.Tests/WebApplicationFactory.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@ public sealed class WebApplicationFactory : TestWebApplicationFactory<Program>
2323

2424
// Kept open for the factory lifetime so the shared-cache in-memory database is not dropped
2525
// when per-scope connections are disposed between requests.
26-
private SqliteConnection? _keepAliveConnection;
26+
private readonly SqliteConnection _keepAliveConnection;
27+
28+
public WebApplicationFactory()
29+
{
30+
_keepAliveConnection = new SqliteConnection(_sqlConnectionString);
31+
_keepAliveConnection.Open();
32+
}
2733

2834
protected override void ConfigureWebHost(IWebHostBuilder builder)
2935
{
@@ -50,12 +56,6 @@ protected override void ConfigureWebHost(IWebHostBuilder builder)
5056

5157
// Open a keep-alive connection to prevent the shared-cache in-memory database from
5258
// being dropped when per-scope connections are disposed between requests.
53-
_keepAliveConnection ??= new SqliteConnection(_sqlConnectionString);
54-
if (_keepAliveConnection.State != System.Data.ConnectionState.Open)
55-
{
56-
_keepAliveConnection.Open();
57-
}
58-
5959
// Register as scoped so each request scope gets its own SqliteConnection,
6060
// preventing "database is locked" errors under concurrent requests.
6161
services.AddScoped<DbConnection>(_ =>
@@ -98,7 +98,8 @@ protected override void Dispose(bool disposing)
9898
{
9999
if (disposing)
100100
{
101-
_keepAliveConnection?.Dispose();
101+
_keepAliveConnection.Dispose();
102+
_schemaInitializationGate.Dispose();
102103
}
103104
base.Dispose(disposing);
104105
}

0 commit comments

Comments
 (0)