Skip to content

Commit af25242

Browse files
Add relationship tests
1 parent c23fa7d commit af25242

File tree

2 files changed

+229
-1
lines changed

2 files changed

+229
-1
lines changed

tests/conftest.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from tests import utils
1111

1212

13-
1413
@pytest.fixture
1514
def client():
1615
app.config["TESTING"] = True
@@ -49,3 +48,46 @@ def _get_headers(email="[email protected]", password="testpassword"):
4948
return utils.get_auth_header(tokens["access_token"])
5049

5150
return _get_headers
51+
52+
53+
@pytest.fixture
54+
def create_category(client, create_authenticated_headers):
55+
def _create(name, subcategories=None, headers=None):
56+
if headers is None:
57+
headers = create_authenticated_headers()
58+
payload = {"name": name}
59+
if subcategories is not None:
60+
payload["subcategories"] = subcategories
61+
return client.post("/category/create", json=payload, headers=headers)
62+
63+
return _create
64+
65+
66+
@pytest.fixture
67+
def create_subcategory(client, create_authenticated_headers):
68+
def _create(name, categories=None, products=None, headers=None):
69+
if headers is None:
70+
headers = create_authenticated_headers()
71+
payload = {"name": name}
72+
if categories is not None:
73+
payload["categories"] = categories
74+
if products is not None:
75+
payload["products"] = products
76+
return client.post("/subcategory/create", json=payload, headers=headers)
77+
78+
return _create
79+
80+
81+
@pytest.fixture
82+
def create_product(client, create_authenticated_headers):
83+
def _create(name, description=None, subcategories=None, headers=None):
84+
if headers is None:
85+
headers = create_authenticated_headers()
86+
payload = {"name": name}
87+
if description is not None:
88+
payload["description"] = description
89+
if subcategories is not None:
90+
payload["subcategories"] = subcategories
91+
return client.post("/product/create", json=payload, headers=headers)
92+
93+
return _create

