"""Products router tests.""" import pytest from fastapi.testclient import TestClient from pytest_mock import MockerFixture @pytest.fixture def product_id() -> int: return 12345 @pytest.fixture def product_contributors(product_id) -> dict: return { "product": {"product_id": product_id}, "contributors": [ { "contributor": {"uuid": "550e8400-e29b-41d4-a716-446655440000"}, "participated_as": "performer", "product": {"product_id": product_id}, "release_artist_id": 1001, }, { "contributor": {"uuid": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee"}, "participated_as": "featuring", "product": {"product_id": product_id}, "release_artist_id": 1002, }, ], "display_artists": [ { "contributor": {"uuid": "11111111-2222-4333-8444-555555555555"}, "role": "primary", }, { "contributor": {"uuid": "66666666-7777-4888-8999-aaaaaaaaaaaa"}, "role": "featuring", }, ], } class TestGetProductContributors: def test_returns_contributors( self, mocker: MockerFixture, test_client: TestClient, product_id: int, product_contributors: dict, ) -> None: get_product_contributors_mock = mocker.patch( "contributor.api.routers.products.product_logic.get_product_contributors", return_value=[product_contributors], ) response = test_client.get(f"/products/{product_id}") get_product_contributors_mock.assert_called_once_with( mocker.ANY, product_ids=[product_id], profiles=mocker.ANY, ) assert response.status_code == 200 assert response.json() == product_contributors def test_returns_empty_contributors_list( self, mocker: MockerFixture, test_client: TestClient, product_id: int, ) -> None: mocker.patch( "contributor.api.routers.products.product_logic.get_product_contributors", return_value=[ { "product": {"product_id": product_id}, "contributors": [], "display_artists": [], } ], ) response = test_client.get(f"/products/{product_id}") assert response.status_code == 200 assert response.json() == { "product": {"product_id": product_id}, "contributors": [], "display_artists": [], } class TestLoadProductContributors: def test_returns_product_contributors( self, mocker: MockerFixture, test_client: TestClient, product_contributors: dict, ) -> None: mocker.patch( "contributor.api.routers.products.product_logic.get_product_contributors", return_value=[product_contributors], ) response = test_client.post( "/products/dataloader", json={"products": [{"product_id": 12345}]}, ) assert response.status_code == 200 assert response.json() == [product_contributors] def test_returns_multiple_products( self, mocker: MockerFixture, test_client: TestClient, product_contributors: dict, ) -> None: second_product = { "product": {"product_id": 67890}, "contributors": [ { "contributor": {"uuid": "bbbbbbbb-cccc-41dd-8fff-ffffffffffff"}, "participated_as": "remixer", "product": {"product_id": 67890}, "release_artist_id": 2001, } ], "display_artists": [], } mocker.patch( "contributor.api.routers.products.product_logic.get_product_contributors", return_value=[product_contributors, second_product], ) response = test_client.post( "/products/dataloader", json={"products": [{"product_id": 12345}, {"product_id": 67890}]}, ) assert response.status_code == 200 assert response.json() == [product_contributors, second_product] def test_returns_empty_list_when_none_found( self, mocker: MockerFixture, test_client: TestClient, ) -> None: mocker.patch( "contributor.api.routers.products.product_logic.get_product_contributors", return_value=[], ) response = test_client.post( "/products/dataloader", json={"products": [{"product_id": 999}]}, ) assert response.status_code == 200 assert response.json() == []