// @ts-check const { test, expect } = require('@playwright/test'); const { login } = require('./helpers/auth'); test.describe('관리자 패널 — 지자체관리자', () => { test.beforeEach(async ({ page }) => { await login(page, 'local'); }); test('관리자 대시보드 접근', async ({ page }) => { await page.goto('/admin'); await expect(page).toHaveURL(/\/admin/); }); test('회원 관리 목록 접근', async ({ page }) => { await page.goto('/admin/users'); await expect(page).toHaveURL(/\/admin\/users/); await expect(page.locator('td:has-text("tester_")').first()).toBeVisible({ timeout: 10000 }); }); test('로그인 이력 접근', async ({ page }) => { await page.goto('/admin/access/login-history'); await expect(page).toHaveURL(/\/admin\/access\/login-history/); }); test('승인 대기 목록 접근', async ({ page }) => { await page.goto('/admin/access/approvals'); await expect(page).toHaveURL(/\/admin\/access\/approvals/); }); test('역할 목록 접근', async ({ page }) => { await page.goto('/admin/roles'); await expect(page).toHaveURL(/\/admin\/roles/); }); test('메뉴 관리 접근', async ({ page }) => { await page.goto('/admin/menus'); await expect(page).toHaveURL(/\/admin\/menus/); }); test('지정판매소 목록 접근', async ({ page }) => { await page.goto('/bag/designated-shops'); await expect(page).toHaveURL(/\/bag\/designated-shops$/); await expect(page.getByText('지정판매소 관리').first()).toBeVisible(); await expect(page.getByRole('link', { name: '지정판매소 등록' })).toBeVisible(); }); test('지정판매소 조회 전용(browse) 접근', async ({ page }) => { await page.goto('/bag/designated-shops/browse'); await expect(page).toHaveURL(/\/bag\/designated-shops\/browse/); await expect(page.getByText('지정판매소 조회').first()).toBeVisible(); await expect(page.getByRole('link', { name: '지정판매소 등록' })).toHaveCount(0); }); test('지정판매소 소메뉴는 현재 경로 1개만 활성화', async ({ page }) => { const activeSubmenu = page.locator('nav a.text-blue-700.font-semibold.bg-blue-50'); await page.goto('/bag/designated-shops'); await expect(page).toHaveURL(/\/bag\/designated-shops$/); await expect(activeSubmenu.filter({ hasText: '지정판매소 관리' })).toHaveCount(1); await expect(activeSubmenu.filter({ hasText: '지정판매소 바코드출력' })).toHaveCount(0); await expect(activeSubmenu.filter({ hasText: '지정판매소 조회' })).toHaveCount(0); await page.goto('/bag/designated-shops/browse'); await expect(page).toHaveURL(/\/bag\/designated-shops\/browse/); await expect(activeSubmenu.filter({ hasText: '지정판매소 조회' })).toHaveCount(1); await expect(activeSubmenu.filter({ hasText: '지정판매소 관리' })).toHaveCount(0); }); test('지자체 관리는 Super Admin 전용 — 지자체관리자 접근 시 리다이렉트', async ({ page }) => { await page.goto('/admin/local-governments'); // Level 3는 Super Admin이 아니므로 /admin으로 리다이렉트됨 await expect(page).toHaveURL(/\/admin$/); }); }); test.describe('관리자 패널 — Super Admin', () => { test('지자체 선택 후 관리자 접근', async ({ page }) => { await login(page, 'admin'); await expect(page).toHaveURL(/\/admin\/select-local-government/); // radio 버튼으로 첫 번째 지자체 선택 const radio = page.locator('input[name="lg_idx"]').first(); await radio.check(); await page.click('button[type="submit"]'); // 선택 후 관리자 대시보드로 이동 await page.waitForURL(url => !url.pathname.includes('select-local-government'), { timeout: 30000 }); await page.goto('/admin'); await expect(page).not.toHaveURL(/\/select-local-government/); }); test('Super Admin은 지자체 관리 접근 가능', async ({ page }) => { // 먼저 로그인 + 지자체 선택 await login(page, 'admin'); const radio = page.locator('input[name="lg_idx"]').first(); await radio.check(); await page.click('button[type="submit"]'); await page.waitForURL(url => !url.pathname.includes('select-local-government'), { timeout: 30000 }); await page.goto('/admin/local-governments'); await expect(page).toHaveURL(/\/admin\/local-governments/); }); });