from __future__ import annotations import json import os import tempfile import unittest from pathlib import Path TMP = tempfile.TemporaryDirectory() os.environ["ASR_STATE_DIR"] = str(Path(TMP.name) / "state") os.environ["ASR_VAULT"] = str(Path(TMP.name) / "vault") os.environ["ASR_RECORDINGS_ROOT"] = str(Path(TMP.name) / "recordings") from asrpipe import control_web, review, segment # noqa: E402 class ControlWebTests(unittest.TestCase): def setUp(self): self.db_dir = Path(TMP.name) / "control-state" self.db_dir.mkdir(parents=True, exist_ok=True) control_web.DB = self.db_dir / "intake.db" def test_job_state_is_persistent(self): con = control_web._connect() now = 100.0 con.execute( "INSERT INTO intake_job(id,original_name,stored_name,title,context,size," "status,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?)", ("j1", "call.mp3", "stored.mp3", "项目通话", "背景", 123, "queued", now, now)) con.commit() con.close() self.assertTrue(control_web.update_job( "j1", "transcribing", "正在转写")) job = control_web._jobs(1)[0] self.assertEqual(job["status"], "transcribing") self.assertEqual(job["detail"], "正在转写") def test_schema_migrates_task_review_fields(self): con = control_web._connect() columns = {row["name"] for row in con.execute( "PRAGMA table_info(intake_job)")} con.close() self.assertIn("draft", columns) self.assertIn("result", columns) def test_review_queue_is_scoped_to_one_job(self): con = control_web._connect() now = 200.0 con.execute( "INSERT INTO intake_job(id,original_name,stored_name,title,context,size," "status,detail,transcript,created_at,updated_at,draft,result) " "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)", ("job-scope", "scope.wav", "scope.wav", "范围测试", "", 10, "review", "", "/archive/scope.txt", now, now, "/draft/scope.md", "")) con.commit() con.close() own = review.enqueue("/archive/scope.txt", "本任务问题?", { "kind": "draft_question"}) review.enqueue("/archive/other.txt", "其他任务问题?", { "kind": "draft_question"}) job = control_web._job("job-scope") rows = control_web._pending_for_job(job) self.assertEqual([row["id"] for row in rows], [own]) self.assertTrue(control_web._review_url("job-scope").endswith( "/jobs/job-scope/review/")) def test_intake_metadata_is_not_transcript_body(self): metadata = { "job_id": "abc", "title": "项目通话", "context": "参与人是张三和李四", } raw = ( "\n" "\n" "# 转写(Qwen3-ASR 1.7B + CAM++ 分角色 + 声纹)\n\n" "【speaker_0】测试正文。\n") turns, meta = segment.parse(raw) self.assertEqual(meta["intake"], metadata) self.assertEqual(turns[0].text, "测试正文。") self.assertNotIn("参与人", turns[0].text) if __name__ == "__main__": unittest.main()