diff --git a/test/conftest.py b/test/conftest.py index 416dcc6..26a4f64 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,4 +1,5 @@ from typing import AsyncGenerator +from itertools import combinations import pytest from httpx import AsyncClient, ASGITransport @@ -95,6 +96,40 @@ def _seed(db): group_model.user_rel.append(user_model) db.commit() + +def generate_query_and_status(params) -> list[tuple[str, int]]: + possible_values = [0, -1, 42, "banana", ""] + + defaults = [f"{param}=1" for param in params] + + # Missing params + query_list = [ + "&".join(combo) + for r in range(len(defaults) + 1) + for combo in combinations(defaults, r) + ] + + # Complete query as default for invalid checks + default_query = query_list.pop(-1) + + # Checks for each param being invalid + for param in params: + for value in possible_values: + new_value = f"&{param}={value}" + query_list.append(default_query.replace(f"{param}=1", new_value)) + + query_and_status = [] + + # Assign expected status + for query in query_list: + # ID 42 is used to represent a non-existent entry. So it should 404. + status = 404 if "42" in query else 422 + # Remove leading "&" if present + query = query if len(query) > 1 and query[0] != "&" else query[1:] + query_and_status.append((query, status)) + + return query_and_status + # # Produces a text file with method and path for every endpoint in the API # from fastapi.routing import APIRoute # diff --git a/test/test_iam.py b/test/test_iam.py index de505f1..70fbf6d 100644 --- a/test/test_iam.py +++ b/test/test_iam.py @@ -7,7 +7,7 @@ from src.user.models import User from src.organisation.models import Organisation as Org from src.iam.models import Group -from .conftest import default_client, db_session +from .conftest import default_client, db_session, generate_query_and_status @pytest.mark.anyio @@ -141,22 +141,7 @@ async def test_get_group_permissions_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=42&group_id=1", 404), # Non-exists org, valid group - ("org_id=banana&group_id=1", 422), # Invalid org, valid group - ("org_id=&group_id=1", 422), # Blank org, valid group - ("org_id=-1&group_id=1", 422), # Negative org, valid group - ("group_id=1", 422), # Only group - ("org_id=1&group_id=2", 404), # Group/Org mismatch - ("org_id=2&group_id=1", 404), # Group/Org mismatch - ("", 422), # Blank query - ("org_id=&group_id=", 422), # Both blank - ("org_id=1&group_id=42", 404), # Valid org, non-exists group - ("org_id=1&group_id=banana", 422), # Valid org, invalid group - ("org_id=1&group_id=", 422), # Valid org, blank group - ("org_id=1&group_id=-1", 422), # Valid org, negative group - ("org_id=1", 422), # Only org - ], + generate_query_and_status(["group_id", "org_id"]) ) @pytest.mark.anyio async def test_get_group_permissions_status_checks(default_client: AsyncClient, db_session, query: str, expected_status: int): @@ -199,20 +184,7 @@ async def test_get_group_users_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=2&group_id=1", 404), # Non-exists org, valid group - ("org_id=banana&group_id=1", 422), # Invalid org, valid group - ("org_id=&group_id=1", 422), # Blank org, valid group - ("org_id=-1&group_id=1", 422), # Negative org, valid group - ("group_id=1", 422), # Only group - ("", 422), # Blank query - ("org_id=&group_id=", 422), # Both blank - ("org_id=1&group_id=2", 404), # Valid org, non-exists group - ("org_id=1&group_id=banana", 422), # Valid org, invalid group - ("org_id=1&group_id=", 422), # Valid org, blank group - ("org_id=1&group_id=-1", 422), # Valid org, negative group - ("org_id=1", 422), # Only org - ], + generate_query_and_status(["group_id", "org_id"]) ) @pytest.mark.anyio async def test_get_group_users_status_checks(default_client: AsyncClient, query: str, expected_status: int): @@ -423,13 +395,7 @@ async def test_get_permissions_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=42", 404), # Non-exists org - ("org_id=banana", 422), # Invalid org - ("org_id=", 422), # Blank org - ("org_id=-1", 422), # Negative org - ("", 422), # Blank query - ], + generate_query_and_status(["org_id"]) ) @pytest.mark.anyio async def test_get_permissions_status_checks(default_client: AsyncClient, query: str, expected_status: int): diff --git a/test/test_organisation.py b/test/test_organisation.py index d0bf0ff..8e697e7 100644 --- a/test/test_organisation.py +++ b/test/test_organisation.py @@ -6,7 +6,7 @@ from httpx import AsyncClient from src.organisation.models import Organisation, OrgUsers from src.user.models import User -from .conftest import default_client +from .conftest import default_client, generate_query_and_status @pytest.mark.anyio @@ -25,11 +25,7 @@ async def test_get_org_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=2", 404), - ("org_id=banana", 422), - ("", 422), - ], + generate_query_and_status(["org_id"]) ) @pytest.mark.anyio async def test_get_org_status_checks(default_client: AsyncClient, query: str, expected_status: int): @@ -166,11 +162,7 @@ async def test_get_org_users_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=2", 404), - ("org_id=banana", 422), - ("", 422), - ], + generate_query_and_status(["org_id"]) ) @pytest.mark.anyio async def test_get_org_users_status_checks(default_client: AsyncClient, query: str, expected_status: int): @@ -278,11 +270,7 @@ async def test_get_org_groups_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=2", 404), - ("org_id=banana", 422), - ("", 422), - ], + generate_query_and_status(["org_id"]) ) @pytest.mark.anyio async def test_get_org_groups_status_checks(default_client: AsyncClient, query: str, expected_status: int): diff --git a/test/test_service.py b/test/test_service.py index b98095b..5a1e7ad 100644 --- a/test/test_service.py +++ b/test/test_service.py @@ -4,7 +4,7 @@ import pytest from httpx import AsyncClient -from .conftest import default_client +from .conftest import default_client, generate_query_and_status @pytest.mark.anyio @@ -20,11 +20,7 @@ async def test_get_services_success(default_client: AsyncClient): @pytest.mark.parametrize( "query, expected_status", - [ - ("org_id=2", 404), - ("org_id=banana", 422), - ("", 422), - ], + generate_query_and_status(["org_id"]) ) @pytest.mark.anyio async def test_get_services_status_checks(default_client: AsyncClient, query: str, expected_status: int): diff --git a/test/test_user.py b/test/test_user.py index f8ad0d1..bdcd500 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -6,7 +6,7 @@ import pytest from httpx import AsyncClient -from .conftest import default_client +from .conftest import default_client, generate_query_and_status @pytest.mark.anyio async def test_get_self_db_success(default_client: AsyncClient): @@ -37,12 +37,7 @@ async def test_get_user_success(default_client: AsyncClient): @pytest.mark.anyio @pytest.mark.parametrize( "query, expected_status", - [ - ("user_id=1", 200), - ("user_id=2", 404), - ("user_id=banana", 422), - ("", 422), - ], + generate_query_and_status(["user_id"]) ) async def test_get_user_status_checks(default_client: AsyncClient, query: str, expected_status: int): resp = await default_client.get(f"/user/?{query}")