From 2c2864b5662c8ba7cd19488646d50d14bb88ba46 Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 30 Nov 2025 15:15:30 -0500 Subject: [PATCH] feat: add in-memory job store --- app/store.py | 18 +++++++++++++++ requirements.txt | 1 + tests/test_store.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 app/store.py create mode 100644 tests/test_store.py diff --git a/app/store.py b/app/store.py new file mode 100644 index 0000000..ba6eb03 --- /dev/null +++ b/app/store.py @@ -0,0 +1,18 @@ +from app.models import Job, JobStatus + + +class JobStore: + def __init__(self) -> None: + self._jobs: dict[str, Job] = {} + + def add(self, job: Job) -> None: + self._jobs[job.id] = job + + def get(self, job_id: str) -> Job | None: + return self._jobs.get(job_id) + + def list_all(self) -> list[Job]: + return list(self._jobs.values()) + + def list_by_status(self, status: JobStatus) -> list[Job]: + return [job for job in self._jobs.values() if job.status == status] diff --git a/requirements.txt b/requirements.txt index b98e9b1..66d2dd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ fastapi==0.123.0 uvicorn[standard]==0.38.0 pydantic==2.12.5 +pytest==8.3.0 diff --git a/tests/test_store.py b/tests/test_store.py new file mode 100644 index 0000000..7f5b387 --- /dev/null +++ b/tests/test_store.py @@ -0,0 +1,56 @@ +import pytest + +from app.models import Job, JobStatus +from app.store import JobStore + + +def test_add_and_get_job(): + store = JobStore() + job = Job(command="-i input.mp4 output.mp4") + + store.add(job) + retrieved = store.get(job.id) + + assert retrieved is not None + assert retrieved.id == job.id + assert retrieved.command == job.command + + +def test_get_nonexistent_job(): + store = JobStore() + + result = store.get("nonexistent") + + assert result is None + + +def test_list_all_jobs(): + store = JobStore() + job1 = Job(command="-i a.mp4 b.mp4") + job2 = Job(command="-i c.mp4 d.mp4") + + store.add(job1) + store.add(job2) + jobs = store.list_all() + + assert len(jobs) == 2 + assert job1 in jobs + assert job2 in jobs + + +def test_list_jobs_by_status(): + store = JobStore() + job1 = Job(command="-i a.mp4 b.mp4") + job2 = Job(command="-i c.mp4 d.mp4") + job2.status = JobStatus.RUNNING + + store.add(job1) + store.add(job2) + + queued = store.list_by_status(JobStatus.QUEUED) + running = store.list_by_status(JobStatus.RUNNING) + + assert len(queued) == 1 + assert len(running) == 1 + assert queued[0].id == job1.id + assert running[0].id == job2.id