tests/test_relationships.py

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
import pytest
2+
3+
from app.models import Category, Subcategory, Product
4+
5+
6+
class TestRelationships:
7+
def _category_subcategory_ids(self, client, category_id):
8+
with client.application.app_context():
9+
category = Category.query.get(category_id)
10+
assert category is not None
11+
return sorted([subcategory.id for subcategory in category.subcategories])
12+
13+
def _subcategory_category_ids(self, client, subcategory_id):
14+
with client.application.app_context():
15+
subcategory = Subcategory.query.get(subcategory_id)
16+
assert subcategory is not None
17+
return sorted([category.id for category in subcategory.categories])
18+
19+
def _subcategory_product_ids(self, client, subcategory_id):
20+
with client.application.app_context():
21+
subcategory = Subcategory.query.get(subcategory_id)
22+
assert subcategory is not None
23+
return sorted([product.id for product in subcategory.products])
24+
25+
def _product_subcategory_ids(self, client, product_id):
26+
with client.application.app_context():
27+
product = Product.query.get(product_id)
28+
assert product is not None
29+
return sorted([subcategory.id for subcategory in product.subcategories])
30+
31+
def _category_product_ids_via_subcategories(self, client, category_id):
32+
with client.application.app_context():
33+
category = Category.query.get(category_id)
34+
assert category is not None
35+
return sorted({product.id for subcategory in category.subcategories for product in subcategory.products.all()})
36+
37+
def test_create_category_with_subcategories(self, client, create_category, create_subcategory):
38+
subcategory1 = create_subcategory("SC_A").get_json()
39+
subcategory2 = create_subcategory("SC_B").get_json()
40+
response = create_category("Cat_AB", subcategories=[subcategory1["id"], subcategory2["id"]])
41+
assert response.status_code == 201
42+
category = response.get_json()
43+
44+
assert self._category_subcategory_ids(client, category["id"]) == sorted([subcategory1["id"], subcategory2["id"]])
45+
assert category["id"] in self._subcategory_category_ids(client, subcategory1["id"])
46+
assert category["id"] in self._subcategory_category_ids(client, subcategory2["id"])
47+
48+
def test_create_subcategory_with_categories_and_products(self, client, create_subcategory, create_category, create_product):
49+
category1 = create_category("C1").get_json()
50+
category2 = create_category("C2").get_json()
51+
product1 = create_product("P1", "des").get_json()
52+
product2 = create_product("P2", "desc").get_json()
53+
54+
response = create_subcategory("SC_C1C2_P1P2", categories=[category1["id"], category2["id"]], products=[product1["id"], product2["id"]])
55+
assert response.status_code == 201
56+
subcategory = response.get_json()
57+
58+
assert self._subcategory_category_ids(client, subcategory["id"]) == sorted([category1["id"], category2["id"]])
59+
assert self._subcategory_product_ids(client, subcategory["id"]) == sorted([product1["id"], product2["id"]])
60+
61+
def test_create_product_with_subcategories_links_to_category_products(self, client, create_category, create_subcategory, create_product):
62+
category = create_category("C").get_json()
63+
subcategory = create_subcategory("SC", categories=[category["id"]]).get_json()
64+
response = create_product("P", "desc", subcategories=[subcategory["id"]])
65+
assert response.status_code == 201
66+
product = response.get_json()
67+
68+
assert subcategory["id"] in self._product_subcategory_ids(client, product["id"])
69+
assert product["id"] in self._category_product_ids_via_subcategories(client, category["id"])
70+
assert product["id"] in self._subcategory_product_ids(client, subcategory["id"])
71+
72+
def test_update_category_adds_subcategories(self, client, create_authenticated_headers, create_category, create_subcategory):
73+
subcategory1 = create_subcategory("U_SC1").get_json()
74+
subcategory2 = create_subcategory("U_SC2").get_json()
75+
category = create_category("U_Cat", subcategories=[subcategory1["id"]]).get_json()
76+
77+
headers = create_authenticated_headers()
78+
update_response = client.put(f"/category/{category['id']}/update", json={"subcategories": [subcategory2["id"]]}, headers=headers)
79+
assert update_response.status_code == 201
80+
81+
assert self._category_subcategory_ids(client, category["id"]) == sorted([subcategory1["id"], subcategory2["id"]])
82+
83+
def test_update_subcategory_adds_categories_and_products(self, client, create_authenticated_headers, create_category, create_product, create_subcategory):
84+
category1 = create_category("UC1").get_json()
85+
category2 = create_category("UC2").get_json()
86+
product1 = create_product("UP1").get_json()
87+
product2 = create_product("UP2").get_json()
88+
subcategory = create_subcategory("U_SC").get_json()
89+
90+
headers = create_authenticated_headers()
91+
update_response = client.put(
92+
f"/subcategory/{subcategory['id']}/update",
93+
json={"categories": [category1["id"], category2["id"]], "products": [product1["id"], product2["id"]]},
94+
headers=headers,
95+
)
96+
assert update_response.status_code == 201
97+
98+
assert self._subcategory_category_ids(client, subcategory["id"]) == sorted([category1["id"], category2["id"]])
99+
assert self._subcategory_product_ids(client, subcategory["id"]) == sorted([product1["id"], product2["id"]])
100+
101+
def test_update_product_adds_subcategories(self, client, create_authenticated_headers, create_product, create_subcategory):
102+
subcategory1 = create_subcategory("UPS1").get_json()
103+
subcategory2 = create_subcategory("UPS2").get_json()
104+
product = create_product("UP", "desc", subcategories=[subcategory1["id"]]).get_json()
105+
106+
headers = create_authenticated_headers()
107+
update_response = client.put(f"/product/{product['id']}/update", json={"subcategories": [subcategory2["id"]]}, headers=headers)
108+
assert update_response.status_code == 201
109+
110+
assert self._product_subcategory_ids(client, product["id"]) == sorted([subcategory1["id"], subcategory2["id"]])
111+
112+
def test_get_category_subcategories_empty(self, client, create_category):
113+
category = create_category("Cat_NoSC").get_json()
114+
assert self._category_subcategory_ids(client, category["id"]) == []
115+
116+
def test_get_category_subcategories_populated(self, client, create_category, create_subcategory):
117+
subcategory1 = create_subcategory("SC1").get_json()
118+
subcategory2 = create_subcategory("SC2").get_json()
119+
category = create_category("Cat_WithSC", subcategories=[subcategory1["id"], subcategory2["id"]]).get_json()
120+
121+
assert self._category_subcategory_ids(client, category["id"]) == sorted([subcategory1["id"], subcategory2["id"]])
122+
123+
def test_get_category_products_empty(self, client, create_category):
124+
category = create_category("Cat_NoProd").get_json()
125+
assert set(self._category_product_ids_via_subcategories(client, category["id"])) == set()
126+
127+
def test_get_category_products_populated_with_pagination(self, client, create_category, create_subcategory, create_product):
128+
category = create_category("Cat_Prod").get_json()
129+
subcategory = create_subcategory("SC_Prod", categories=[category["id"]]).get_json()
130+
131+
product_ids = set()
132+
for index in range(12):
133+
product_resp = create_product(f"P{index}", "desc", subcategories=[subcategory["id"]])
134+
product_ids.add(product_resp.get_json().get("id"))
135+
136+
page1 = client.get(f"/category/{category['id']}/products?page=1").get_json()
137+
page2 = client.get(f"/category/{category['id']}/products?page=2").get_json()
138+
assert len(page1["products"]) == 10
139+
assert len(page2["products"]) == 2
140+
141+
returned_product_ids = set(p["id"] for p in page1["products"] + page2["products"])
142+
assert returned_product_ids == product_ids
143+
144+
def test_get_subcategory_categories_populated(self, client, create_category, create_subcategory):
145+
category1 = create_category("C1").get_json()
146+
category2 = create_category("C2").get_json()
147+
subcategory = create_subcategory("SC_Cats", categories=[category1["id"], category2["id"]]).get_json()
148+
149+
assert self._subcategory_category_ids(client, subcategory["id"]) == sorted([category1["id"], category2["id"]])
150+
151+
def test_get_subcategory_products_populated_with_pagination(self, client, create_subcategory, create_product):
152+
subcategory = create_subcategory("SC_Pag").get_json()
153+
154+
product_ids = set()
155+
for index in range(11):
156+
product_resp = create_product(f"SP{index}", "desc", subcategories=[subcategory["id"]])
157+
product_ids.add(product_resp.get_json().get("id"))
158+
159+
page1 = client.get(f"/subcategory/{subcategory['id']}/products?page=1").get_json()
160+
page2 = client.get(f"/subcategory/{subcategory['id']}/products?page=2").get_json()
161+
assert len(page1["products"]) == 10
162+
assert len(page2["products"]) == 1
163+
164+
returned_product_ids = set(p["id"] for p in page1["products"] + page2["products"])
165+
assert returned_product_ids == product_ids
166+
167+
def test_get_product_subcategories_populated(self, client, create_product, create_subcategory):
168+
subcategory1 = create_subcategory("S1").get_json()
169+
subcategory2 = create_subcategory("S2").get_json()
170+
product = create_product("Prod_SC", "desc", subcategories=[subcategory1["id"], subcategory2["id"]]).get_json()
171+
172+
assert self._product_subcategory_ids(client, product["id"]) == sorted([subcategory1["id"], subcategory2["id"]])
173+
174+
@pytest.mark.parametrize(
175+
"path",
176+
[
177+
"/category/999999/subcategories",
178+
"/category/999999/products",
179+
"/subcategory/999999/categories",
180+
"/subcategory/999999/products",
181+
"/product/999999/subcategories",
182+
],
183+
)
184+
def test_relationship_getters_404(self, client, path):
185+
resp = client.get(path)
186+
assert resp.status_code == 404

0 commit comments

Comments
 (0)