feat(auth): implement option 3 architecture - server InteractiveServer login + client WASM dashboard
- Add Server.AddInteractiveServerComponents() + AddInteractiveServerRenderMode() - Create Server AuthLayout for login form (MudBlazor) - Implement LoginSimple.razor with @rendermode InteractiveServer in Server project - Update App.razor: CascadingAuthenticationState + Router with AppAssembly=Server - Fix Client MudBlazor Providers in MainLayout + AuthLayout - Update Playwright tests: use dynamic selectors for MudTextField (auto-generated IDs) - Build: 0 errors, 0 warnings - API: /api/auth/login fully operational (200 OK confirmed) - Playwright E2E test: 1 passed Architecture: /login → Server InteractiveServer (MudBlazor form) / → Client WebAssembly (Dashboard) /api/* → Server Endpoints Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
import { test } from '@playwright/test';
|
||||
|
||||
test('_framework 파일 로드 확인', async ({ page }) => {
|
||||
console.log('\n╔════════════════════════════════════════════════════╗');
|
||||
console.log('║ _framework 파일 로드 상태 확인 ║');
|
||||
console.log('╚════════════════════════════════════════════════════╝\n');
|
||||
|
||||
const frameworkRequests: any[] = [];
|
||||
|
||||
page.on('response', response => {
|
||||
const url = response.url();
|
||||
if (url.includes('_framework') || url.includes('blazor')) {
|
||||
frameworkRequests.push({
|
||||
url: url.split('?')[0],
|
||||
status: response.status(),
|
||||
});
|
||||
console.log(`[${response.status()}] ${url.split('?')[0]}`);
|
||||
}
|
||||
});
|
||||
|
||||
console.log('페이지 접근...');
|
||||
await page.goto('http://localhost:5265/login');
|
||||
await page.waitForLoadState('networkidle');
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
console.log('\n╔════════════════════════════════════════════════════╗');
|
||||
console.log('║ _framework 파일 요약 ║');
|
||||
console.log('╚════════════════════════════════════════════════════╝\n');
|
||||
|
||||
console.log(`총 _framework 요청: ${frameworkRequests.length}\n`);
|
||||
|
||||
const byStatus: { [key: number]: string[] } = {};
|
||||
frameworkRequests.forEach(req => {
|
||||
if (!byStatus[req.status]) byStatus[req.status] = [];
|
||||
byStatus[req.status].push(req.url);
|
||||
});
|
||||
|
||||
Object.entries(byStatus).forEach(([status, urls]) => {
|
||||
console.log(`[${status}] ${urls.length}개`);
|
||||
urls.forEach(url => {
|
||||
const filename = url.split('/').pop();
|
||||
console.log(` ✓ ${filename}`);
|
||||
});
|
||||
console.log('');
|
||||
});
|
||||
|
||||
const failedCount = (byStatus[404] || []).length + (byStatus[302] || []).length;
|
||||
if (failedCount > 0) {
|
||||
console.log(`❌ ${failedCount}개의 파일이 로드되지 않음!`);
|
||||
} else if (frameworkRequests.length > 0) {
|
||||
console.log('✅ 모든 _framework 파일 로드됨');
|
||||
} else {
|
||||
console.log('❌ _framework 파일이 로드되지 않음');
|
||||
}
|
||||
|
||||
console.log('\n📍 최종 URL:', page.url());
|
||||
});
|
||||
Reference in New Issue
Block a user