Skip to content
32 changes: 32 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,37 @@ def items_with_types(dbsession):
yield items


@pytest.fixture()
Comment thread
petrCher marked this conversation as resolved.
def items_with_different_types(dbsession):
"""Фикстура Item.

.. note::
Фикстура создает 6 item. Каждые 2 с одинаковым типом и разными значениями is_available.
"""

item_types = [
ItemType(name="Type1"),
ItemType(name="Type2"),
ItemType(name="Type3"),
]
for item_type in item_types:
dbsession.add(item_type)
dbsession.commit()

items = [
Item(type_id=item_types[0].id, is_available=True),
Item(type_id=item_types[0].id, is_available=False),
Item(type_id=item_types[1].id, is_available=True),
Item(type_id=item_types[1].id, is_available=False),
Item(type_id=item_types[2].id, is_available=True),
Item(type_id=item_types[2].id, is_available=False),
]
for item in items:
dbsession.add(item)
dbsession.commit()
yield items


@pytest.fixture()
def items_with_same_type_id(dbsession):
"""Фикстура Item.
Expand Down Expand Up @@ -338,6 +369,7 @@ def blocking_session(request, dbsession, two_available_items_same_type, authlib_
items[0].is_available = False
dbsession.add(session, items[0])
dbsession.commit()

return item_type


Expand Down
70 changes: 70 additions & 0 deletions tests/test_routes/test_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,76 @@ def test_get_items_by_type_id(client, items_with_types, item_n, response_status)
assert response.status_code == response_status


@pytest.mark.parametrize(
"item_n, order_by, order, is_available, response_status, expected_len",
[
(0, None, None, True, status.HTTP_200_OK, 1),
(0, "id", None, True, status.HTTP_200_OK, 1),
(0, "type_id", "asc", False, status.HTTP_200_OK, 1),
(0, "is_available", "desc", False, status.HTTP_200_OK, 1),
(0, None, None, None, status.HTTP_200_OK, 2),
(1, "id", "asc", False, status.HTTP_200_OK, 1),
(1, "type_id", "desc", True, status.HTTP_200_OK, 1),
(1, "is_available", None, True, status.HTTP_200_OK, 1),
(1, None, "asc", True, status.HTTP_200_OK, 1),
(2, "id", "desc", True, status.HTTP_200_OK, 1),
(2, "type_id", None, False, status.HTTP_200_OK, 1),
(2, "is_available", "asc", False, status.HTTP_200_OK, 1),
(2, None, "desc", None, status.HTTP_200_OK, 2),
(-1, "id", None, True, status.HTTP_200_OK, 3),
(-1, "type_id", "asc", False, status.HTTP_200_OK, 3),
(-1, "is_available", "desc", None, status.HTTP_200_OK, 6),
(-1, None, "desc", None, status.HTTP_200_OK, 6),
],
)
def test_get_items_by_various_filters(
client, items_with_different_types, item_n, order_by, order, is_available, response_status, expected_len
):
dict_of_params = {
"type_id": items_with_different_types[item_n].type_id if item_n != -1 else None,
"order_by": order_by,
"order": order,
"is_available": is_available if is_available is not None else None,
}
query = {k: v for k, v in dict_of_params.items() if v is not None}
response = client.get(url, params=query)
assert response.status_code == response_status

data = response.json()
assert len(data) == expected_len


@pytest.mark.parametrize(
"item_n, order_by, order, response_status",
[
(None, None, "desc", status.HTTP_200_OK),
(0, None, "desc", status.HTTP_200_OK),
(None, "type_id", "desc", status.HTTP_200_OK),
(1, "type_id", "desc", status.HTTP_200_OK),
(None, "is_available", "desc", status.HTTP_200_OK),
(2, "is_available", "desc", status.HTTP_200_OK),
],
)
def test_get_items_check_order(client, items_with_different_types, item_n, order_by, order, response_status):
dict_of_params = {
"type_id": items_with_different_types[item_n].type_id if item_n is not None else None,
"order_by": order_by,
"order": order,
}
query = {k: v for k, v in dict_of_params.items() if v is not None}
response = client.get(url, params=query)
assert response.status_code == response_status

data = response.json()

check_order_by = query.get("order_by") or "id"
check_order = query.get("order") or "asc"

key = lambda x: x[check_order_by]
compare = (lambda x, y: x >= y) if check_order == "desc" else (lambda x, y: x <= y)
assert all(compare(key(x), key(y)) for x, y in zip(data, data[1:]))


@pytest.mark.parametrize(
'item_n,body,response_status',
[
Expand Down
Loading