Allow signaling issues in label verification

This commit is contained in:
sebastien committed 2026-10-11 21:05:27 +02:00
1 parent 3754c0c11a
commit 9925362352
21 files changed
+1347 -36

No files matched your search

+79
View File
@@ -0,0 +1,79 @@
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch
from PIL import Image
from copienator import atomic_write_json, read_json
from copienator.commands import annotating_by_label as grouped
from copienator.utils import natural_key
class GroupedNamingTests(unittest.TestCase):
def test_dsi_question_groups_have_short_unique_ordered_prefixes(self):
groups = [
["Ex 1", "Ex 2", "Ex 3"],
["Ex 4 : 1)", "Ex 4 : 2)"],
["I)1)", "I)2)"],
["I)3)", "I)4)"],
["I)5)", "I)6)", "I)7)"],
["I)8)", "I)9)"],
["I)10)", "I)11)", "I)12)"],
["I)13)"],
["I)14)", "I)15)", "I)16)"],
["II)1)", "II)2)"],
["II)3)a)", "II)3)b)"],
["II)4)", "II)5)", "II)6)", "II)7)"],
["II)8)", "II)9)"],
["II)10)"],
]
named = grouped._unique_prefixes(groups)
prefixes = [prefix for prefix, _labels in named]
self.assertEqual(len(prefixes), len(set(prefixes)))
self.assertEqual(prefixes, sorted(prefixes, key=natural_key))
self.assertEqual(prefixes, [
"Ex", "Ex-2", "I)", "I)-2", "I)-3", "I)-4", "I)-5",
"I)-6", "I)-7", "II)", "II)-2", "II)-3", "II)-4", "II)-5",
])
self.assertEqual([labels for _prefix, labels in named], groups)
def test_resume_preserves_legacy_names_and_appends_only_missing_answers(self):
with tempfile.TemporaryDirectory() as temporary:
output = Path(temporary)
# The old naming bug put distinct question groups under I)-2.
for number, label in enumerate(["I)3)", "I)10)", "II)1)"], start=1):
folder = output / f"I)-2 G{number}"
folder.mkdir()
atomic_write_json(folder / "bnote.json", {
"images": [{"id": "01", "label": label}],
})
(folder / "Concat.pdf").write_bytes(b"reviewed PDF")
before = {p: p.read_bytes() for p in output.rglob("*") if p.is_file()}
groups = [["I)1)", "I)2)"], ["I)3)", "I)4)"],
["I)10)", "I)11)"], ["II)1)", "II)2)"]]
data = {"01": {label: {} for label in ["I)3)", "I)10)", "II)1)"]}}
with patch.object(grouped, "render_item") as render:
self.assertEqual(grouped._generate_groups(
output, data, groups, resume=True,
), (0, False))
render.assert_not_called()
self.assertEqual(before, {
p: p.read_bytes() for p in output.rglob("*") if p.is_file()
})
data["02"] = {"I)3)": {}}
with patch.object(grouped, "render_item", return_value=(
"02", "I)3)", Image.new("RGB", (100, 100), "white"), 0, [],
)) as render:
self.assertEqual(grouped._generate_groups(
output, data, groups, resume=True,
), (1, False))
render.assert_called_once_with(("02", "I)3)", {}))
self.assertEqual(read_json(output / "I)-2 G4/bnote.json")["images"][0]["id"], "02")
for path, content in before.items():
self.assertEqual(path.read_bytes(), content)
if __name__ == "__main__":
unittest.main()