Skip to content

Commit 55aa52a

Browse files
Add subcategory tests
1 parent 9adc854 commit 55aa52a

File tree

3 files changed

+256
-10
lines changed

3 files changed

+256
-10
lines changed

tests/conftest.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,15 @@ def _login(email, password):
3636
return client.post("/auth/login", json={"email": email, "password": password})
3737

3838
return _login
39+
40+
41+
@pytest.fixture
42+
def create_authenticated_headers(register_user, login_user):
43+
def _get_headers(email="[email protected]", password="testpassword"):
44+
register_user(email, password)
45+
resp = login_user(email, password)
46+
tokens = resp.get_json()
47+
from tests import utils
48+
return utils.get_auth_header(tokens["access_token"])
49+
50+
return _get_headers

tests/test_category.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,6 @@ def setup(self, client):
1313
with client.application.app_context():
1414
assert Category.query.count() == 0
1515

16-
@pytest.fixture
17-
def create_authenticated_headers(self, register_user, login_user):
18-
def _get_headers(email="[email protected]", password="testpassword"):
19-
register_user(email, password)
20-
resp = login_user(email, password)
21-
tokens = resp.get_json()
22-
return utils.get_auth_header(tokens["access_token"])
23-
24-
return _get_headers
25-
2616
@pytest.fixture
2717
def create_category(self, create_authenticated_headers):
2818
def _create(name, headers=None):

