aboutsummaryrefslogtreecommitdiff
path: root/tests/http/test_work.py
blob: 66251f64d4ae6c60e59e86b42b965322585ca1ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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)