docs: add project docs and test updates

This commit is contained in:
taekyoungc
2026-04-08 00:23:55 +09:00
parent 06fedc866a
commit 06aa401048
238 changed files with 8373 additions and 148 deletions

View File

@@ -40,7 +40,7 @@ test.describe('관리자 패널 — 지자체관리자', () => {
});
test('지정판매소 목록 접근', async ({ page }) => {
await page.goto('/admin/designated-shops');
await page.goto('/bag/designated-shops');
await expect(page).toHaveURL(/\/admin\/designated-shops/);
});

View File

@@ -16,25 +16,20 @@ test.describe('P2-03/04: 봉투 단가 관리', () => {
});
test('단가 목록 접근', async ({ page }) => {
await page.goto('/admin/bag-prices');
await expect(page).toHaveURL(/\/admin\/bag-prices/);
await page.goto('/bag/bag-prices');
await expect(page).toHaveURL(/\/bag\/bag-prices/);
});
test('단가 등록 폼 표시', async ({ page }) => {
await page.goto('/admin/bag-prices/create');
await page.goto('/bag/bag-prices/create');
await expect(page.locator('select[name="bp_bag_code"]')).toBeVisible();
await expect(page.locator('input[name="bp_order_price"]')).toBeVisible();
});
test('기간 필터 조회', async ({ page }) => {
await page.goto('/admin/bag-prices?start_date=2026-01-01&end_date=2026-12-31');
await expect(page).toHaveURL(/start_date/);
});
test('단가 변경 이력 페이지 (빈 상태)', async ({ page }) => {
// 먼저 데이터가 있어야 하므로, 목록 페이지만 접근 확인
await page.goto('/admin/bag-prices');
await expect(page).toHaveURL(/\/admin\/bag-prices/);
await page.goto('/bag/bag-prices');
await expect(page).toHaveURL(/\/bag\/bag-prices/);
});
});
@@ -42,7 +37,7 @@ test.describe('P2-03: 지자체관리자 접근', () => {
test('지자체관리자도 단가 목록 접근 가능', async ({ page }) => {
await login(page, 'local');
await page.goto('/admin/bag-prices');
await expect(page).toHaveURL(/\/admin\/bag-prices/);
await page.goto('/bag/bag-prices');
await expect(page).toHaveURL(/\/bag\/bag-prices/);
});
});

View File

