import { test, expect } from '@playwright/test'; test.describe('Complete Admin Flow - All Pages', () => { const BASE_URL = 'http://localhost:5000'; const LOGIN_URL = `${BASE_URL}/Account/Login`; const ADMIN_DASHBOARD = `${BASE_URL}/Admin/Dashboard`; test.beforeEach(async ({ page }) => { // 1. 로그인 페이지 접근 await page.goto(LOGIN_URL); await expect(page).toHaveTitle(/Login|로그인/i); // 2. 로그인 시도 await page.fill('#username', 'admin'); await page.fill('#password', 'quant123!'); await page.click('button[type="submit"]'); // 3. 로그인 후 리다이렉트 대기 await page.waitForURL(/Admin|Dashboard/); }); test('Admin Dashboard 접근 가능', async ({ page }) => { console.log('Testing: Admin Dashboard'); await page.goto(ADMIN_DASHBOARD); // 페이지 로드 확인 await expect(page).toHaveTitle(/Dashboard|대시보드/i); // 주요 엘리먼트 확인 const body = await page.content(); expect(body).toContain('Dashboard'); console.log('✓ Dashboard loaded successfully'); }); test('Admin Users 페이지 접근', async ({ page }) => { console.log('Testing: Users Page'); await page.goto(`${BASE_URL}/Admin/Users`); // 페이지 로드 확인 const statusCode = (await page.goto(`${BASE_URL}/Admin/Users`)).status(); expect([200, 301, 302]).toContain(statusCode); const content = await page.content(); expect(content).not.toContain('500'); expect(content).not.toContain('error'); console.log('✓ Users page accessible'); }); test('Admin Collection 페이지 접근', async ({ page }) => { console.log('Testing: Collection Page'); const response = await page.goto(`${BASE_URL}/Admin/Collection`); expect(response?.status()).toBeLessThan(400); const content = await page.content(); expect(content).not.toContain('500'); console.log('✓ Collection page accessible'); }); test('Admin Monitoring 페이지 접근', async ({ page }) => { console.log('Testing: Monitoring Page'); const response = await page.goto(`${BASE_URL}/Admin/Monitoring`); expect(response?.status()).toBeLessThan(400); const content = await page.content(); expect(content).not.toContain('500'); console.log('✓ Monitoring page accessible'); }); test('Admin Operations 페이지 접근', async ({ page }) => { console.log('Testing: Operations Page'); const response = await page.goto(`${BASE_URL}/Admin/Operations`); expect(response?.status()).toBeLessThan(400); const content = await page.content(); expect(content).not.toContain('500'); console.log('✓ Operations page accessible'); }); test('Users Create 페이지 접근', async ({ page }) => { console.log('Testing: Users Create Page'); const response = await page.goto(`${BASE_URL}/Admin/Users/Create`); expect(response?.status()).toBeLessThan(400); const content = await page.content(); expect(content).not.toContain('500'); expect(content).toMatch(/Create|추가|사용자/i); console.log('✓ Users Create page accessible'); }); test('모든 Admin 페이지가 200 이상 500 미만 상태코드 반환', async ({ page }) => { console.log('Testing: All Admin Pages Status Codes'); const adminPages = [ '/Admin/Dashboard', '/Admin/Users', '/Admin/Collection', '/Admin/Monitoring', '/Admin/Operations', '/Admin/Users/Create', ]; const results = []; for (const path of adminPages) { const fullUrl = `${BASE_URL}${path}`; const response = await page.goto(fullUrl); const status = response?.status() || 0; results.push({ path, status, success: status >= 200 && status < 500, }); console.log(` ${path} → ${status} ${status >= 200 && status < 500 ? '✓' : '❌'}`); // 각 페이지에서 500 에러가 없는지 확인 const content = await page.content(); expect(content).not.toContain('500'); expect(content).not.toContain('System.InvalidOperationException'); } // 모든 페이지가 정상인지 확인 const allSuccess = results.every(r => r.success); expect(allSuccess).toBe(true); console.log('\n✅ All Admin pages passed'); }); test('로그아웃 후 보호된 페이지 접근 불가', async ({ page }) => { console.log('Testing: Access Control'); // 대시보드 접근 가능 확인 let response = await page.goto(ADMIN_DASHBOARD); expect(response?.status()).toBeLessThan(400); // 로그아웃 (쿠키 삭제) await page.context().clearCookies(); // 보호된 페이지 접근 시도 response = await page.goto(ADMIN_DASHBOARD); // 로그인 페이지로 리다이렉트되거나 401/403 에러 const url = page.url(); expect( url.includes('/Account/Login') || url.includes('/Account/AccessDenied') || (response?.status() && [401, 403].includes(response.status())) ).toBe(true); console.log('✓ Access control working correctly'); }); });