[agent-pipeline] pipe-20260305174856-9ogt round-2
This commit is contained in:
parent
24f5c179d8
commit
4a9c4235a0
|
|
@ -0,0 +1,151 @@
|
|||
/**
|
||||
* 결재 템플릿 관리 및 결재함 E2E 테스트
|
||||
* 실행: node scripts/run-e2e-test.js
|
||||
*/
|
||||
const { chromium } = require("playwright");
|
||||
|
||||
const BASE_URL = "http://localhost:9771";
|
||||
const SCREENSHOT_DIR = ".agent-pipeline/browser-tests";
|
||||
|
||||
async function runTest() {
|
||||
const browser = await chromium.launch({ headless: true });
|
||||
const context = await browser.newContext({
|
||||
viewport: { width: 1280, height: 720 },
|
||||
});
|
||||
const page = await context.newPage();
|
||||
|
||||
const results = [];
|
||||
let allPassed = true;
|
||||
|
||||
function pass(name) {
|
||||
results.push({ name, status: "PASS" });
|
||||
console.log(`PASS: ${name}`);
|
||||
}
|
||||
|
||||
function fail(name, reason) {
|
||||
results.push({ name, status: "FAIL", reason });
|
||||
console.log(`FAIL: ${name} - ${reason}`);
|
||||
allPassed = false;
|
||||
}
|
||||
|
||||
try {
|
||||
// 로그인
|
||||
await page.goto(`${BASE_URL}/login`);
|
||||
await page.waitForLoadState("networkidle");
|
||||
|
||||
await page.getByPlaceholder("사용자 ID를 입력하세요").fill("wace");
|
||||
await page.getByPlaceholder("비밀번호를 입력하세요").fill("qlalfqjsgh11");
|
||||
|
||||
await Promise.all([
|
||||
page.waitForURL(url => !url.toString().includes("/login"), { timeout: 30000 }),
|
||||
page.getByRole("button", { name: "로그인" }).click(),
|
||||
]);
|
||||
await page.waitForLoadState("networkidle");
|
||||
pass("로그인");
|
||||
|
||||
// =========================================================
|
||||
// 결재 템플릿 관리 페이지
|
||||
// =========================================================
|
||||
await page.goto(`${BASE_URL}/admin/approvalTemplate`);
|
||||
await page.waitForLoadState("domcontentloaded");
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// 1. "결재 템플릿 관리" 제목 확인
|
||||
try {
|
||||
await page.locator("h1").filter({ hasText: "결재 템플릿 관리" }).waitFor({ timeout: 10000 });
|
||||
pass("결재 템플릿 관리 - 제목 확인");
|
||||
} catch (e) {
|
||||
fail("결재 템플릿 관리 - 제목 확인", e.message);
|
||||
}
|
||||
|
||||
// 2. "신규 등록" 버튼 확인
|
||||
try {
|
||||
await page.getByRole("button", { name: "신규 등록" }).waitFor({ timeout: 10000 });
|
||||
pass("결재 템플릿 관리 - 신규 등록 버튼 확인");
|
||||
} catch (e) {
|
||||
fail("결재 템플릿 관리 - 신규 등록 버튼 확인", e.message);
|
||||
}
|
||||
|
||||
// 3. 검색 입력란 확인
|
||||
try {
|
||||
await page.getByPlaceholder("템플릿명 또는 설명 검색...").waitFor({ timeout: 10000 });
|
||||
pass("결재 템플릿 관리 - 검색 입력란 확인");
|
||||
} catch (e) {
|
||||
// placeholder가 다를 수 있으므로 input으로 재시도
|
||||
try {
|
||||
await page.locator("input[type='text']").first().waitFor({ timeout: 5000 });
|
||||
pass("결재 템플릿 관리 - 검색 입력란 확인 (input fallback)");
|
||||
} catch (e2) {
|
||||
fail("결재 템플릿 관리 - 검색 입력란 확인", e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. JS 에러 오버레이 확인
|
||||
const hasError1 = await page.locator('[id="__next"] .nextjs-container-errors-body').isVisible().catch(() => false);
|
||||
if (!hasError1) {
|
||||
pass("결재 템플릿 관리 - JS 에러 없음");
|
||||
} else {
|
||||
fail("결재 템플릿 관리 - JS 에러 없음", "에러 오버레이 감지됨");
|
||||
}
|
||||
|
||||
await page.screenshot({ path: `${SCREENSHOT_DIR}/result-template.png`, fullPage: true });
|
||||
|
||||
// =========================================================
|
||||
// 결재함 페이지
|
||||
// =========================================================
|
||||
await page.goto(`${BASE_URL}/admin/approvalBox`);
|
||||
await page.waitForLoadState("domcontentloaded");
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// 1. 탭 확인
|
||||
try {
|
||||
await page.getByRole("tab", { name: /수신함/ }).waitFor({ timeout: 10000 });
|
||||
pass("결재함 - 수신함 탭 확인");
|
||||
} catch (e) {
|
||||
fail("결재함 - 수신함 탭 확인", e.message);
|
||||
}
|
||||
|
||||
try {
|
||||
await page.getByRole("tab", { name: /상신함/ }).waitFor({ timeout: 10000 });
|
||||
pass("결재함 - 상신함 탭 확인");
|
||||
} catch (e) {
|
||||
fail("결재함 - 상신함 탭 확인", e.message);
|
||||
}
|
||||
|
||||
// 2. JS 에러 오버레이 확인
|
||||
const hasError2 = await page.locator('[id="__next"] .nextjs-container-errors-body').isVisible().catch(() => false);
|
||||
if (!hasError2) {
|
||||
pass("결재함 - JS 에러 없음");
|
||||
} else {
|
||||
fail("결재함 - JS 에러 없음", "에러 오버레이 감지됨");
|
||||
}
|
||||
|
||||
await page.screenshot({ path: `${SCREENSHOT_DIR}/result-box.png`, fullPage: true });
|
||||
|
||||
} catch (e) {
|
||||
fail("테스트 실행", e.message);
|
||||
} finally {
|
||||
await browser.close();
|
||||
}
|
||||
|
||||
console.log("\n=== 테스트 결과 ===");
|
||||
results.forEach(r => {
|
||||
const status = r.status === "PASS" ? "✓" : "✗";
|
||||
console.log(`${status} ${r.name}${r.reason ? `: ${r.reason}` : ""}`);
|
||||
});
|
||||
|
||||
if (allPassed) {
|
||||
console.log("\nBROWSER_TEST_RESULT: PASS");
|
||||
process.exit(0);
|
||||
} else {
|
||||
const failed = results.filter(r => r.status === "FAIL").map(r => r.name).join(", ");
|
||||
console.log(`\nBROWSER_TEST_RESULT: FAIL - ${failed}`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
runTest().catch(e => {
|
||||
console.error("치명적 오류:", e);
|
||||
console.log("BROWSER_TEST_RESULT: FAIL - 치명적 오류: " + e.message);
|
||||
process.exit(1);
|
||||
});
|
||||
Loading…
Reference in New Issue