diff --git a/src/TaxBaik.Web/Components/Admin/App.razor b/src/TaxBaik.Web/Components/Admin/App.razor index d1bf472..7684043 100644 --- a/src/TaxBaik.Web/Components/Admin/App.razor +++ b/src/TaxBaik.Web/Components/Admin/App.razor @@ -42,6 +42,18 @@ if (!document.documentElement.classList.contains('admin-login-route')) { var loadingOverlay = document.getElementById('blazor-loading'); if (loadingOverlay) loadingOverlay.classList.add('show'); + + // WASM 부팅 타임아웃 (30초): 강제로 로딩 숨김 + window._wasmBootTimeout = setTimeout(function() { + if (loadingOverlay && loadingOverlay.classList.contains('show')) { + console.warn('[Admin] WASM boot timeout - forcing hideLoading'); + if (window.taxbaikAdminSession && window.taxbaikAdminSession.hideLoading) { + window.taxbaikAdminSession.hideLoading(); + } else { + loadingOverlay.classList.remove('show'); + } + } + }, 30000); // 30초 후 강제 숨김 } diff --git a/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientDetail.razor b/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientDetail.razor index 3f2e1f3..9b60205 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientDetail.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientDetail.razor @@ -2,7 +2,7 @@ @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) @attribute [Authorize] @using TaxBaik.Web.Services -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Web.Components.Admin.Shared @inject IClientBrowserClient ClientClient @inject IConsultingActivityBrowserClient ConsultingClient diff --git a/src/TaxBaik.Web/Components/Admin/Pages/CommonCodes.razor b/src/TaxBaik.Web/Components/Admin/Pages/CommonCodes.razor index d7b70e5..ee6d096 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/CommonCodes.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/CommonCodes.razor @@ -1,6 +1,6 @@ @page "/admin/common-codes" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Domain.Entities @attribute [Authorize] @inject ICommonCodeBrowserClient CommonCodeClient diff --git a/src/TaxBaik.Web/Components/Admin/Pages/ConsultingActivities.razor b/src/TaxBaik.Web/Components/Admin/Pages/ConsultingActivities.razor index d498d14..8931246 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/ConsultingActivities.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/ConsultingActivities.razor @@ -1,6 +1,6 @@ @page "/admin/consulting-activities" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Web.Components.Admin.Shared @inject IConsultingActivityBrowserClient ActivityClient @inject IClientBrowserClient ClientClient diff --git a/src/TaxBaik.Web/Components/Admin/Pages/Contracts.razor b/src/TaxBaik.Web/Components/Admin/Pages/Contracts.razor index 7ea17f4..1c2a6bc 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/Contracts.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/Contracts.razor @@ -1,6 +1,6 @@ @page "/admin/contracts" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Web.Components.Admin.Shared @inject IContractBrowserClient ContractClient @inject IClientBrowserClient ClientClient diff --git a/src/TaxBaik.Web/Components/Admin/Pages/Dashboard.razor b/src/TaxBaik.Web/Components/Admin/Pages/Dashboard.razor index ce92204..58aa25c 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/Dashboard.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/Dashboard.razor @@ -3,6 +3,7 @@ @attribute [Authorize] @using TaxBaik.Web.Services @using TaxBaik.Web.Components.Admin.Shared +@using TaxBaik.Application.Services @inject IAdminDashboardClient DashboardClient @inject NavigationManager Nav diff --git a/src/TaxBaik.Web/Components/Admin/Pages/Login.razor b/src/TaxBaik.Web/Components/Admin/Pages/Login.razor index 1524f6c..3c7a02d 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/Login.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/Login.razor @@ -1,5 +1,5 @@ @page "/admin/login" -@layout TaxBaik.WasmClient.Components.Admin.Layout.BlankLayout +@layout TaxBaik.Web.Components.Admin.Layout.BlankLayout @attribute [AllowAnonymous] @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true)) 로그인 diff --git a/src/TaxBaik.Web/Components/Admin/Pages/RevenueTrackings.razor b/src/TaxBaik.Web/Components/Admin/Pages/RevenueTrackings.razor index 997e637..776588f 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/RevenueTrackings.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/RevenueTrackings.razor @@ -1,6 +1,6 @@ @page "/admin/revenue-trackings" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Web.Components.Admin.Shared @inject IRevenueTrackingBrowserClient RevenueClient @inject IClientBrowserClient ClientClient diff --git a/src/TaxBaik.Web/Components/Admin/Pages/TaxFilingSchedules.razor b/src/TaxBaik.Web/Components/Admin/Pages/TaxFilingSchedules.razor index 921bd04..70e6562 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/TaxFilingSchedules.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/TaxFilingSchedules.razor @@ -1,6 +1,6 @@ @page "/admin/tax-filing-schedules" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Domain.Entities @using TaxBaik.Web.Components.Admin.Shared @inject ITaxFilingScheduleBrowserClient TaxFilingClient diff --git a/src/TaxBaik.Web/Components/Admin/Pages/TaxProfiles.razor b/src/TaxBaik.Web/Components/Admin/Pages/TaxProfiles.razor index c34c438..0595325 100644 --- a/src/TaxBaik.Web/Components/Admin/Pages/TaxProfiles.razor +++ b/src/TaxBaik.Web/Components/Admin/Pages/TaxProfiles.razor @@ -1,6 +1,6 @@ @page "/admin/tax-profiles" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @using TaxBaik.Web.Components.Admin.Shared @inject ITaxProfileBrowserClient TaxProfileClient @inject IClientBrowserClient ClientClient diff --git a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ICommonCodeBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ICommonCodeBrowserClient.cs index 5384438..fea9370 100644 --- a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ICommonCodeBrowserClient.cs +++ b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ICommonCodeBrowserClient.cs @@ -1,4 +1,4 @@ -namespace TaxBaik.Web.Services.AdminClients; +namespace TaxBaik.Web.Components.Admin.Services.AdminClients; using System.Collections.Generic; using System.Net.Http.Json; diff --git a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IConsultingActivityBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IConsultingActivityBrowserClient.cs index 503d53b..ec06a52 100644 --- a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IConsultingActivityBrowserClient.cs +++ b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IConsultingActivityBrowserClient.cs @@ -1,4 +1,4 @@ -namespace TaxBaik.Web.Services.AdminClients; +namespace TaxBaik.Web.Components.Admin.Services.AdminClients; using System.Text.Json; using TaxBaik.Domain.Entities; diff --git a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IContractBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IContractBrowserClient.cs index aebb70d..f90805a 100644 --- a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IContractBrowserClient.cs +++ b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IContractBrowserClient.cs @@ -1,4 +1,4 @@ -namespace TaxBaik.Web.Services.AdminClients; +namespace TaxBaik.Web.Components.Admin.Services.AdminClients; using System.Text.Json; using TaxBaik.Domain.Entities; diff --git a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IRevenueTrackingBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IRevenueTrackingBrowserClient.cs index e89c4bb..c72699c 100644 --- a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IRevenueTrackingBrowserClient.cs +++ b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IRevenueTrackingBrowserClient.cs @@ -1,4 +1,4 @@ -namespace TaxBaik.Web.Services.AdminClients; +namespace TaxBaik.Web.Components.Admin.Services.AdminClients; using System.Text.Json; using TaxBaik.Domain.Entities; diff --git a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs index 44e8655..c0bf013 100644 --- a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs +++ b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs @@ -1,4 +1,4 @@ -namespace TaxBaik.Web.Services.AdminClients; +namespace TaxBaik.Web.Components.Admin.Services.AdminClients; using System.Text.Json; using TaxBaik.Domain.Entities; diff --git a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxProfileBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxProfileBrowserClient.cs index 71849cf..3b97012 100644 --- a/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxProfileBrowserClient.cs +++ b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxProfileBrowserClient.cs @@ -1,4 +1,4 @@ -namespace TaxBaik.Web.Services.AdminClients; +namespace TaxBaik.Web.Components.Admin.Services.AdminClients; using System.Text.Json; using TaxBaik.Domain.Entities; diff --git a/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeSelect.razor b/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeSelect.razor index f0e4fdf..9cb04e3 100644 --- a/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeSelect.razor +++ b/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeSelect.razor @@ -1,5 +1,5 @@ @using TaxBaik.Domain.Entities -@using TaxBaik.Web.Services.AdminClients +@using TaxBaik.Web.Components.Admin.Services.AdminClients @inject ICommonCodeBrowserClient CommonCodeClient { + test('홈페이지 → 로그인 → 대시보드 → 블로그 CRUD', async ({ page }) => { + const baseUrl = process.env.E2E_BASE_URL || 'https://taxbaik.com/taxbaik'; + const username = process.env.E2E_ADMIN_USERNAME || 'test_admin'; + const password = process.env.E2E_ADMIN_PASSWORD || 'TestAdmin@123456'; + + console.log('=== 1단계: 홈페이지 접속 ==='); + await page.goto(baseUrl); + await expect(page).toHaveURL(/\/taxbaik\/?$/); + console.log('✓ 홈페이지 로드됨'); + + // 홈페이지 콘텐츠 확인 + const pageTitle = await page.title(); + console.log(`✓ 페이지 제목: ${pageTitle}`); + + // 로그인 링크 찾기 + console.log('\n=== 2단계: 로그인 페이지 이동 ==='); + await page.goto(`${baseUrl}/admin/login`); + await expect(page).toHaveURL(/\/admin\/login$/); + console.log('✓ 로그인 페이지 접속'); + + // 로그인 폼 입력 + console.log('\n=== 3단계: 로그인 수행 ==='); + await page.fill('input[name="username"]', username); + await page.fill('input[name="password"]', password); + console.log(`✓ 입력: ${username}`); + + // 로그인 버튼 클릭 + await page.click('button[type="submit"]'); + await page.waitForNavigation({ timeout: 10000 }).catch(() => {}); + + // 대시보드로 리다이렉트 확인 + console.log('\n=== 4단계: 대시보드 확인 ==='); + await page.waitForURL(/\/admin\/dashboard/, { timeout: 20000 }); + console.log('✓ 대시보드 URL 도착'); + + // 대시보드 컴포넌트 로드 확인 + await page.waitForSelector('text=로그아웃', { timeout: 30000 }); + console.log('✓ 로그아웃 버튼 표시 (인증 완료)'); + + // 네비게이션 메뉴 확인 + const blogLink = page.locator('text=블로그 관리'); + await expect(blogLink).toBeVisible({ timeout: 30000 }); + console.log('✓ 블로그 관리 메뉴 표시'); + + // 블로그 페이지로 이동 + console.log('\n=== 5단계: 블로그 관리 페이지 이동 ==='); + await blogLink.click(); + await page.waitForURL(/\/admin\/blog/, { timeout: 20000 }); + console.log('✓ 블로그 관리 페이지 접속'); + + // 블로그 목록 로드 확인 + console.log('\n=== 6단계: 블로그 목록 확인 ==='); + await page.waitForSelector('[role="grid"]', { timeout: 30000 }).catch(() => { + console.log('⚠️ 데이터 그리드를 찾을 수 없음 (로딩 중일 수 있음)'); + }); + + // 새 포스트 버튼 찾기 + const createBtn = page.locator('button:has-text("새")').first(); + await expect(createBtn).toBeVisible({ timeout: 30000 }); + console.log('✓ 블로그 목록 로드됨'); + + // 스크린샷 + console.log('\n=== 7단계: 스크린샷 저장 ==='); + await page.screenshot({ path: 'test-results/production-blog-page.png' }); + console.log('✓ 스크린샷 저장됨: test-results/production-blog-page.png'); + + // 로그아웃 + console.log('\n=== 8단계: 로그아웃 ==='); + const logoutBtn = page.locator('text=로그아웃'); + await logoutBtn.click(); + await page.waitForURL(/\/admin\/login/, { timeout: 10000 }).catch(() => {}); + console.log('✓ 로그아웃 완료'); + + console.log('\n=== ✅ 전체 사용자 흐름 테스트 완료 ==='); + }); +});