import pytest from httpx import AsyncClient from jb.models.hit import Hit from jb.models.assignment import AssignmentStub from jb.managers.assignment import AssignmentManager class TestWork: @pytest.mark.anyio async def test_work( self, httpxclient: AsyncClient, hit_record: Hit, amt_assignment_id: str, amt_worker_id: str, ): client = httpxclient assert isinstance(hit_record.id, int) params = { "workerId": amt_worker_id, "assignmentId": amt_assignment_id, "hitId": hit_record.amt_hit_id, } res = await client.get("/work/", params=params) assert res.status_code == 200 @pytest.mark.anyio async def test_work_no_hit_record( self, httpxclient: AsyncClient, hit: Hit, amt_assignment_id: str, amt_worker_id: str, ): client = httpxclient # Because no AssignmentStub record is created, and we're just using # random strings as IDs, we should also confirm that the Hit record # is not a saved record. assert hit.id is None params = { "workerId": amt_worker_id, "assignmentId": amt_assignment_id, "hitId": hit.amt_hit_id, } res = await client.get("/work/", params=params) assert res.status_code == 500 @pytest.mark.anyio async def test_work_assignment_stub_existing( self, httpxclient: AsyncClient, am: AssignmentManager, hit: Hit, assignment_stub_record: AssignmentStub, amt_assignment_id: str, amt_worker_id: str, ): client = httpxclient # Because the AssignmentStub is created with a reference to the Hit, # the Hit is actually a "Hit Record" (with a primary key), so it's # saved in the database assert isinstance(hit.id, int) # Confirm that it exists in the database before the call res = am.get_stub_if_exists(amt_assignment_id=amt_assignment_id) assert isinstance(res, AssignmentStub) assert isinstance(res.id, int) params = { "workerId": amt_worker_id, "assignmentId": assignment_stub_record.amt_assignment_id, "hitId": hit.amt_hit_id, } res = await client.get("/work/", params=params) assert res.status_code == 200 # Confirm that it exists in the database res = am.get_stub_if_exists(amt_assignment_id=amt_assignment_id) assert isinstance(res, AssignmentStub) assert isinstance(res.id, int) @pytest.mark.anyio async def test_work_assignment_stub_created( self, httpxclient: AsyncClient, am: AssignmentManager, hit_record: Hit, assignment_stub: AssignmentStub, amt_assignment_id: str, amt_worker_id: str, ): client = httpxclient # Confirm that it exists in the database before the call res = am.get_stub_if_exists(amt_assignment_id=amt_assignment_id) assert res is None params = { "workerId": amt_worker_id, "assignmentId": assignment_stub.amt_assignment_id, "hitId": hit_record.amt_hit_id, } res = await client.get("/work/", params=params) assert res.status_code == 200 # Confirm that it exists in the database res = am.get_stub_if_exists(amt_assignment_id=amt_assignment_id) assert isinstance(res, AssignmentStub) assert isinstance(res.id, int)