Changes:
1. admin-session.js: Use name attribute selectors instead of placeholder
- Changed: querySelector('input[placeholder="사용자명"]')
- To: querySelector('input[name="username"]')
- Reason: Placeholder selectors are fragile with DOM mutations
2. playwright.config.ts: Extend test timeouts for WASM boot
- Test timeout: 120s → 180s
- Expect timeout: 60s → 90s
- Reason: Blazor WASM bundle takes 60-120s to boot in local dev
3. tests/e2e/admin-login.spec.ts: Increase assertion timeouts
- Dashboard heading visibility: 20s → 60s
- Logout link visibility: timeout added 30s
4. tests/e2e/blog-crud.spec.ts: New comprehensive blog CRUD test
- Tests complete login flow
- Validates localStorage token storage
- Checks blog list page navigation
Status: Login form submission now works with proper field selection.
Remaining: Blazor WASM boot optimization needed for production.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Problem: With prerender: true + JavaScript form submission + location.reload(),
WASM hydration wasn't completing fast enough after page reload, leaving the
user on the login page despite successful token storage.
Solution: Complete rewrite to pure Blazor native login (prerender: false).
This approach:
1. WASM boots and renders the form
2. User submits form (Blazor handles it)
3. HttpClient POST to /api/auth/login
4. Save tokens to localStorage
5. CustomAuthenticationStateProvider.LoginAsync() called directly in C#
6. Blazor detects auth state change synchronously
7. NavigateTo() redirects to dashboard
8. All in same Blazor context, no reload needed
Benefits:
- Auth state update is synchronous with login response
- No WASM boot race conditions
- Direct C# call to CustomAuthenticationStateProvider
- Blazor handles redirect after auth state is confirmed
Trade-off: Login page requires WASM boot (brief spinner) instead of immediate
prerender display. This is acceptable for better reliability.
Result: Reliable login-to-dashboard flow with no hanging spinners or 'loading'
states.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>