update: uploads
This commit is contained in:
1
backend/tests/__init__.py
Normal file
1
backend/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# Backend tests
|
||||
17
backend/tests/conftest.py
Normal file
17
backend/tests/conftest.py
Normal file
@@ -0,0 +1,17 @@
|
||||
import pytest
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from backend.database import Base
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def db_session():
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
Base.metadata.create_all(engine)
|
||||
Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||
session = Session()
|
||||
try:
|
||||
yield session
|
||||
finally:
|
||||
session.close()
|
||||
82
backend/tests/test_import_job_repo.py
Normal file
82
backend/tests/test_import_job_repo.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""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"
|
||||
Reference in New Issue
Block a user