tests/test_subcategory.py

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
import pytest
2+
3+
from app.models import Subcategory
4+
from tests import utils
5+
6+
7+
class TestSubcategory:
8+
TEST_SUBCATEGORY_NAME = "Smartphones"
9+
10+
@pytest.fixture(autouse=True)
11+
def setup(self, client):
12+
self.client = client
13+
with client.application.app_context():
14+
assert Subcategory.query.count() == 0
15+
16+
@pytest.fixture
17+
def create_subcategory(self, create_authenticated_headers):
18+
def _create(name, categories=None, products=None, headers=None):
19+
if headers is None:
20+
headers = create_authenticated_headers()
21+
payload = {"name": name}
22+
if categories is not None:
23+
payload["categories"] = categories
24+
if products is not None:
25+
payload["products"] = products
26+
return self.client.post(
27+
"/subcategory/create", json=payload, headers=headers
28+
)
29+
return _create
30+
31+
def _count_subcategories(self):
32+
with self.client.application.app_context():
33+
return Subcategory.query.count()
34+
35+
def _verify_subcategory_in_db(self, name, should_exist=True):
36+
with self.client.application.app_context():
37+
subcategory = Subcategory.query.filter_by(name=name).first()
38+
if should_exist:
39+
assert subcategory is not None
40+
assert subcategory.name == name
41+
return subcategory
42+
else:
43+
assert subcategory is None
44+
45+
def test_create_subcategory(self, create_subcategory):
46+
response = create_subcategory(self.TEST_SUBCATEGORY_NAME)
47+
48+
assert response.status_code == 201
49+
data = response.get_json()
50+
assert data["name"] == self.TEST_SUBCATEGORY_NAME
51+
assert "id" in data
52+
self._verify_subcategory_in_db(self.TEST_SUBCATEGORY_NAME)
53+
54+
def test_create_subcategory_duplicate_name(self, create_subcategory):
55+
create_subcategory(self.TEST_SUBCATEGORY_NAME)
56+
response = create_subcategory(self.TEST_SUBCATEGORY_NAME)
57+
58+
assert response.status_code == 500
59+
assert self._count_subcategories() == 1
60+
self._verify_subcategory_in_db(self.TEST_SUBCATEGORY_NAME)
61+
62+
# TODO: Add tests for creation with categories and products when those fixtures/utilities are available
63+
64+
def test_get_subcategory_by_id(self, create_subcategory):
65+
response = create_subcategory("Laptops")
66+
data = response.get_json()
67+
sc_id = data["id"]
68+
get_resp = self.client.get(f"/subcategory/{sc_id}")
69+
70+
assert get_resp.status_code == 200
71+
data = get_resp.get_json()
72+
assert data["name"] == "Laptops"
73+
assert data["id"] == sc_id
74+
75+
def test_get_all_subcategories(self, create_subcategory):
76+
create_subcategory("A")
77+
create_subcategory("B")
78+
resp = self.client.get("/subcategories")
79+
80+
assert resp.status_code == 200
81+
data = resp.get_json()
82+
assert "subcategories" in data
83+
assert len(data["subcategories"]) == 2
84+
names = [sc["name"] for sc in data["subcategories"]]
85+
assert "A" in names
86+
assert "B" in names
87+
88+
def test_update_subcategory(self, create_authenticated_headers, create_subcategory):
89+
headers = create_authenticated_headers()
90+
response = create_subcategory("OldSubcat", headers=headers)
91+
data = response.get_json()
92+
sc_id = data["id"]
93+
update_resp = self.client.put(
94+
f"/subcategory/{sc_id}/update", json={"name": "NewSubcat"}, headers=headers
95+
)
96+
97+
assert update_resp.status_code == 201
98+
data = update_resp.get_json()
99+
assert data["name"] == "NewSubcat"
100+
assert data["id"] == sc_id
101+
self._verify_subcategory_in_db("NewSubcat")
102+
self._verify_subcategory_in_db("OldSubcat", should_exist=False)
103+
104+
def test_delete_subcategory(self, create_authenticated_headers, create_subcategory):
105+
headers = create_authenticated_headers()
106+
response = create_subcategory("ToDelete", headers=headers)
107+
data = response.get_json()
108+
sc_id = data["id"]
109+
delete_resp = self.client.delete(f"/subcategory/{sc_id}", headers=headers)
110+
111+
assert delete_resp.status_code == 200
112+
get_resp = self.client.get(f"/subcategory/{sc_id}")
113+
assert get_resp.status_code == 404
114+
self._verify_subcategory_in_db("ToDelete", should_exist=False)
115+
116+
def test_create_subcategory_expired_token(self):
117+
headers = utils.get_expired_token_headers(self.client.application.app_context())
118+
response = self.client.post(
119+
"/subcategory/create", json={"name": "TestExpired"}, headers=headers
120+
)
121+
122+
utils.verify_token_error_response(response, "token_expired")
123+
self._verify_subcategory_in_db("TestExpired", should_exist=False)
124+
125+
def test_create_subcategory_invalid_token(self):
126+
headers = utils.get_invalid_token_headers()
127+
response = self.client.post(
128+
"/subcategory/create", json={"name": "TestInvalid"}, headers=headers
129+
)
130+
131+
utils.verify_token_error_response(response, "invalid_token")
132+
self._verify_subcategory_in_db("TestInvalid", should_exist=False)
133+
134+
def test_create_subcategory_missing_token(self):
135+
response = self.client.post("/subcategory/create", json={"name": "TestMissing"})
136+
utils.verify_token_error_response(response, "authorization_required")
137+
self._verify_subcategory_in_db("TestMissing", should_exist=False)
138+
139+
def test_update_subcategory_expired_token(self, create_subcategory, create_authenticated_headers):
140+
headers = create_authenticated_headers()
141+
response = create_subcategory("UpdateExpired", headers=headers)
142+
data = response.get_json()
143+
sc_id = data["id"]
144+
145+
expired_headers = utils.get_expired_token_headers(self.client.application.app_context())
146+
update_resp = self.client.put(
147+
f"/subcategory/{sc_id}/update",
148+
json={"name": "UpdatedName"},
149+
headers=expired_headers,
150+
)
151+
152+
utils.verify_token_error_response(update_resp, "token_expired")
153+
self._verify_subcategory_in_db("UpdateExpired")
154+
self._verify_subcategory_in_db("UpdatedName", should_exist=False)
155+
156+
def test_update_subcategory_invalid_token(self, create_subcategory, create_authenticated_headers):
157+
headers = create_authenticated_headers()
158+
response = create_subcategory("UpdateInvalid", headers=headers)
159+
data = response.get_json()
160+
sc_id = data["id"]
161+
162+
invalid_headers = utils.get_invalid_token_headers()
163+
update_resp = self.client.put(
164+
f"/subcategory/{sc_id}/update",
165+
json={"name": "UpdatedName"},
166+
headers=invalid_headers,
167+
)
168+
169+
utils.verify_token_error_response(update_resp, "invalid_token")
170+
self._verify_subcategory_in_db("UpdateInvalid")
171+
self._verify_subcategory_in_db("UpdatedName", should_exist=False)
172+
173+
def test_update_subcategory_missing_token(self, create_subcategory, create_authenticated_headers):
174+
headers = create_authenticated_headers()
175+
response = create_subcategory("UpdateMissing", headers=headers)
176+
data = response.get_json()
177+
sc_id = data["id"]
178+
179+
update_resp = self.client.put(
180+
f"/subcategory/{sc_id}/update", json={"name": "UpdatedName"}
181+
)
182+
183+
utils.verify_token_error_response(update_resp, "authorization_required")
184+
self._verify_subcategory_in_db("UpdateMissing")
185+
self._verify_subcategory_in_db("UpdatedName", should_exist=False)
186+
187+
def test_delete_subcategory_expired_token(self, create_subcategory, create_authenticated_headers):
188+
headers = create_authenticated_headers()
189+
response = create_subcategory("DeleteExpired", headers=headers)
190+
data = response.get_json()
191+
sc_id = data["id"]
192+
193+
expired_headers = utils.get_expired_token_headers(self.client.application.app_context())
194+
delete_resp = self.client.delete(f"/subcategory/{sc_id}", headers=expired_headers)
195+
196+
utils.verify_token_error_response(delete_resp, "token_expired")
197+
self._verify_subcategory_in_db("DeleteExpired")
198+
199+
def test_delete_subcategory_invalid_token(self, create_subcategory, create_authenticated_headers):
200+
headers = create_authenticated_headers()
201+
response = create_subcategory("DeleteInvalid", headers=headers)
202+
data = response.get_json()
203+
sc_id = data["id"]
204+
205+
invalid_headers = utils.get_invalid_token_headers()
206+
delete_resp = self.client.delete(f"/subcategory/{sc_id}", headers=invalid_headers)
207+
208+
utils.verify_token_error_response(delete_resp, "invalid_token")
209+
self._verify_subcategory_in_db("DeleteInvalid")
210+
211+
def test_delete_subcategory_missing_token(self, create_subcategory, create_authenticated_headers):
212+
headers = create_authenticated_headers()
213+
response = create_subcategory("DeleteMissing", headers=headers)
214+
data = response.get_json()
215+
sc_id = data["id"]
216+
217+
delete_resp = self.client.delete(f"/subcategory/{sc_id}")
218+
219+
utils.verify_token_error_response(delete_resp, "authorization_required")
220+
self._verify_subcategory_in_db("DeleteMissing")
221+
222+
def test_get_subcategory_categories_empty(self, create_subcategory):
223+
response = create_subcategory("NoCatRel")
224+
data = response.get_json()
225+
sc_id = data["id"]
226+
227+
resp = self.client.get(f"/subcategory/{sc_id}/categories")
228+
229+
assert resp.status_code == 200
230+
data = resp.get_json()
231+
assert "categories" in data
232+
assert data["categories"] == []
233+
234+
def test_get_subcategory_products_empty(self, create_subcategory):
235+
response = create_subcategory("NoProdRel")
236+
data = response.get_json()
237+
sc_id = data["id"]
238+
239+
resp = self.client.get(f"/subcategory/{sc_id}/products")
240+
241+
assert resp.status_code == 200
242+
data = resp.get_json()
243+
assert "products" in data
244+
assert data["products"] == []

0 commit comments

Comments
 (0)