Files
Copies/tests/test_add_final_score.py
T

100 lines
4.4 KiB
Python

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()