"""Tests for import job repository: create, get, list, claim FIFO, cancel, failed items.""" import pytest from backend.models import JOB_STATUS_QUEUED, JOB_STATUS_RUNNING from backend.repositories import import_job_repo as repo def test_create_job(db_session): items = [ {"filename": "a.xlsx", "stored_path": "/up/1/a.xlsx"}, {"filename": "b.xlsx", "stored_path": "/up/1/b.xlsx"}, ] job = repo.create_job(db_session, "excel", items) assert job.id is not None assert job.status == JOB_STATUS_QUEUED assert job.method == "excel" assert job.total == 2 assert job.processed == 0 assert len(job.items) == 2 assert job.items[0].filename == "a.xlsx" and job.items[0].seq == 1 assert job.items[1].filename == "b.xlsx" and job.items[1].seq == 2 def test_get_job(db_session): job = repo.create_job(db_session, "ai", [{"filename": "f.pdf", "stored_path": "/f.pdf"}]) loaded = repo.get_job(db_session, job.id) assert loaded is not None assert loaded.id == job.id assert len(loaded.items) == 1 assert repo.get_job(db_session, 99999) is None def test_list_jobs(db_session): repo.create_job(db_session, "excel", [{"filename": "a", "stored_path": "/a"}]) repo.create_job(db_session, "excel", [{"filename": "b", "stored_path": "/b"}]) all_jobs = repo.list_jobs(db_session, limit=10) assert len(all_jobs) >= 2 statuses = repo.list_jobs(db_session, statuses=[JOB_STATUS_QUEUED], limit=10) assert all(j.status == JOB_STATUS_QUEUED for j in statuses) def test_claim_oldest_queued_fifo(db_session): j1 = repo.create_job(db_session, "excel", [{"filename": "a", "stored_path": "/a"}]) j2 = repo.create_job(db_session, "excel", [{"filename": "b", "stored_path": "/b"}]) claimed = repo.claim_oldest_queued(db_session) assert claimed is not None assert claimed.id == j1.id assert claimed.status == JOB_STATUS_RUNNING second = repo.claim_oldest_queued(db_session) assert second is not None assert second.id == j2.id assert repo.claim_oldest_queued(db_session) is None def test_cancel_job(db_session): job = repo.create_job(db_session, "excel", [{"filename": "a", "stored_path": "/a"}]) cancelled = repo.cancel_job(db_session, job.id) assert cancelled is not None assert cancelled.status == "cancelled" loaded = repo.get_job(db_session, job.id) assert loaded.status == "cancelled" assert repo.cancel_job(db_session, job.id) is None # already cancelled def test_get_failed_items(db_session): job = repo.create_job( db_session, "excel", [ {"filename": "a", "stored_path": "/a"}, {"filename": "b", "stored_path": "/b"}, ], ) failed = repo.get_failed_items(db_session, job.id) assert len(failed) == 0 job.items[0].status = "failed" job.items[0].error = "err" db_session.commit() failed = repo.get_failed_items(db_session, job.id) assert len(failed) == 1 assert failed[0].filename == "a"