import contextlib import io import tempfile import unittest from pathlib import Path from unittest.mock import patch import pandas as pd from PIL import Image from copienator.commands import add_final_score class AddFinalScoreTests(unittest.TestCase): def test_creates_complete_student_directory(self): with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) source = root / "A Rendre" / "Student (01)" answers = source / "answers" answers.mkdir(parents=True) Image.new("RGB", (300, 200), "white").save(source / "Student.jpg") (source / "Student.pdf").write_bytes(b"pdf") (source / "score.json").write_bytes(b'{"Ex 1": "4"}') (source / "info.json").write_bytes(b'{"Ex 1": {}}') (answers / "Ex 1.jpg").write_bytes(b"answer") output = root / "output" output.mkdir() (output / "Student.jpg").write_bytes(b"legacy jpeg") (output / "Student.pdf").write_bytes(b"legacy pdf") stale_answers = output / "Student" / "answers" stale_answers.mkdir(parents=True) (stale_answers / "001 - Ex 1.jpg").write_bytes(b"stale") scores = pd.DataFrame({0: ["Student"], 1: [12.39]}) histogram = root / "histogramme.pdf" histogram.write_bytes(b"histogram") with patch.object(add_final_score.pd, "read_excel", return_value=scores), \ patch.object(add_final_score, "HISTOGRAM_PATH", histogram), \ contextlib.redirect_stdout(io.StringIO()): add_final_score.process_images(root, output) student = output / "Student" self.assertEqual( {path.name for path in student.iterdir()}, {"Student.jpg", "Student.pdf", "score.json", "info.json", "answers"}, ) self.assertEqual((student / "Student.pdf").read_bytes(), b"pdf") self.assertEqual((student / "score.json").read_bytes(), b'{"Ex 1": "4"}') self.assertEqual((student / "info.json").read_bytes(), b'{"Ex 1": {}}') self.assertEqual( (student / "answers" / "Ex 1.jpg").read_bytes(), b"answer" ) self.assertFalse((output / "Student.jpg").exists()) self.assertFalse((output / "Student.pdf").exists()) self.assertFalse((student / "answers" / "001 - Ex 1.jpg").exists()) self.assertEqual((output / "histogramme.pdf").read_bytes(), b"histogram") def test_omits_answers_directory_when_it_was_not_generated(self): with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) source = root / "A Rendre" / "Student (01)" source.mkdir(parents=True) Image.new("RGB", (300, 200), "white").save(source / "Student.jpg") (source / "Student.pdf").write_bytes(b"pdf") (source / "score.json").write_text("{}") (source / "info.json").write_text("{}") output = root / "output" scores = pd.DataFrame({0: ["Student"], 1: [10]}) with patch.object(add_final_score.pd, "read_excel", return_value=scores), \ contextlib.redirect_stdout(io.StringIO()): add_final_score.process_images(root, output) self.assertFalse((output / "Student" / "answers").exists()) def test_missing_histogram_warns_without_discarding_student_outputs(self): with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) source = root / "A Rendre" / "Student (01)" source.mkdir(parents=True) Image.new("RGB", (300, 200), "white").save(source / "Student.jpg") scores = pd.DataFrame({0: ["Student"], 1: [10]}) output = root / "output" messages = io.StringIO() with patch.object( add_final_score.pd, "read_excel", return_value=scores ), patch.object( add_final_score, "HISTOGRAM_PATH", root / "missing.pdf" ), contextlib.redirect_stdout(messages): add_final_score.process_images(root, output) self.assertTrue((output / "Student" / "Student.jpg").is_file()) self.assertFalse((output / "histogramme.pdf").exists()) self.assertIn("Missing histogram", messages.getvalue()) if __name__ == "__main__": unittest.main()