87 lines
3.3 KiB
Python
87 lines
3.3 KiB
Python
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 = (
|
|
"<!-- intake: " + json.dumps(metadata, ensure_ascii=False) + " -->\n"
|
|
"<!-- voiceprint_session: sess clusters: 1 -->\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()
|