83 lines
3.0 KiB
Python
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"
|