Files
problem-bank/backend/tests/test_import_job_repo.py
2026-03-06 15:52:34 +08:00

83 lines
3.0 KiB
Python

"""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"