Task #242 partial — UnsTab interactive E2E test bodies + harness upgrades (Skip-guarded) #200

Merged
dohertj2 merged 1 commits from task-242-unstab-interactive-partial into v2 2026-04-21 02:11:50 -04:00
Owner

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=Development so 500s surface exception stacks.
  • ContentRootPath → Admin assembly dir so wwwroot resolves.
  • SignalR hubs /hubs/fleet + /hubs/alerts mapped so ClusterDetail's HubConnection negotiation doesn't 500 at first render.
  • Services property exposed so tests can open scoped DI contexts against the running host.

Remaining blocker (reason for Skip)

/_framework/blazor.web.js returns HTTP 200 with a zero-byte body because the file ships via Microsoft.AspNetCore.App.Internal.Assets NuGet rather than Admin's wwwroot. Three viable next-session approaches in class docstring.

Test plan

  • Suite state: 1 passed (scaffolding smoke), 2 skipped (interactive), 0 failed.

🤖 Generated with Claude Code

## 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=Development` so 500s surface exception stacks. - `ContentRootPath` → Admin assembly dir so wwwroot resolves. - SignalR hubs `/hubs/fleet` + `/hubs/alerts` mapped so ClusterDetail's HubConnection negotiation doesn't 500 at first render. - `Services` property exposed so tests can open scoped DI contexts against the running host. ### Remaining blocker (reason for Skip) `/_framework/blazor.web.js` returns HTTP 200 with a zero-byte body because the file ships via `Microsoft.AspNetCore.App.Internal.Assets` NuGet rather than Admin's wwwroot. Three viable next-session approaches in class docstring. ### Test plan - Suite state: 1 passed (scaffolding smoke), 2 skipped (interactive), 0 failed. 🤖 Generated with Claude Code
dohertj2 added 1 commit 2026-04-21 02:11:41 -04:00
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>
dohertj2 merged commit 3e3c7206dd into v2 2026-04-21 02:11:50 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#200