Skip to content

Commit d5c11c5

Browse files
committed
Fixes #14 - Add tests for activity
1 parent 804120c commit d5c11c5

File tree

3 files changed

+205
-0
lines changed

3 files changed

+205
-0
lines changed

tests/activities/__init__.py

Whitespace-only changes.
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
from faker import Faker
2+
from flask import json
3+
from flask.testing import FlaskClient
4+
from pytest_mock import MockFixture
5+
6+
7+
fake = Faker()
8+
9+
valid_activity_data = {
10+
"name": fake.company(),
11+
"description": fake.paragraph()
12+
}
13+
14+
fake_activity = ({
15+
"id": fake.random_int(1, 9999)
16+
}).update(valid_activity_data)
17+
18+
19+
def test_create_activity_should_succeed_with_valid_request(client: FlaskClient, mocker: MockFixture):
20+
from time_tracker_api.activities.activities_namespace import activity_dao
21+
repository_create_mock = mocker.patch.object(activity_dao.repository,
22+
'create',
23+
return_value=fake_activity)
24+
25+
response = client.post("/activities", json=valid_activity_data, follow_redirects=True)
26+
27+
assert 201 == response.status_code
28+
repository_create_mock.assert_called_once_with(valid_activity_data)
29+
30+
31+
def test_create_activity_should_reject_bad_request(client: FlaskClient, mocker: MockFixture):
32+
from time_tracker_api.activities.activities_namespace import activity_dao
33+
invalid_activity_data = valid_activity_data.copy().update({
34+
"invalid_field": 123,
35+
})
36+
repository_create_mock = mocker.patch.object(activity_dao.repository,
37+
'create',
38+
return_value=fake_activity)
39+
40+
response = client.post("/activities", json=invalid_activity_data, follow_redirects=True)
41+
42+
assert 400 == response.status_code
43+
repository_create_mock.assert_not_called()
44+
45+
46+
def test_list_all_activities(client: FlaskClient, mocker: MockFixture):
47+
from time_tracker_api.activities.activities_namespace import activity_dao
48+
repository_find_all_mock = mocker.patch.object(activity_dao.repository,
49+
'find_all',
50+
return_value=[])
51+
52+
response = client.get("/activities", follow_redirects=True)
53+
54+
assert 200 == response.status_code
55+
json_data = json.loads(response.data)
56+
assert [] == json_data
57+
repository_find_all_mock.assert_called_once()
58+
59+
#HEY
60+
def test_get_activity_should_succeed_with_valid_id(client: FlaskClient, mocker: MockFixture):
61+
from time_tracker_api.activities.activities_namespace import activity_dao
62+
63+
valid_id = fake.random_int(1, 9999)
64+
65+
repository_find_mock = mocker.patch.object(activity_dao.repository,
66+
'find',
67+
return_value=fake_activity)
68+
69+
response = client.get("/activities/%s" % valid_id, follow_redirects=True)
70+
71+
assert 200 == response.status_code
72+
fake_activity == json.loads(response.data)
73+
repository_find_mock.assert_called_once_with(str(valid_id))
74+
75+
76+
def test_get_activity_should_return_not_found_with_invalid_id(client: FlaskClient, mocker: MockFixture):
77+
from time_tracker_api.activities.activities_namespace import activity_dao
78+
from werkzeug.exceptions import NotFound
79+
80+
invalid_id = fake.random_int(1, 9999)
81+
82+
repository_find_mock = mocker.patch.object(activity_dao.repository,
83+
'find',
84+
side_effect=NotFound)
85+
86+
response = client.get("/activities/%s" % invalid_id, follow_redirects=True)
87+
88+
assert 404 == response.status_code
89+
repository_find_mock.assert_called_once_with(str(invalid_id))
90+
91+
92+
def test_get_activity_should_return_422_for_invalid_id_format(client: FlaskClient, mocker: MockFixture):
93+
from time_tracker_api.activities.activities_namespace import activity_dao
94+
from werkzeug.exceptions import UnprocessableEntity
95+
96+
invalid_id = fake.company()
97+
98+
repository_find_mock = mocker.patch.object(activity_dao.repository,
99+
'find',
100+
side_effect=UnprocessableEntity)
101+
102+
response = client.get("/activities/%s" % invalid_id, follow_redirects=True)
103+
104+
assert 422 == response.status_code
105+
repository_find_mock.assert_called_once_with(str(invalid_id))
106+
107+
108+
def test_update_activity_should_succeed_with_valid_data(client: FlaskClient, mocker: MockFixture):
109+
from time_tracker_api.activities.activities_namespace import activity_dao
110+
111+
repository_update_mock = mocker.patch.object(activity_dao.repository,
112+
'update',
113+
return_value=fake_activity)
114+
115+
valid_id = fake.random_int(1, 9999)
116+
response = client.put("/activities/%s" % valid_id, json=valid_activity_data, follow_redirects=True)
117+
118+
assert 200 == response.status_code
119+
fake_activity == json.loads(response.data)
120+
repository_update_mock.assert_called_once_with(str(valid_id), valid_activity_data)
121+
122+
123+
def test_update_activity_should_reject_bad_request(client: FlaskClient, mocker: MockFixture):
124+
from time_tracker_api.activities.activities_namespace import activity_dao
125+
invalid_activity_data = valid_activity_data.copy().update({
126+
"invalid_field": 123,
127+
})
128+
repository_update_mock = mocker.patch.object(activity_dao.repository,
129+
'update',
130+
return_value=fake_activity)
131+
132+
valid_id = fake.random_int(1, 9999)
133+
response = client.put("/activities/%s" % valid_id, json=invalid_activity_data, follow_redirects=True)
134+
135+
assert 400 == response.status_code
136+
repository_update_mock.assert_not_called()
137+
138+
139+
def test_update_activity_should_return_not_found_with_invalid_id(client: FlaskClient, mocker: MockFixture):
140+
from time_tracker_api.activities.activities_namespace import activity_dao
141+
from werkzeug.exceptions import NotFound
142+
143+
invalid_id = fake.random_int(1, 9999)
144+
145+
repository_update_mock = mocker.patch.object(activity_dao.repository,
146+
'update',
147+
side_effect=NotFound)
148+
149+
response = client.put("/activities/%s" % invalid_id,
150+
json=valid_activity_data,
151+
follow_redirects=True)
152+
153+
assert 404 == response.status_code
154+
repository_update_mock.assert_called_once_with(str(invalid_id), valid_activity_data)
155+
156+
157+
def test_delete_activity_should_succeed_with_valid_id(client: FlaskClient, mocker: MockFixture):
158+
from time_tracker_api.activities.activities_namespace import activity_dao
159+
160+
valid_id = fake.random_int(1, 9999)
161+
162+
repository_remove_mock = mocker.patch.object(activity_dao.repository,
163+
'remove',
164+
return_value=None)
165+
166+
response = client.delete("/activities/%s" % valid_id, follow_redirects=True)
167+
168+
assert 204 == response.status_code
169+
assert b'' == response.data
170+
repository_remove_mock.assert_called_once_with(str(valid_id))
171+
172+
173+
def test_delete_activity_should_return_not_found_with_invalid_id(client: FlaskClient, mocker: MockFixture):
174+
from time_tracker_api.activities.activities_namespace import activity_dao
175+
from werkzeug.exceptions import NotFound
176+
177+
invalid_id = fake.random_int(1, 9999)
178+
179+
repository_remove_mock = mocker.patch.object(activity_dao.repository,
180+
'remove',
181+
side_effect=NotFound)
182+
183+
response = client.delete("/activities/%s" % invalid_id, follow_redirects=True)
184+
185+
assert 404 == response.status_code
186+
repository_remove_mock.assert_called_once_with(str(invalid_id))
187+
188+
189+
def test_delete_activity_should_return_422_for_invalid_id_format(client: FlaskClient, mocker: MockFixture):
190+
from time_tracker_api.activities.activities_namespace import activity_dao
191+
from werkzeug.exceptions import UnprocessableEntity
192+
193+
invalid_id = fake.company()
194+
195+
repository_remove_mock = mocker.patch.object(activity_dao.repository,
196+
'remove',
197+
side_effect=UnprocessableEntity)
198+
199+
response = client.delete("/activities/%s" % invalid_id, follow_redirects=True)
200+
201+
assert 422 == response.status_code
202+
repository_remove_mock.assert_called_once_with(str(invalid_id))

time_tracker_api/activities/activities_namespace.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,22 @@ def post(self):
6767
@ns.param('id', 'The activity identifier')
6868
class Activity(Resource):
6969
@ns.doc('get_activity')
70+
@ns.response(422, 'The id has an invalid format')
7071
@ns.marshal_with(activity, code=200)
7172
def get(self, id):
7273
"""Get an activity"""
7374
return activity_dao.get(id)
7475

7576
@ns.doc('update_activity')
77+
@ns.response(422, 'The data has an invalid format.')
7678
@ns.expect(activity_input)
7779
@ns.marshal_with(activity)
7880
def put(self, id):
7981
"""Update an activity"""
8082
return activity_dao.update(id, ns.payload)
8183

8284
@ns.doc('delete_activity')
85+
@ns.response(422, 'The id has an invalid format')
8386
@ns.response(204, 'Activity deleted successfully')
8487
def delete(self, id):
8588
"""Delete an activity"""

0 commit comments

Comments
 (0)