개선관리 요구사항과 Google 로그인을 완료

This commit is contained in:
Yun Chan 2026-08-28 16:07:09 +09:00
parent cc0a15b7c6
commit 2a39636163
112 changed files with 10166 additions and 527 deletions

View file

@ -22,6 +22,7 @@
import { expect, test, type Page, type Route } from "@playwright/test";
import {
FILLED_REVIEW_SESSION_ID,
FILLED_REVIEW_TURN_IDS,
routeFilledSessionReview,
routePrepostMeasures,
} from "./session-review-fixture";
@ -297,7 +298,7 @@ function revealedMeasurements() {
: "목표와 과업을 함께 확인한 발화를 근거로 판단했습니다.",
evidence: [
{
turn_id: "t6",
turn_id: FILLED_REVIEW_TURN_IDS[5],
seq: 6,
speaker: "client",
text: "적어도 제가 화난 게 이상한 건 아니라는 말은 좀 기억에 남아요.",
@ -504,6 +505,44 @@ test.describe("UC 치료 동맹 펄스 — 회기 중 자기점검(mid)", () =>
// ── post: 리뷰에서 잠금·공개·수정 불가 ─────────────────────────────
test.describe("UC 치료 동맹 펄스 — 리뷰(post)", () => {
test("근거 장면은 화면용 t번호가 아니라 영속 UUID로 잠근다", async ({ page }) => {
await routeReviewPage(page);
let submittedBody: Record<string, unknown> | null = null;
await page.route(
`**/api/sessions/${FILLED_REVIEW_SESSION_ID}/alliance-pulses`,
async (route) => {
if (route.request().method() === "POST") {
submittedBody = route.request().postDataJSON() as Record<string, unknown>;
await fulfillJson(
route,
{ pulse_id: "pulse-post-uuid", status: "awaiting_agents" },
202,
);
return;
}
await fulfillJson(route, { items: [] });
},
);
await page.goto(`/learn/session/${FILLED_REVIEW_SESSION_ID}/review`);
await pickReviewScore(page, "목표 합의 평가", "4 대체로 그렇다");
await pickReviewScore(page, "과업 합의 평가", "3 보통이다");
await pickReviewScore(page, "정서적 유대 평가", "5 매우 그렇다");
await page.getByText("내 판단의 근거 장면 선택").click();
await page.getByRole("checkbox").first().check();
await page.getByRole("button", { name: "내 판단 잠그고 관점 비교" }).click();
await expect.poll(() => submittedBody).not.toBeNull();
expect(submittedBody).toEqual({
checkpoint: "post",
scores: { goal: 0.75, task: 0.5, bond: 1 },
evidence_turn_ids: [FILLED_REVIEW_TURN_IDS[0]],
});
expect(FILLED_REVIEW_TURN_IDS[0]).toMatch(
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
);
});
// usecase: 리뷰에서 근거 장면 없이 세 축만 고른 학습자는 post 판단을 잠글 수 없다
test("리뷰에서 근거 장면 없이 세 축만 고르면 post 판단을 잠글 수 없다", async ({
page,