Files
aza/AzA march 2026/_test_task_editor_empfang.py
2026-06-13 22:47:31 +02:00

119 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
"""Tests: Aufgaben-Editor Diktat/Antwort/Zuweisung (Backend + empfang.html-Invarianten)."""
from __future__ import annotations
import re
import unittest
from pathlib import Path
from unittest.mock import patch
ROOT = Path(__file__).resolve().parent
class TaskAssigneeBackendTests(unittest.TestCase):
def test_assignee_user_id_resolves_display_name(self):
from empfang_routes import _apply_task_assignee_from_body
target = {"assignee": "", "assignee_user_id": ""}
users = [
{
"user_id": "u_test_1",
"display_name": "André M. Surovy",
"role": "arzt",
"login_name": "ams",
"email": "",
"has_password_hash": True,
"specialty": "",
"title": "",
}
]
with patch("empfang_routes._practice_users", return_value=users):
_apply_task_assignee_from_body(
target, {"assignee_user_id": "u_test_1"}, "prac_test"
)
self.assertEqual(target["assignee_user_id"], "u_test_1")
self.assertEqual(target["assignee"], "André M. Surovy")
def test_unknown_assignee_user_id_raises(self):
from empfang_routes import _apply_task_assignee_from_body
from fastapi import HTTPException
target = {"assignee": "Alt", "assignee_user_id": "u_old"}
with patch("empfang_routes._practice_users", return_value=[]):
with self.assertRaises(HTTPException) as ctx:
_apply_task_assignee_from_body(
target, {"assignee_user_id": "u_unknown"}, "prac_test"
)
self.assertEqual(ctx.exception.status_code, 400)
def test_legacy_assignee_name_resolves_user_id_on_create(self):
from empfang_routes import _apply_task_assignee_from_body
target = {"assignee": "", "assignee_user_id": ""}
users = [
{
"user_id": "u_z",
"display_name": "Zeno",
"role": "",
"login_name": "zeno",
"email": "",
"has_password_hash": True,
"specialty": "",
"title": "",
}
]
with patch("empfang_routes._practice_users", return_value=users):
_apply_task_assignee_from_body(
target,
{"assignee": "Zeno"},
"prac_test",
allow_legacy_name=True,
)
self.assertEqual(target["assignee_user_id"], "u_z")
self.assertEqual(target["assignee"], "Zeno")
class EmpfangHtmlInvariantTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.html = (ROOT / "web" / "empfang.html").read_text(encoding="utf-8")
def test_no_assign_prompt(self):
self.assertNotIn("prompt('Zuweisen an", self.html)
self.assertNotIn('prompt("Zuweisen an', self.html)
def test_task_editor_buttons_present(self):
self.assertIn('id="task-editor-dictate-btn"', self.html)
self.assertIn('onclick="taskEditorAppendReply()"', self.html)
self.assertIn('onclick="taskEditorReassign()"', self.html)
self.assertIn('id="task-editor-reply"', self.html)
def test_assignee_picker_modal(self):
self.assertIn('id="task-assignee-picker-overlay"', self.html)
self.assertIn("openTaskAssigneePicker", self.html)
self.assertIn("assignee_user_id", self.html)
def test_reply_format_helper(self):
self.assertIn("formatTaskReplyBlock", self.html)
self.assertIn("': '", self.html)
self.assertIn("_taskReplyInFlight", self.html)
self.assertIn("formatTaskReplyTimestamp", self.html)
def test_dictation_finalize_before_close(self):
self.assertIn("stopAndFinalizeTaskEditorDictation", self.html)
self.assertIn("fetchTranscribeDictationBlob", self.html)
class EmpfangHtmlJsSyntaxTests(unittest.TestCase):
def test_inline_script_brace_balance(self):
html = (ROOT / "web" / "empfang.html").read_text(encoding="utf-8")
scripts = re.findall(r"<script(?:[^>]*)>([\s\S]*?)</script>", html, flags=re.I)
self.assertTrue(scripts, "Kein inline script gefunden")
combined = "\n".join(scripts)
self.assertEqual(combined.count("{"), combined.count("}"))
self.assertNotIn("function function", combined)
if __name__ == "__main__":
unittest.main()