using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; // WP-22's stores read a single static Db.ConnectionString (there's no DI, matching // their pre-WP-22 static-Dictionary shape — see Data/Db.cs). That's correct for a // real single-instance process, but xUnit's default parallel-across-classes // execution would run multiple WebApplicationFactory hosts concurrently in this // ONE test process, each overwriting that same static field with its own temp-file // path — a real race (caught as "table already exists" from two Migrate() calls // interleaving on whichever file won the race), not a hypothetical one. Serializing // test classes is the fix, not a redesign of the stores for a test-only concern. [assembly: CollectionBehavior(DisableTestParallelization = true)] namespace BigRegister.Tests; /// /// WP-22 moved Applications/Documents/Briefs off in-memory dictionaries onto a real /// SQLite file (see Data/Db.cs). Unlike static dictionaries, a shared file path /// would let concurrent test classes' WebApplicationFactory instances hit the same /// file at once — xUnit runs different test classes in parallel by default, and /// SQLite tolerates only one writer at a time, so that's a real "database is /// locked" flake risk, not a hypothetical one. Every test class below points at its /// own throwaway file instead, deleted when the factory (and its class's tests) are /// done — the same one-store-per-class isolation the old dictionaries gave for free. /// public sealed class TestWebApplicationFactory : WebApplicationFactory { private readonly string _dbPath = Path.Combine(Path.GetTempPath(), $"bigregister-test-{Guid.NewGuid():N}.db"); protected override void ConfigureWebHost(IWebHostBuilder builder) => builder.UseSetting("ConnectionStrings:AppDb", $"Data Source={_dbPath}"); protected override void Dispose(bool disposing) { base.Dispose(disposing); if (!disposing) return; File.Delete(_dbPath); File.Delete(_dbPath + "-shm"); // ponytail: best-effort — WAL sidecar files if SQLite created any. File.Delete(_dbPath + "-wal"); } }