diff --git a/tests/conftest.py b/tests/conftest.py index dba7c9e..17b9b70 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -279,6 +279,37 @@ def items_with_types(dbsession): yield items +@pytest.fixture() +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. @@ -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 diff --git a/tests/test_routes/test_item.py b/tests/test_routes/test_item.py index e21a3e8..5f0e4d7 100644 --- a/tests/test_routes/test_item.py +++ b/tests/test_routes/test_item.py @@ -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', [