Files
benevoles/backend/tests/test_position_sheets_pdf.py
T
AdamThomasandClaude Sonnet 5 f6fbfaf82a Feuilles de poste : ajouter la photo des bénévoles affectés
Vignette carrée (14 mm, proportions préservées) à côté du nom de chaque
bénévole affecté, à côté de son téléphone — case vide si le bénévole n'a
pas de photo. Complète l'affichage déjà en place sur l'écran référent et
l'écran bénévole (étape 22).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 20:06:51 +02:00

121 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Génération des feuilles de poste (module pur, sans base)."""
import base64
import datetime as dt
from app.sheets.pdf import (
PositionDaySheet,
SheetShift,
SheetVolunteer,
generate_position_sheets_pdf,
)
# PNG 1×1 valide (transparent), le plus petit possible.
_PNG = base64.b64decode(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY"
"42YAAAAASUVORK5CYII="
)
def _sheet(volunteers=(), min_staff=1, ideal_staff=2) -> PositionDaySheet:
return PositionDaySheet(
position_name="Bar central",
position_location="Chapiteau",
date=dt.date(2026, 7, 10),
shifts=(
SheetShift(
starts_at=dt.datetime(2026, 7, 10, 19, 0),
ends_at=dt.datetime(2026, 7, 10, 22, 0),
min_staff=min_staff,
ideal_staff=ideal_staff,
volunteers=volunteers,
),
),
)
def test_shift_is_understaffed_when_below_min_staff():
fully_staffed = _sheet(
volunteers=(SheetVolunteer(name="Alex Martin", phone="0600000000"),),
min_staff=1,
)
assert fully_staffed.shifts[0].understaffed is False
understaffed = _sheet(volunteers=(), min_staff=1)
assert understaffed.shifts[0].understaffed is True
def test_generates_a_valid_pdf_with_volunteers():
sheet = _sheet(
volunteers=(
SheetVolunteer(name="Alex Martin", phone="0600000000"),
SheetVolunteer(name="Sam Nuit", phone=None),
)
)
pdf = generate_position_sheets_pdf([sheet])
assert pdf.startswith(b"%PDF")
assert pdf.rstrip().endswith(b"%%EOF")
def test_generates_a_valid_pdf_with_no_volunteers_assigned():
pdf = generate_position_sheets_pdf([_sheet(volunteers=())])
assert pdf.startswith(b"%PDF")
def test_generates_a_valid_pdf_with_no_shifts_that_day():
sheet = PositionDaySheet(
position_name="Bar central", position_location=None,
date=dt.date(2026, 7, 10), shifts=(),
)
pdf = generate_position_sheets_pdf([sheet])
assert pdf.startswith(b"%PDF")
def test_multiple_sheets_produce_a_larger_pdf():
one = generate_position_sheets_pdf([_sheet()])
two = generate_position_sheets_pdf([_sheet(), _sheet()])
assert len(two) > len(one)
def test_generates_a_valid_pdf_with_a_referent():
sheet = PositionDaySheet(
position_name="Bar central", position_location="Chapiteau",
date=dt.date(2026, 7, 10), shifts=(),
referent_name="Sam Nuit", referent_phone="0600000000",
)
pdf = generate_position_sheets_pdf([sheet])
assert pdf.startswith(b"%PDF")
def test_generates_a_valid_pdf_without_a_referent():
sheet = PositionDaySheet(
position_name="Bar central", position_location="Chapiteau",
date=dt.date(2026, 7, 10), shifts=(),
)
assert sheet.referent_name is None
pdf = generate_position_sheets_pdf([sheet])
assert pdf.startswith(b"%PDF")
def test_generates_a_valid_pdf_with_volunteer_photos():
sheet = _sheet(
volunteers=(
SheetVolunteer(name="Alex Martin", phone="0600000000", photo=_PNG),
SheetVolunteer(name="Sam Nuit", phone=None, photo=None),
)
)
assert sheet.shifts[0].volunteers[0].photo == _PNG
assert sheet.shifts[0].volunteers[1].photo is None
pdf = generate_position_sheets_pdf([sheet])
assert pdf.startswith(b"%PDF")
def test_a_volunteer_photo_makes_the_pdf_larger():
without_photo = generate_position_sheets_pdf(
[_sheet(volunteers=(SheetVolunteer(name="Alex Martin", phone=None, photo=None),))]
)
with_photo = generate_position_sheets_pdf(
[_sheet(volunteers=(SheetVolunteer(name="Alex Martin", phone=None, photo=_PNG),))]
)
assert len(with_photo) > len(without_photo)