import pytest from sqlmodel import Session, delete from app.domain import Job, Miner from app.models import JobCreate from app.services.jobs import JobService from app.storage.db import init_db, session_scope @pytest.fixture(scope="module", autouse=True) def _init_db(tmp_path_factory): db_file = tmp_path_factory.mktemp("data") / "test.db" # override settings dynamically from app.config import settings settings.database_url = f"sqlite:///{db_file}" init_db() yield @pytest.fixture() def session(): with session_scope() as sess: sess.exec(delete(Job)) sess.exec(delete(Miner)) sess.commit() yield sess def test_create_and_fetch_job(session: Session): svc = JobService(session) job = svc.create_job("client1", JobCreate(payload={"task": "noop"})) fetched = svc.get_job(job.id, client_id="client1") assert fetched.id == job.id assert fetched.payload["task"] == "noop" def test_acquire_next_job(session: Session): svc = JobService(session) job1 = svc.create_job("client1", JobCreate(payload={"n": 1})) job2 = svc.create_job("client1", JobCreate(payload={"n": 2})) miner = Miner(id="miner1", capabilities={}, concurrency=1) session.add(miner) session.commit() next_job = svc.acquire_next_job(miner) assert next_job is not None assert next_job.id == job1.id assert next_job.state == "RUNNING" next_job2 = svc.acquire_next_job(miner) assert next_job2 is not None assert next_job2.id == job2.id # No more jobs assert svc.acquire_next_job(miner) is None