Task #242 partial — UnsTab interactive E2E test bodies + harness upgrades (Skip-guarded) #200
Reference in New Issue
Block a user
Delete Branch "task-242-unstab-interactive-partial"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Partial progress on task #242 (UnsTab drag-drop interactive Playwright E2E). Two interactive tests authored + marked [Fact(Skip=...)] pending resolution of a concrete blazor.web.js asset-resolution blocker documented in the class docstring. Multiple harness upgrades that move the in-process WebApplication fixture closer to a working Blazor Server circuit.
Harness upgrades (AdminWebAppFactory)
Environment=Developmentso 500s surface exception stacks.ContentRootPath→ Admin assembly dir so wwwroot resolves./hubs/fleet+/hubs/alertsmapped so ClusterDetail's HubConnection negotiation doesn't 500 at first render.Servicesproperty exposed so tests can open scoped DI contexts against the running host.Remaining blocker (reason for Skip)
/_framework/blazor.web.jsreturns HTTP 200 with a zero-byte body because the file ships viaMicrosoft.AspNetCore.App.Internal.AssetsNuGet rather than Admin's wwwroot. Three viable next-session approaches in class docstring.Test plan
🤖 Generated with Claude Code
Carries the interactive drag-drop + 409 concurrent-edit test bodies (full Playwright flows against the real @ondragstart/@ondragover/@ondrop handlers + modal + EF state round-trip), plus several harness upgrades that push the in-process WebApplication-based fixture closer to a working Blazor Server circuit. The interactive tests are marked [Fact(Skip=...)] pending resolution of one remaining blocker documented in the class docstring. Harness upgrades (AdminWebAppFactory): - Environment set to Development so 500s surface exception stacks (rather than the generic error page) during future diagnosis. - ContentRootPath pointed at the Admin assembly dir so wwwroot + manifest files resolve. - Wired SignalR hubs (/hubs/fleet, /hubs/alerts) so ClusterDetail's HubConnection negotiation no longer 500s at first render. - Services property exposed so tests can open scoped DI contexts against the running host (scheduled peer-edit simulation, post-commit state assertion). Remaining blocker (reason for Skip): /_framework/blazor.web.js returns HTTP 200 with a zero-byte body. The asset's route is declared in OtOpcUa.Admin.staticwebassets.endpoints.json, but the underlying file is shipped by the framework NuGet package (Microsoft.AspNetCore.App.Internal.Assets/_framework/blazor.web.js) rather than copied into the Admin wwwroot. MapStaticAssets can't resolve it without wiring a composite FileProvider or the WebRootPath machinery. Three viable next-session approaches listed in the class docstring: (a) Composite FileProvider mapping /_framework/* → NuGet cache. (b) Subprocess harness spawning real dotnet run of Admin project with an InMemory-DB override (closest to production composition). (c) MSBuild ItemGroup in the test csproj that copies framework files into the test output + ContentRoot=test assembly dir with UseStaticFiles. Scaffolding smoke test (Admin_host_serves_HTTP_via_Playwright_scaffolding) stays green unchanged. Suite state: 1 passed, 2 skipped, 0 failed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>