diff --git a/app/queue.py b/app/queue.py new file mode 100644 index 0000000..65e33c6 --- /dev/null +++ b/app/queue.py @@ -0,0 +1,15 @@ +import asyncio + + +class JobQueue: + def __init__(self) -> None: + self._queue: asyncio.Queue[str] = asyncio.Queue() + + async def enqueue(self, job_id: str) -> None: + await self._queue.put(job_id) + + async def dequeue(self) -> str: + return await self._queue.get() + + def size(self) -> int: + return self._queue.qsize() diff --git a/requirements.txt b/requirements.txt index 1c8b01d..00c394f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ fastapi==0.123.0 uvicorn[standard]==0.38.0 pydantic==2.12.5 pytest==8.3.0 +pytest-asyncio==0.24.0 httpx==0.28.1 diff --git a/tests/test_queue.py b/tests/test_queue.py new file mode 100644 index 0000000..77e283b --- /dev/null +++ b/tests/test_queue.py @@ -0,0 +1,40 @@ +import pytest +import asyncio + +from app.queue import JobQueue + + +@pytest.mark.asyncio +async def test_enqueue_and_dequeue(): + queue = JobQueue() + + await queue.enqueue("job_123") + job_id = await queue.dequeue() + + assert job_id == "job_123" + + +@pytest.mark.asyncio +async def test_queue_ordering(): + queue = JobQueue() + + await queue.enqueue("job_1") + await queue.enqueue("job_2") + await queue.enqueue("job_3") + + assert await queue.dequeue() == "job_1" + assert await queue.dequeue() == "job_2" + assert await queue.dequeue() == "job_3" + + +@pytest.mark.asyncio +async def test_queue_size(): + queue = JobQueue() + + assert queue.size() == 0 + await queue.enqueue("job_1") + assert queue.size() == 1 + await queue.enqueue("job_2") + assert queue.size() == 2 + await queue.dequeue() + assert queue.size() == 1