음성 재생과 운영 배포 정리

This commit is contained in:
Yun Chan 2026-06-28 12:18:20 +09:00
parent 8ed185ce6c
commit ac7db95542
1020 changed files with 46863 additions and 2175 deletions

View file

@ -258,6 +258,67 @@ class LearnerSessionIdorTest(unittest.IsolatedAsyncioTestCase):
)
self.assertNotIn("SECRET_EVALUATOR_ONLY_REVIEW", rendered)
async def test_teacher_can_read_session_review_but_not_save_learner_worksheet(self) -> None:
owner = _principal(
user_id="00000000-0000-0000-0000-000000000114",
)
teacher = _principal(
user_id="00000000-0000-0000-0000-000000000901",
role=Role.TEACHER,
)
sess = _session(
session_id="00000000-0000-0000-0000-00000000e114",
learner_id=owner.user_id,
)
sess.ended = True
sess.ended_at = 1_800_000_120.0
sess.turns.extend(
[
_turn(seq=1, speaker="counselor", text="teacher review visible learner turn"),
_turn(seq=2, speaker="client", text="teacher review visible client turn"),
]
)
with (
patch.object(
sessions.session_persistence,
"load_session",
AsyncMock(return_value=sess),
) as load_session,
patch.object(
sessions.session_persistence,
"load_session_evaluation",
AsyncMock(return_value=(None, False)),
),
patch.object(
sessions.session_persistence,
"load_case_worksheet",
AsyncMock(return_value=(None, False)),
),
):
response = await sessions.get_session_review(sess.session_id, teacher)
load_session.assert_awaited_once_with(
sess.session_id,
teacher,
allow_ended=True,
include_turn_evaluation=True,
)
self.assertEqual(response.session_id, sess.session_id)
self.assertEqual(
[turn.text for turn in response.turns],
["teacher review visible learner turn", "teacher review visible client turn"],
)
with self.assertRaises(HTTPException) as caught:
await sessions.save_session_review_worksheet(
sess.session_id,
sessions.ReviewCaseWorksheetSaveRequest(sections=[], limitations=[]),
teacher,
)
self.assertEqual(caught.exception.status_code, 403)
async def test_submit_turn_sends_only_client_visible_history_to_engine(self) -> None:
owner = _principal(
user_id="00000000-0000-0000-0000-000000000113",
@ -338,6 +399,11 @@ class LearnerSessionIdorTest(unittest.IsolatedAsyncioTestCase):
"list_sessions",
AsyncMock(return_value=([], False)),
),
patch.object(
sessions.session_persistence,
"list_session_archives",
AsyncMock(return_value=({}, False)),
),
patch.object(sessions, "require_runtime_fallback_allowed", return_value=None),
patch.object(sessions, "_review_ready", AsyncMock(return_value=False)),
):