From 4e254afcc713dea8f99634fb9ce3e1e9ce39dd46 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Shahid <108458621+abdollahShahid@users.noreply.github.com> Date: Sat, 3 Jan 2026 18:58:02 +0500 Subject: [PATCH 1/4] test: mock v2 init calls for list_users_v2 --- tests/test_users.py | 105 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 92 insertions(+), 13 deletions(-) diff --git a/tests/test_users.py b/tests/test_users.py index 72e9b0e..db2edbb 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -31,7 +31,7 @@ def test_generate_token_wrong_date(foss_server: str): secrets.token_urlsafe(8), token_expire=str(date.today() - timedelta(days=1)), ) - assert "Error while generating new token" in str(excinfo.value) + assert "Error while generating new token" in str(excinfo.value) def test_generate_token_too_long(foss_server: str): @@ -43,7 +43,7 @@ def test_generate_token_too_long(foss_server: str): secrets.token_urlsafe(41), token_expire=str(date.today() + timedelta(days=1)), ) - assert "Error while generating new token" in str(excinfo.value) + assert "Error while generating new token" in str(excinfo.value) @responses.activate @@ -84,7 +84,7 @@ def test_generate_token_if_receiving_authentication_error_raises_api_error_( secrets.token_urlsafe(8), token_expire=str(date.today() + timedelta(days=1)), ) - assert "Authentication error" in str(excinfo.value) + assert "Authentication error" in str(excinfo.value) def test_unknown_user(foss: Fossology): @@ -93,12 +93,86 @@ def test_unknown_user(foss: Fossology): def test_list_users(foss: Fossology): - # Fixture created_foss_user creates a new user for the test session - # If the whole test suite runs, a second user is created - # Running this test only will result in 1 user users = foss.list_users() assert len(users) == 2 +@responses.activate +def test_list_users_v2(foss_server: str, foss_user: dict, foss_user_agents: dict): + """ + API v2 support test: + Fossology(version="v2") triggers multiple calls during __init__. + We must mock everything it touches: + GET /api/v2/health + GET /api/v2/info + GET /api/v2/users/self + GET /api/v2/folders + GET /api/v2/folders/{rootFolderId} + And then the actual call under test: + GET /api/v2/users + """ + base = foss_server.rstrip("/") + + health_info = { + "status": {"status": "OK"}, + "scheduler": {"status": "OK"}, + "db": {"status": "OK"}, + } + + api_info = { + "name": "FOSSology API", + "description": "Mocked API info for tests", + "version": "v2", + "security": ["api_key"], + "contact": "fossology@example.com", + "license": {"name": "MIT", "url": "https://opensource.org/licenses/MIT"}, + "fossology": { + "version": "4.4.0", + "branchName": "main", + "commitHash": "deadbeef", + "commitDate": "2025-01-01T00:00:00Z", + "buildDate": "2025-01-02T00:00:00Z", + }, + } + + root_id = foss_user.get("rootFolderId", 1) + + folder_info = { + "id": root_id, + "name": "Root", + "description": "Root folder", + "parent": 0, + } + + responses.add(responses.GET, f"{base}/api/v2/health", status=200, json=health_info) + responses.add(responses.GET, f"{base}/api/v2/info", status=200, json=api_info) + responses.add(responses.GET, f"{base}/api/v2/users/self", status=200, json=foss_user) + + # ✅ Needed: init calls the folders collection endpoint + responses.add( + responses.GET, + f"{base}/api/v2/folders", + status=200, + json=[folder_info], + ) + + # Some versions also call the single folder endpoint + responses.add( + responses.GET, + f"{base}/api/v2/folders/{root_id}", + status=200, + json=folder_info, + ) + + responses.add(responses.GET, f"{base}/api/v2/users", status=200, json=[foss_user]) + + foss = Fossology(foss_server, "test-token", version="v2") + + users_from_api = foss.list_users() + + assert len(users_from_api) == 1 + assert users_from_api[0].agents.to_dict() == foss_user_agents + + @responses.activate def test_get_self_error(foss_server: str, foss: Fossology): @@ -115,9 +189,8 @@ def test_get_self_error(foss_server: str, foss: Fossology): def test_get_self_with_agents( foss_server: str, foss: Fossology, foss_user: dict, foss_user_agents: dict ): - user = foss_user responses.add( - responses.GET, f"{foss_server}/api/v1/users/self", status=200, json=user + responses.GET, f"{foss_server}/api/v1/users/self", status=200, json=foss_user ) user_from_api = foss.get_self() assert user_from_api.agents.to_dict() == foss_user_agents @@ -127,11 +200,13 @@ def test_get_self_with_agents( def test_detail_user_with_agents( foss_server: str, foss: Fossology, foss_user: dict, foss_user_agents: dict ): - user = foss_user responses.add( - responses.GET, f"{foss_server}/api/v1/users/{user['id']}", status=200, json=user + responses.GET, + f"{foss_server}/api/v1/users/{foss_user['id']}", + status=200, + json=foss_user, ) - user_from_api = foss.detail_user(user["id"]) + user_from_api = foss.detail_user(foss_user["id"]) assert user_from_api.agents.to_dict() == foss_user_agents @@ -139,8 +214,12 @@ def test_detail_user_with_agents( def test_list_users_with_agents( foss_server: str, foss: Fossology, foss_user: dict, foss_user_agents: dict ): - users = [foss_user] - responses.add(responses.GET, f"{foss_server}/api/v1/users", status=200, json=users) + responses.add( + responses.GET, + f"{foss_server}/api/v1/users", + status=200, + json=[foss_user], + ) users_from_api = foss.list_users() assert users_from_api[0].agents.to_dict() == foss_user_agents From 2d1f62dd730ed63e3b8480270a24abb33e9763f5 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Shahid <108458621+abdollahShahid@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:06:46 +0500 Subject: [PATCH 2/4] Update tests/test_users.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_users.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_users.py b/tests/test_users.py index db2edbb..31b3098 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -95,7 +95,6 @@ def test_unknown_user(foss: Fossology): def test_list_users(foss: Fossology): users = foss.list_users() assert len(users) == 2 - @responses.activate def test_list_users_v2(foss_server: str, foss_user: dict, foss_user_agents: dict): """ From b8e344619e8fb6558d0de7b2cc3dfc84865c7a01 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Shahid <108458621+abdollahShahid@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:06:54 +0500 Subject: [PATCH 3/4] Update tests/test_users.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_users.py b/tests/test_users.py index 31b3098..6fcbe70 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -112,7 +112,7 @@ def test_list_users_v2(foss_server: str, foss_user: dict, foss_user_agents: dict base = foss_server.rstrip("/") health_info = { - "status": {"status": "OK"}, + "status": "OK", "scheduler": {"status": "OK"}, "db": {"status": "OK"}, } From 4aaa0f39ef8b8a4d584ed2d6676ec8b358ce73f6 Mon Sep 17 00:00:00 2001 From: Muhammad Abdullah Shahid <108458621+abdollahShahid@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:07:06 +0500 Subject: [PATCH 4/4] Update tests/test_users.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_users.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_users.py b/tests/test_users.py index 6fcbe70..3f99f81 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -172,7 +172,6 @@ def test_list_users_v2(foss_server: str, foss_user: dict, foss_user_agents: dict assert users_from_api[0].agents.to_dict() == foss_user_agents - @responses.activate def test_get_self_error(foss_server: str, foss: Fossology): responses.add(