const { test, expect } = require('@playwright/test'); const { login } = require('./helpers/auth'); /** * gov-portal 디자인 전면 적용 검증 * - 메인(/) = 포털 대시보드(실데이터 카드) * - 업무 페이지에 포털 셸(헤더+대메뉴+사이드바) 적용 * - 대메뉴 클릭 → 좌측 사이드바에 소메뉴 표시 */ test.describe('gov-portal 전면 적용', () => { test('메인(/)이 워크스페이스(탭) + 첫 탭 대시보드로 렌더', async ({ page }) => { await login(page, 'user'); await page.goto('/'); await expect(page.locator('header.portal-header')).toBeVisible(); await expect(page.locator('.sidebar')).toBeVisible(); await expect(page.locator('.ws-tabbar')).toBeVisible(); // 첫 탭(대시보드) iframe 안에 실데이터 KPI await expect(page.frameLocator('.ws-frame.active').getByText('봉투 재고 총량')).toBeVisible({ timeout: 10000 }); // 목업 흔적 없음 await expect(page.getByText('서비스 데스크')).toHaveCount(0); }); test('업무 페이지에 포털 셸 적용', async ({ page }) => { await login(page, 'user'); await page.goto('/bag/help'); await expect(page.locator('header.portal-header')).toBeVisible(); await expect(page.locator('#portalSidebarList')).toBeAttached(); await expect(page.locator('#portalTopNavClick')).toBeAttached(); }); test('관리자 계정은 상단에 관리자 링크 노출', async ({ page }) => { await login(page, 'local'); await page.goto('/'); const adminLink = page.locator('header.portal-header a[href$="/admin"]'); await expect(adminLink).toBeVisible(); await expect(adminLink).toContainText('관리자'); }); test('로그인 페이지가 gov-portal 스타일(Pretendard)로 렌더', async ({ page }) => { await page.goto('/login'); const hasPretendard = await page.evaluate(() => [...document.styleSheets, ...document.querySelectorAll('link')].some( (n) => (n.href || '').includes('pretendard'))); expect(hasPretendard).toBeTruthy(); await expect(page.locator('input[name="login_id"]')).toBeVisible(); }); test('관리자 페이지에도 포털 셸 적용', async ({ page }) => { await login(page, 'admin'); await page.goto('/admin/select-local-government'); await expect(page.locator('header.portal-header')).toBeVisible(); await expect(page.locator('#portalSidebarList')).toBeAttached(); await expect(page.locator('#portalTopNavClick')).toBeAttached(); }); test('로그인·메인 로고가 사이트 공통 로고로 통일', async ({ page }) => { for (const url of ['/login', '/']) { await page.goto(url); const brand = page.locator('header a[href]').first(); await expect(brand).toContainText('종량제 시스템'); await expect(brand.locator('svg path')).toHaveCount(1); // 휴지통 SVG } }); test('대메뉴 클릭 시 사이드바에 소메뉴 표시', async ({ page }) => { await login(page, 'user'); await page.goto('/'); const triggers = page.locator('.portal-nav-trigger[data-parent-idx]'); const n = await triggers.count(); test.skip(n === 0, '이 계정에 하위메뉴를 가진 대메뉴가 없음'); await triggers.first().click(); // 사이드바 목록에 항목이 채워짐 await expect(page.locator('#portalSidebarList li').first()).toBeVisible(); }); });