운영 화면과 회기 리뷰 UI 갱신
This commit is contained in:
parent
e7ebb38177
commit
3a9f70a97b
18 changed files with 2210 additions and 137 deletions
|
|
@ -1,5 +1,9 @@
|
|||
import { expect, test, type Page, type Response } from "@playwright/test";
|
||||
import { FILLED_REVIEW_SESSION_ID, routeFilledSessionReview } from "./session-review-fixture";
|
||||
import {
|
||||
FILLED_REVIEW_SESSION_ID,
|
||||
routeFilledSessionReview,
|
||||
routePrepostMeasures,
|
||||
} from "./session-review-fixture";
|
||||
import { expectNoHorizontalOverflow, fetchAvailablePersona, signInAsLearner } from "./support";
|
||||
|
||||
interface SessionStartResponse {
|
||||
|
|
@ -45,6 +49,7 @@ async function expectReviewRegionsReachable(page: Page) {
|
|||
await expect(page.locator(".sr-card--flow")).toBeVisible();
|
||||
await expect(page.locator(".sr-card--rubric")).toBeVisible();
|
||||
await expect(page.locator(".sr-card--transcript")).toBeVisible();
|
||||
await expect(page.locator(".sr-card--prepost")).toBeVisible();
|
||||
|
||||
const grid = await page.locator(".sr-cols").evaluate((el) => {
|
||||
const style = window.getComputedStyle(el);
|
||||
|
|
@ -64,19 +69,34 @@ async function expectReviewRegionsReachable(page: Page) {
|
|||
await expect(page.locator(".sr-card--transcript")).toBeInViewport();
|
||||
|
||||
const railGeometry = await page.locator(".sr-cols").evaluate((gridEl) => {
|
||||
const root = gridEl.closest(".sr-root");
|
||||
const overview = gridEl.querySelector(".sr-overview")?.getBoundingClientRect();
|
||||
const transcript = gridEl.querySelector(".sr-card--transcript")?.getBoundingClientRect();
|
||||
const rubric = gridEl.querySelector(".sr-card--rubric")?.getBoundingClientRect();
|
||||
const prepost = gridEl.querySelector(".sr-card--prepost")?.getBoundingClientRect();
|
||||
const worksheet = gridEl.querySelector(".sr-card--worksheet")?.getBoundingClientRect();
|
||||
const columns = window
|
||||
.getComputedStyle(gridEl)
|
||||
.gridTemplateColumns.split(" ")
|
||||
.filter(Boolean).length;
|
||||
return {
|
||||
isEmpty: root?.classList.contains("sr-root--empty") ?? false,
|
||||
columns,
|
||||
overviewLeft: overview ? Math.floor(overview.left) : 0,
|
||||
overviewRight: overview ? Math.ceil(overview.right) : 0,
|
||||
transcriptLeft: transcript ? Math.floor(transcript.left) : 0,
|
||||
transcriptRight: transcript ? Math.ceil(transcript.right) : 0,
|
||||
rubricLeft: rubric ? Math.floor(rubric.left) : 0,
|
||||
prepostLeft: prepost ? Math.floor(prepost.left) : 0,
|
||||
worksheetLeft: worksheet ? Math.floor(worksheet.left) : 0,
|
||||
};
|
||||
});
|
||||
if (railGeometry.columns >= 3) {
|
||||
if (!railGeometry.isEmpty && railGeometry.columns === 2) {
|
||||
expect(railGeometry.transcriptRight).toBeLessThanOrEqual(railGeometry.overviewLeft);
|
||||
expect(railGeometry.rubricLeft).toBeGreaterThanOrEqual(railGeometry.overviewLeft);
|
||||
expect(railGeometry.prepostLeft).toBeGreaterThanOrEqual(railGeometry.overviewLeft);
|
||||
expect(railGeometry.worksheetLeft).toBeGreaterThanOrEqual(railGeometry.overviewLeft);
|
||||
} else if (railGeometry.columns >= 3) {
|
||||
expect(railGeometry.overviewRight).toBeLessThanOrEqual(railGeometry.transcriptLeft);
|
||||
}
|
||||
}
|
||||
|
|
@ -84,6 +104,7 @@ async function expectReviewRegionsReachable(page: Page) {
|
|||
test.describe("session review", () => {
|
||||
test("renders server review data without legacy transcript fixtures", async ({ page }) => {
|
||||
await signInAsLearner(page);
|
||||
await routePrepostMeasures(page);
|
||||
const sessionId = await createEndedSession(page);
|
||||
|
||||
const reviewResponsePromise = page.waitForResponse(isReviewResponse(sessionId));
|
||||
|
|
@ -124,6 +145,7 @@ test.describe("session review", () => {
|
|||
test("renders filled review evidence state without clipping", async ({ page }) => {
|
||||
await signInAsLearner(page);
|
||||
await routeFilledSessionReview(page);
|
||||
await routePrepostMeasures(page);
|
||||
|
||||
const reviewResponsePromise = page.waitForResponse(isReviewResponse(FILLED_REVIEW_SESSION_ID));
|
||||
await page.goto(`/learn/session/${FILLED_REVIEW_SESSION_ID}/review`);
|
||||
|
|
@ -141,6 +163,24 @@ test.describe("session review", () => {
|
|||
await expect(page.getByText("회기 흐름")).toBeVisible();
|
||||
await expect(page.getByText("세션 트랜스크립트")).toBeVisible();
|
||||
await expect(page.getByText("기법 사용 분포")).toBeVisible();
|
||||
await expect(page.getByText("파일럿 증거 원장")).toBeVisible();
|
||||
await expect(page.getByText("1/3 쌍")).toBeVisible();
|
||||
const prepostInputs = page.locator(".sr-card--prepost input");
|
||||
await expect(prepostInputs).toHaveCount(6);
|
||||
await expect(prepostInputs.nth(0)).toHaveValue("3");
|
||||
await expect(prepostInputs.nth(1)).toHaveValue("4");
|
||||
const prepostLabels = await prepostInputs.evaluateAll((inputs) =>
|
||||
inputs.map((input) => input.getAttribute("aria-label")),
|
||||
);
|
||||
expect(prepostLabels).toEqual([
|
||||
"자기효능감 사전 점수",
|
||||
"자기효능감 사후 점수",
|
||||
"기술숙련도 사전 점수",
|
||||
"기술숙련도 사후 점수",
|
||||
"수련만족도 사전 점수",
|
||||
"수련만족도 사후 점수",
|
||||
]);
|
||||
await expect(page.getByText("효과 판정과 통계 검정은 평가설계 확정 후 별도 산출합니다.")).toBeVisible();
|
||||
await expect(page.getByText("사례개념화 워크시트")).toBeVisible();
|
||||
await expect(page.getByText("감정 반영").first()).toBeVisible();
|
||||
await expect(page.getByText("AI 슈퍼바이저").first()).toBeVisible();
|
||||
|
|
@ -154,4 +194,27 @@ test.describe("session review", () => {
|
|||
await expectReviewRegionsReachable(page);
|
||||
await expectNoHorizontalOverflow(page);
|
||||
});
|
||||
|
||||
test("stores learner pre/post pilot evidence without effect claims", async ({ page }) => {
|
||||
await signInAsLearner(page);
|
||||
await routeFilledSessionReview(page);
|
||||
await routePrepostMeasures(page);
|
||||
|
||||
await page.goto(`/learn/session/${FILLED_REVIEW_SESSION_ID}/review`);
|
||||
await expect(page.locator(".sr-card--prepost")).toBeVisible({ timeout: 15_000 });
|
||||
|
||||
const prepostInputs = page.locator(".sr-card--prepost input");
|
||||
await expect(prepostInputs).toHaveCount(6);
|
||||
await expect(page.getByText("1/3 쌍")).toBeVisible();
|
||||
await expect(page.getByText("효과 판정과 통계 검정은 평가설계 확정 후 별도 산출합니다.")).toBeVisible();
|
||||
|
||||
await prepostInputs.nth(2).fill("2.5");
|
||||
await prepostInputs.nth(3).fill("3.5");
|
||||
await expect(prepostInputs.nth(2)).toHaveValue("2.5");
|
||||
await expect(prepostInputs.nth(3)).toHaveValue("3.5");
|
||||
await page.getByRole("button", { name: "점수 저장" }).click();
|
||||
|
||||
await expect(page.getByText("2/3 쌍")).toBeVisible();
|
||||
await expect(page.locator(".sr-prepost__actions")).toContainText("저장된 값 기준");
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue