32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
from time import monotonic, sleep
|
|
|
|
from app.services import pdf_pregeneration
|
|
|
|
|
|
def test_pdf_pregeneration_job_deduplicates_and_tracks_progress(monkeypatch):
|
|
calls: list[tuple[int, int]] = []
|
|
|
|
def fake_pre_generate_certificate_pdf(certificate_id: int, concurrency_limit: int) -> str:
|
|
calls.append((certificate_id, concurrency_limit))
|
|
return {101: "generated", 102: "cached", 103: "skipped"}[certificate_id]
|
|
|
|
monkeypatch.setattr(pdf_pregeneration, "pre_generate_certificate_pdf", fake_pre_generate_certificate_pdf)
|
|
|
|
manager = pdf_pregeneration.PdfPregenerationManager()
|
|
job = manager.start([101, 102, 102, 103], concurrency_limit=2)
|
|
|
|
deadline = monotonic() + 2
|
|
while job.status == "running" and monotonic() < deadline:
|
|
sleep(0.01)
|
|
|
|
assert job.status == "completed"
|
|
assert job.total == 3
|
|
assert job.completed == 3
|
|
assert job.generated == 1
|
|
assert job.cached == 1
|
|
assert job.skipped == 1
|
|
assert job.failed == 0
|
|
assert sorted(certificate_id for certificate_id, _ in calls) == [101, 102, 103]
|
|
assert {limit for _, limit in calls} == {2}
|
|
assert job.to_dict()["percent"] == 100
|