@@ -7,11 +7,38 @@ test.describe('사이트 메뉴 (/bag/*) 페이지 접근', () => {
await login(page, 'local');
});
test('기본정보관리', async ({ page }) => {
test('기본정보관리 (허브)', async ({ page }) => {
await page.goto('/bag/basic-info');
await expect(page).toHaveURL(/\/bag\/basic-info/);
await expect(page.locator('text=봉투 단가')).toBeVisible();
await expect(page.locator('a[href*="bag/code-kinds"]')).toBeVisible();
await expect(page.locator('a[href*="bag/prices"]')).toBeVisible();
await expect(page.locator('a[href*="bag/packaging-units"]')).toBeVisible();
});
test('봉투 단가 (/bag/prices)', async ({ page }) => {
await page.goto('/bag/prices');
await expect(page).toHaveURL(/\/bag\/prices/);
await expect(page.locator('th:has-text("발주단가")')).toBeVisible();
await expect(page.locator('select[name="bag_kind_e"]')).toBeVisible();
await expect(page.locator('select[name="bag_code"]')).toBeVisible();
});
test('봉투 단가 기간·구분 필터 GET', async ({ page }) => {
await page.goto('/bag/prices?start_date=2026-01-01&end_date=2026-12-31&bag_kind_e=10');
await expect(page).toHaveURL(/start_date=/);
await expect(page).toHaveURL(/bag_kind_e=10/);
});
test('봉투 단가 기간 연·월·일 GET', async ({ page }) => {
await page.goto('/bag/prices?start_y=2026&start_m=1&start_d=1&end_y=2026&end_m=12&end_d=31');
await expect(page).toHaveURL(/start_y=/);
await expect(page.locator('select[name="start_m"]')).toHaveValue('1');
await expect(page.locator('select[name="end_m"]')).toHaveValue('12');
});
test('포장 단위 (/bag/packaging-units)', async ({ page }) => {
await page.goto('/bag/packaging-units');
await expect(page).toHaveURL(/\/bag\/packaging-units/);
await expect(page.locator('th:has-text("박스당 팩 수")')).toBeVisible();
});
test('기본코드관리 (/bag/code-kinds)', async ({ page }) => {

View File

@@ -73,6 +73,14 @@ test.describe('P2-02: 세부코드 관리', () => {
});
});
test.describe('기본코드: 지자체관리자는 코드 종류 CRUD 불가', () => {
test('지자체관리자가 /admin/code-kinds/create 접근 시 차단', async ({ page }) => {
await login(page, 'local');
await page.goto('/admin/code-kinds/create');
await expect(page).not.toHaveURL(/\/admin\/code-kinds\/create/);
});
});
test.describe('기본코드: 시민·판매소 조회 (/bag/code-kinds)', () => {
test('지정판매소는 bag 목록·테이블만, 등록 버튼 없음', async ({ page }) => {
await login(page, 'shop');

View File

@@ -22,36 +22,36 @@ async function run() {
const pages = [
// Phase 2
['30_bag_price_create', '/admin/bag-prices/create'],
['31_packaging_unit', '/admin/packaging-units'],
['32_sales_agency', '/admin/sales-agencies'],
['33_sales_agency_create', '/admin/sales-agencies/create'],
['34_manager', '/admin/managers'],
['35_manager_create', '/admin/managers/create'],
['36_company', '/admin/companies'],
['37_company_create', '/admin/companies/create'],
['38_free_recipient', '/admin/free-recipients'],
['39_free_recipient_create', '/admin/free-recipients/create'],
['30_bag_price_create', '/bag/bag-prices/create'],
['31_packaging_unit', '/bag/packaging-units/manage'],
['32_sales_agency', '/bag/sales-agencies'],
['33_sales_agency_create', '/bag/sales-agencies/create'],
['34_manager', '/bag/managers'],
['35_manager_create', '/bag/managers/create'],
['36_company', '/bag/companies'],
['37_company_create', '/bag/companies/create'],
['38_free_recipient', '/bag/free-recipients'],
['39_free_recipient_create', '/bag/free-recipients/create'],
['40_lg_edit', '/admin/local-governments/edit/1'],
['41_password_change', '/admin/password-change'],
['41_password_change', '/bag/password-change'],
// Phase 3
['42_bag_orders', '/admin/bag-orders'],
['43_bag_order_create', '/admin/bag-orders/create'],
['44_bag_receivings', '/admin/bag-receivings'],
['45_bag_receiving_create', '/admin/bag-receivings/create'],
['46_bag_inventory', '/admin/bag-inventory'],
['42_bag_orders', '/bag/bag-orders'],
['43_bag_order_create', '/bag/bag-orders/create'],
['44_bag_receivings', '/bag/bag-receivings'],
['45_bag_receiving_create', '/bag/bag-receivings/create'],
['46_bag_inventory', '/bag/bag-inventory'],
// Phase 4
['47_shop_orders', '/admin/shop-orders'],
['48_shop_order_create', '/admin/shop-orders/create'],
['49_bag_sales', '/admin/bag-sales'],
['50_bag_sale_create', '/admin/bag-sales/create'],
['51_bag_issues', '/admin/bag-issues'],
['52_bag_issue_create', '/admin/bag-issues/create'],
['47_shop_orders', '/bag/shop-orders'],
['48_shop_order_create', '/bag/shop-orders/create'],
['49_bag_sales', '/bag/bag-sales'],
['50_bag_sale_create', '/bag/bag-sales/create'],
['51_bag_issues', '/bag/bag-issues'],
['52_bag_issue_create', '/bag/bag-issues/create'],
// Phase 5
['53_report_sales_ledger', '/admin/reports/sales-ledger'],
['54_report_daily_summary', '/admin/reports/daily-summary'],
['55_report_period_sales', '/admin/reports/period-sales'],
['56_report_supply_demand', '/admin/reports/supply-demand'],
['53_report_sales_ledger', '/bag/reports/sales-ledger'],
['54_report_daily_summary', '/bag/reports/daily-summary'],
['55_report_period_sales', '/bag/reports/period-sales'],
['56_report_supply_demand', '/bag/reports/supply-demand'],
];
for (const [name, url] of pages) {

View File

@@ -64,8 +64,8 @@ async function run() {
await screenshot(page, '11_admin_menus', `${BASE_URL}/admin/menus`);
await screenshot(page, '12_admin_local_governments', `${BASE_URL}/admin/local-governments`);
await screenshot(page, '13_admin_lg_create', `${BASE_URL}/admin/local-governments/create`);
await screenshot(page, '14_admin_designated_shops', `${BASE_URL}/admin/designated-shops`);
await screenshot(page, '15_admin_ds_create', `${BASE_URL}/admin/designated-shops/create`);
await screenshot(page, '14_admin_designated_shops', `${BASE_URL}/bag/designated-shops`);
await screenshot(page, '15_admin_ds_create', `${BASE_URL}/bag/designated-shops/create`);
// 로그아웃
await page.goto(`${BASE_URL}/logout`);

View File

@@ -0,0 +1,118 @@
// @ts-check
/**
* 메뉴(mm_link)에 넣은 주요 경로 스모크: 5xx·DB 예외·Whoops 없이 로드되는지 확인.
* 실행: 앱이 playwright.config.js 의 baseURL(기본 8045)에서 떠 있어야 함.
*/
const { test, expect } = require('@playwright/test');
const { login } = require('./helpers/auth');
async function loginAsAdmin(page) {
await login(page, 'admin');
await page.locator('input[name="lg_idx"]').first().check();
await page.click('button[type="submit"]');
await page.waitForURL((url) => !url.pathname.includes('select-local-government'), { timeout: 30000 });
}
/**
* @param {import('@playwright/test').Page} page
* @param {string} pathWithLeadingSlash '/bag/prices' 형태
*/
async function assertNoServerError(page, pathWithLeadingSlash) {
const response = await page.goto(pathWithLeadingSlash, { waitUntil: 'domcontentloaded' });
const status = response?.status() ?? 0;
expect.soft(status, `${pathWithLeadingSlash} HTTP`).toBeLessThan(500);
const html = await page.content();
expect.soft(html, `${pathWithLeadingSlash}`).not.toContain('DatabaseException');
expect.soft(html, `${pathWithLeadingSlash}`).not.toContain('mysqli_sql_exception');
expect.soft(html, `${pathWithLeadingSlash}`).not.toMatch(/Whoops!/i);
}
const BAG_PATHS = [
'/bag/basic-info',
'/bag/prices',
'/bag/packaging-units',
'/bag/code-kinds',
'/bag/code-details/1',
'/bag/purchase-inbound',
'/bag/issue',
'/bag/issue/create',
'/bag/inventory',
'/bag/inventory/adjust',
'/bag/order/create',
'/bag/receiving/create',
'/bag/sales',
'/bag/sales-stats',
'/bag/sale/create',
'/bag/shop-order/create',
'/bag/flow',
'/bag/analytics',
'/bag/window',
'/bag/help',
'/bag/waste-suibal-enterprise',
'/dashboard',
// 메인 사이트 메뉴용 업무 URL (관리자 권한, 사이트 레이아웃)
'/bag/managers',
'/bag/managers/create',
'/bag/sales-agencies',
'/bag/sales-agencies/create',
'/bag/companies',
'/bag/companies/create',
'/bag/free-recipients',
'/bag/free-recipients/create',
'/bag/designated-shops',
'/bag/designated-shops/status',
'/bag/bag-prices',
'/bag/bag-prices/create',
'/bag/packaging-units/manage',
'/bag/packaging-units/manage/create',
'/bag/bag-orders',
'/bag/bag-orders/create',
'/bag/bag-receivings',
'/bag/bag-receivings/create',
'/bag/bag-inventory',
'/bag/shop-orders',
'/bag/shop-orders/create',
'/bag/bag-sales',
'/bag/bag-sales/create',
'/bag/bag-issues',
'/bag/bag-issues/create',
'/bag/password-change',
'/bag/reports/sales-ledger?start_date=2026-01-01&end_date=2026-12-31',
'/bag/reports/daily-summary?date=2026-01-15',
'/bag/reports/period-sales?start_date=2026-01-01&end_date=2026-12-31',
'/bag/reports/yearly-sales?year=2026',
'/bag/reports/shop-sales',
'/bag/reports/hometax-export',
'/bag/reports/returns',
'/bag/reports/supply-demand',
'/bag/reports/lot-flow',
'/bag/reports/misc-flow',
];
const ADMIN_PATHS = [
'/admin/',
];
test.describe('메뉴 링크 스모크 — Bag (지자체관리자)', () => {
test.beforeEach(async ({ page }) => {
await login(page, 'local');
});
for (const path of BAG_PATHS) {
test(path, async ({ page }) => {
await assertNoServerError(page, path);
});
}
});
test.describe('메뉴 링크 스모크 — Admin (Super Admin + 지자체 선택)', () => {
test.beforeEach(async ({ page }) => {
await loginAsAdmin(page);
});
for (const path of ADMIN_PATHS) {
test(path, async ({ page }) => {
await assertNoServerError(page, path);
});
}
});

View File

@@ -19,13 +19,13 @@ async function loginAsLocal(page) {
test.describe('CT-01: 페이지네이션', () => {
test('발주 목록에 데이터 테이블 존재', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/bag-orders');
await page.goto('/bag/bag-orders');
await expect(page.locator('table.data-table')).toBeVisible();
});
test('판매 목록에 데이터 테이블 존재', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/bag-sales');
await page.goto('/bag/bag-sales');
await expect(page.locator('table.data-table')).toBeVisible();
});
});
@@ -36,7 +36,7 @@ test.describe('CT-01: 페이지네이션', () => {
test.describe('CT-02: 엑셀 저장', () => {
test('발주 엑셀 다운로드', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/bag-orders');
await page.goto('/bag/bag-orders');
const downloadPromise = page.waitForEvent('download', { timeout: 10000 });
await page.locator('a[href*="export"]').first().click();
const download = await downloadPromise;
@@ -45,7 +45,7 @@ test.describe('CT-02: 엑셀 저장', () => {
test('재고 엑셀 다운로드', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/bag-inventory');
await page.goto('/bag/bag-inventory');
const downloadPromise = page.waitForEvent('download', { timeout: 10000 });
await page.locator('a[href*="export"]').first().click();
const download = await downloadPromise;
@@ -59,7 +59,7 @@ test.describe('CT-02: 엑셀 저장', () => {
test.describe('CT-03: 인쇄 버튼', () => {
test('발주 목록에 인쇄 버튼 존재', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/bag-orders');
await page.goto('/bag/bag-orders');
await expect(page.locator('button:has-text("인쇄"), a:has-text("인쇄")')).toBeVisible();
});
});
@@ -83,20 +83,20 @@ test.describe('CT-06: 대시보드 실 데이터', () => {
test.describe('P2-15: 지정판매소 다조건 조회', () => {
test('이름 검색 필터', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/designated-shops?ds_name=CU');
await page.goto('/bag/designated-shops?ds_name=CU');
await expect(page).toHaveURL(/ds_name=CU/);
await expect(page.locator('table.data-table')).toBeVisible();
});
test('상태 필터', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/designated-shops?ds_state=1');
await page.goto('/bag/designated-shops?ds_state=1');
await expect(page.locator('table.data-table')).toBeVisible();
});
test('검색 폼에서 이름 입력 후 조회', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/designated-shops');
await page.goto('/bag/designated-shops');
const nameInput = page.locator('input[name="ds_name"]');
if (await nameInput.count() > 0) {
await nameInput.fill('GS');
@@ -112,7 +112,7 @@ test.describe('P2-15: 지정판매소 다조건 조회', () => {
test.describe('P2-17: 지정판매소 지도', () => {
test('지도 페이지 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/designated-shops/map');
await page.goto('/bag/designated-shops/map');
await expect(page).toHaveURL(/\/map/);
});
});
@@ -123,7 +123,7 @@ test.describe('P2-17: 지정판매소 지도', () => {
test.describe('P2-18: 지정판매소 현황', () => {
test('현황 페이지 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/designated-shops/status');
await page.goto('/bag/designated-shops/status');
await expect(page).toHaveURL(/\/status/);
await expect(page.locator('table.data-table').first()).toBeVisible();
});
@@ -135,14 +135,14 @@ test.describe('P2-18: 지정판매소 현황', () => {
test.describe('P5-04: 년 판매 현황', () => {
test('년 판매 현황 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/yearly-sales');
await page.goto('/bag/reports/yearly-sales');
await expect(page).toHaveURL(/yearly-sales/);
await expect(page.locator('table.data-table')).toBeVisible();
});
test('연도 변경 조회', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/yearly-sales?year=2025');
await page.goto('/bag/reports/yearly-sales?year=2025');
await expect(page).toHaveURL(/year=2025/);
});
});
@@ -153,7 +153,7 @@ test.describe('P5-04: 년 판매 현황', () => {
test.describe('P5-05: 판매소별 판매현황', () => {
test('판매소별 현황 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/shop-sales');
await page.goto('/bag/reports/shop-sales');
await expect(page).toHaveURL(/shop-sales/);
await expect(page.locator('table.data-table')).toBeVisible();
});
@@ -167,7 +167,7 @@ test.describe('P5-06: 홈택스 세금계산서 엑셀', () => {
await loginAsLocal(page);
// 다운로드를 트리거하는 URL이므로 evaluate로 fetch 테스트
const status = await page.evaluate(async () => {
const res = await fetch('/admin/reports/hometax-export');
const res = await fetch('/bag/reports/hometax-export');
return res.status;
});
expect(status).toBe(200);
@@ -180,14 +180,14 @@ test.describe('P5-06: 홈택스 세금계산서 엑셀', () => {
test.describe('P5-08: 반품/파기 현황', () => {
test('반품/파기 목록 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/returns');
await page.goto('/bag/reports/returns');
await expect(page).toHaveURL(/returns/);
await expect(page.locator('table.data-table')).toBeVisible();
});
test('기간 필터 조회', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/returns?start_date=2026-01-01&end_date=2026-12-31');
await page.goto('/bag/reports/returns?start_date=2026-01-01&end_date=2026-12-31');
await expect(page.locator('table.data-table')).toBeVisible();
});
});
@@ -198,13 +198,13 @@ test.describe('P5-08: 반품/파기 현황', () => {
test.describe('P5-10: LOT 수불 조회', () => {
test('LOT 수불 페이지 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/lot-flow');
await page.goto('/bag/reports/lot-flow');
await expect(page).toHaveURL(/lot-flow/);
});
test('LOT 번호 검색', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/lot-flow?lot=LOT-2025');
await page.goto('/bag/reports/lot-flow?lot=LOT-2025');
await expect(page).toHaveURL(/lot=LOT/);
});
});
@@ -215,13 +215,13 @@ test.describe('P5-10: LOT 수불 조회', () => {
test.describe('P5-11: 기타 입출고', () => {
test('기타 입출고 페이지 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/misc-flow');
await page.goto('/bag/reports/misc-flow');
await expect(page).toHaveURL(/misc-flow/);
});
test('기타 입출고 등록 폼 표시', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/reports/misc-flow');
await page.goto('/bag/reports/misc-flow');
await expect(page.locator('select[name="bmf_type"]')).toBeVisible();
await expect(page.locator('input[name="bmf_qty"]')).toBeVisible();
});
@@ -279,7 +279,7 @@ test.describe('사이트 메뉴 CRUD 동작', () => {
test.describe('엑셀 내보내기 다운로드', () => {
test('지정판매소 엑셀', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/designated-shops');
await page.goto('/bag/designated-shops');
const downloadPromise = page.waitForEvent('download', { timeout: 10000 });
await page.locator('a[href*="export"]').first().click();
const download = await downloadPromise;
@@ -288,7 +288,7 @@ test.describe('엑셀 내보내기 다운로드', () => {
test('판매 엑셀', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/bag-sales');
await page.goto('/bag/bag-sales');
const downloadPromise = page.waitForEvent('download', { timeout: 10000 });
await page.locator('a[href*="export"]').first().click();
const download = await downloadPromise;

View File

@@ -16,19 +16,19 @@ test.describe('P2-05/06: 포장 단위 관리', () => {
});
test('포장 단위 목록 접근', async ({ page }) => {
await page.goto('/admin/packaging-units');
await page.goto('/bag/packaging-units/manage');
await expect(page).toHaveURL(/\/admin\/packaging-units/);
});
test('포장 단위 등록 폼 표시', async ({ page }) => {
await page.goto('/admin/packaging-units/create');
await page.goto('/bag/packaging-units/manage/create');
await expect(page.locator('select[name="pu_bag_code"]')).toBeVisible();
await expect(page.locator('input[name="pu_box_per_pack"]')).toBeVisible();
await expect(page.locator('input[name="pu_pack_per_sheet"]')).toBeVisible();
});
test('기간 필터 조회', async ({ page }) => {
await page.goto('/admin/packaging-units?start_date=2026-01-01&end_date=2026-12-31');
await page.goto('/bag/packaging-units/manage?start_date=2026-01-01&end_date=2026-12-31');
await expect(page).toHaveURL(/start_date/);
});
});

View File

@@ -16,17 +16,19 @@ async function loginAsLocal(page) {
test.describe('P2-07/08: 판매 대행소 관리', () => {
test('목록 접근 (Super Admin)', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/sales-agencies');
await page.goto('/bag/sales-agencies');
await expect(page).toHaveURL(/\/admin\/sales-agencies/);
});
test('등록 폼 표시', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/sales-agencies/create');
await page.goto('/bag/sales-agencies/create');
await expect(page.locator('input[name="sa_kind"]')).toBeVisible();
await expect(page.locator('input[name="sa_code"]')).toBeVisible();
await expect(page.locator('input[name="sa_name"]')).toBeVisible();
});
test('지자체관리자 접근', async ({ page }) => {
await loginAsLocal(page);
await page.goto('/admin/sales-agencies');
await page.goto('/bag/sales-agencies');
await expect(page).toHaveURL(/\/admin\/sales-agencies/);
});
});
@@ -34,12 +36,12 @@ test.describe('P2-07/08: 판매 대행소 관리', () => {
test.describe('P2-09/10: 담당자 관리', () => {
test('목록 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/managers');
await page.goto('/bag/managers');
await expect(page).toHaveURL(/\/admin\/managers/);
});
test('등록 폼 표시', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/managers/create');
await page.goto('/bag/managers/create');
await expect(page.locator('input[name="mg_name"]')).toBeVisible();
});
});
@@ -47,12 +49,12 @@ test.describe('P2-09/10: 담당자 관리', () => {
test.describe('P2-11/12: 업체 관리', () => {
test('목록 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/companies');
await page.goto('/bag/companies');
await expect(page).toHaveURL(/\/admin\/companies/);
});
test('등록 폼 표시', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/companies/create');
await page.goto('/bag/companies/create');
await expect(page.locator('select[name="cp_type"]')).toBeVisible();
await expect(page.locator('input[name="cp_name"]')).toBeVisible();
});
@@ -61,12 +63,12 @@ test.describe('P2-11/12: 업체 관리', () => {
test.describe('P2-13/14: 무료용 대상자 관리', () => {
test('목록 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/free-recipients');
await page.goto('/bag/free-recipients');
await expect(page).toHaveURL(/\/admin\/free-recipients/);
});
test('등록 폼 표시', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/free-recipients/create');
await page.goto('/bag/free-recipients/create');
await expect(page.locator('select[name="fr_type_code"]')).toBeVisible();
await expect(page.locator('input[name="fr_name"]')).toBeVisible();
});

View File

@@ -12,13 +12,13 @@ async function loginAsAdmin(page) {
test.describe('P2-19: 지자체 수정/삭제', () => {
test('지자체 수정 폼 표시', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/local-governments/edit/1');
await page.goto('/bag/local-governments/edit/1');
await expect(page.locator('input[name="lg_name"]')).toBeVisible();
});
test('지자체 목록에 수정/비활성 버튼 존재', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/local-governments');
await page.goto('/bag/local-governments');
await expect(page.locator('a:has-text("수정")').first()).toBeVisible({ timeout: 10000 });
});
});
@@ -26,7 +26,7 @@ test.describe('P2-19: 지자체 수정/삭제', () => {
test.describe('P2-20: 비밀번호 변경', () => {
test('비밀번호 변경 폼 표시', async ({ page }) => {
await login(page, 'local');
await page.goto('/admin/password-change');
await page.goto('/bag/password-change');
await expect(page.locator('input[name="current_password"]')).toBeVisible();
await expect(page.locator('input[name="new_password"]')).toBeVisible();
await expect(page.locator('input[name="new_password_confirm"]')).toBeVisible();

View File

@@ -12,19 +12,19 @@ async function loginAsAdmin(page) {
test.describe('P3: 발주 관리', () => {
test('발주 현황 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-orders');
await page.goto('/bag/bag-orders');
await expect(page).toHaveURL(/\/admin\/bag-orders/);
});
test('발주 등록 폼', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-orders/create');
await page.goto('/bag/bag-orders/create');
await expect(page.locator('input[name="bo_order_date"]')).toBeVisible();
});
test('기간 필터 조회', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-orders?start_date=2026-01-01&end_date=2026-12-31');
await page.goto('/bag/bag-orders?start_date=2026-01-01&end_date=2026-12-31');
await expect(page).toHaveURL(/start_date/);
});
});
@@ -32,13 +32,13 @@ test.describe('P3: 발주 관리', () => {
test.describe('P3: 입고 관리', () => {
test('입고 현황 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-receivings');
await page.goto('/bag/bag-receivings');
await expect(page).toHaveURL(/\/admin\/bag-receivings/);
});
test('입고 처리 폼', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-receivings/create');
await page.goto('/bag/bag-receivings/create');
await expect(page.locator('select[name="br_bo_idx"]')).toBeVisible();
});
});
@@ -46,7 +46,7 @@ test.describe('P3: 입고 관리', () => {
test.describe('P3: 재고 현황', () => {
test('재고 현황 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-inventory');
await page.goto('/bag/bag-inventory');
await expect(page).toHaveURL(/\/admin\/bag-inventory/);
});
});
@@ -54,11 +54,11 @@ test.describe('P3: 재고 현황', () => {
test.describe('P3: 지자체관리자 접근', () => {
test('발주/입고/재고 접근 가능', async ({ page }) => {
await login(page, 'local');
await page.goto('/admin/bag-orders');
await page.goto('/bag/bag-orders');
await expect(page).toHaveURL(/\/admin\/bag-orders/);
await page.goto('/admin/bag-receivings');
await page.goto('/bag/bag-receivings');
await expect(page).toHaveURL(/\/admin\/bag-receivings/);
await page.goto('/admin/bag-inventory');
await page.goto('/bag/bag-inventory');
await expect(page).toHaveURL(/\/admin\/bag-inventory/);
});
});

View File

@@ -12,12 +12,12 @@ async function loginAsAdmin(page) {
test.describe('P4: 주문 접수 관리', () => {
test('주문 목록 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/shop-orders');
await page.goto('/bag/shop-orders');
await expect(page).toHaveURL(/\/admin\/shop-orders/);
});
test('주문 접수 폼', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/shop-orders/create');
await page.goto('/bag/shop-orders/create');
await expect(page.locator('select[name="so_ds_idx"]')).toBeVisible();
});
});
@@ -25,12 +25,12 @@ test.describe('P4: 주문 접수 관리', () => {
test.describe('P4: 판매/반품 관리', () => {
test('판매 목록 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-sales');
await page.goto('/bag/bag-sales');
await expect(page).toHaveURL(/\/admin\/bag-sales/);
});
test('판매 등록 폼', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-sales/create');
await page.goto('/bag/bag-sales/create');
await expect(page.locator('select[name="bs_ds_idx"]')).toBeVisible();
});
});
@@ -38,12 +38,12 @@ test.describe('P4: 판매/반품 관리', () => {
test.describe('P4: 무료용 불출 관리', () => {
test('불출 목록 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-issues');
await page.goto('/bag/bag-issues');
await expect(page).toHaveURL(/\/admin\/bag-issues/);
});
test('불출 처리 폼', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/bag-issues/create');
await page.goto('/bag/bag-issues/create');
await expect(page.locator('select[name="bi2_bag_code"]')).toBeVisible();
});
});
@@ -53,15 +53,15 @@ test.describe('P4: 지자체관리자 접근', () => {
await login(page, 'local');
});
test('주문 접수 접근 가능', async ({ page }) => {
await page.goto('/admin/shop-orders');
await page.goto('/bag/shop-orders');
await expect(page).toHaveURL(/\/admin\/shop-orders/);
});
test('판매 접근 가능', async ({ page }) => {
await page.goto('/admin/bag-sales');
await page.goto('/bag/bag-sales');
await expect(page).toHaveURL(/\/admin\/bag-sales/);
});
test('불출 접근 가능', async ({ page }) => {
await page.goto('/admin/bag-issues');
await page.goto('/bag/bag-issues');
await expect(page).toHaveURL(/\/admin\/bag-issues/);
});
});

View File

@@ -12,12 +12,12 @@ async function loginAsAdmin(page) {
test.describe('P5: 판매 대장', () => {
test('일자별 판매 대장 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/reports/sales-ledger');
await page.goto('/bag/reports/sales-ledger');
await expect(page).toHaveURL(/\/admin\/reports\/sales-ledger/);
});
test('기간별 판매 대장', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/reports/sales-ledger?mode=period&start_date=2026-01-01&end_date=2026-12-31');
await page.goto('/bag/reports/sales-ledger?mode=period&start_date=2026-01-01&end_date=2026-12-31');
await expect(page).toHaveURL(/mode=period/);
});
});
@@ -25,7 +25,7 @@ test.describe('P5: 판매 대장', () => {
test.describe('P5: 일계표', () => {
test('일계표 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/reports/daily-summary');
await page.goto('/bag/reports/daily-summary');
await expect(page).toHaveURL(/\/admin\/reports\/daily-summary/);
});
});
@@ -33,7 +33,7 @@ test.describe('P5: 일계표', () => {
test.describe('P5: 기간별 판매현황', () => {
test('기간별 판매현황 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/reports/period-sales');
await page.goto('/bag/reports/period-sales');
await expect(page).toHaveURL(/\/admin\/reports\/period-sales/);
});
});
@@ -41,7 +41,7 @@ test.describe('P5: 기간별 판매현황', () => {
test.describe('P5: 봉투 수불 현황', () => {
test('수불 현황 접근', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/admin/reports/supply-demand');
await page.goto('/bag/reports/supply-demand');
await expect(page).toHaveURL(/\/admin\/reports\/supply-demand/);
});
});
@@ -49,9 +49,9 @@ test.describe('P5: 봉투 수불 현황', () => {
test.describe('P5: 지자체관리자 접근', () => {
test('리포트 접근 가능', async ({ page }) => {
await login(page, 'local');
await page.goto('/admin/reports/sales-ledger');
await page.goto('/bag/reports/sales-ledger');
await expect(page).toHaveURL(/\/admin\/reports\/sales-ledger/);
await page.goto('/admin/reports/daily-summary');
await page.goto('/bag/reports/daily-summary');
await expect(page).toHaveURL(/\/admin\/reports\/daily-summary/);
});
});