"""Tests for the delivery metadata API router.""" import json from typing import Any from unittest.mock import call import pytest from fastapi import Response, status from fastapi.testclient import TestClient from pytest_mock import MockerFixture from delivery_metadata.constants import ( DeliveryType, MetadataFormat, MetadataFormatVersion, StoreIds, ) @pytest.mark.parametrize( ( "test_description", "store_id", "format_", "version", "expected_response_status_code", "expected_response_text", "expected_response_content_type", "expected_generate_calls", ), [ ( "Format version not supported for store", StoreIds.SPOTIFY, MetadataFormat.DDEX_ERN, "1.0", status.HTTP_422_UNPROCESSABLE_CONTENT, json.dumps( { "code": "InvalidDeliveryFormatVersion", "message": "The available versions of format: 'ddex_ern' are: ['4.3']", }, separators=(",", ":"), ), "application/json", [], ), ( "Format version supported for store", StoreIds.SPOTIFY, MetadataFormatVersion.DDEX_ERN_4_3.format, MetadataFormatVersion.DDEX_ERN_4_3.version, 200, "metadata", "application/xml", [ call( upc=75679660923, store_id=StoreIds.SPOTIFY, delivery_type=DeliveryType.COMPLETE_ALBUM, delivery_format_version=MetadataFormatVersion.DDEX_ERN_4_3, ), ], ), ( "Format version not supported", 123, MetadataFormat.DDEX_ERN, "1.0", status.HTTP_422_UNPROCESSABLE_CONTENT, json.dumps( { "code": "InvalidDeliveryFormatVersion", "message": "The available versions of format: 'ddex_ern' are: ['4.3']", }, separators=(",", ":"), ), "application/json", [], ), ( "Format version supported", 123, MetadataFormatVersion.DDEX_ERN_4_3.format, MetadataFormatVersion.DDEX_ERN_4_3.version, 200, "metadata", "application/xml", [ call( upc=75679660923, store_id=123, delivery_type=DeliveryType.COMPLETE_ALBUM, delivery_format_version=MetadataFormatVersion.DDEX_ERN_4_3, ), ], ), ], ) def test_get_delivery_metadata( test_description: str, store_id: int, format_: MetadataFormat, version: MetadataFormatVersion, expected_response_status_code: int, expected_response_text: str, expected_response_content_type: str, expected_generate_calls: list[Any], test_client: TestClient, mocker: MockerFixture, ) -> None: generate_mock = mocker.patch( "delivery_metadata.logic.delivery_metadata.generate", return_value=Response(content="metadata", media_type="application/xml"), ) result = test_client.get( f"/products/75679660923/stores/{store_id}/delivery_metadata" f"?delivery_type={DeliveryType.COMPLETE_ALBUM.value}" f"&format={format_.value}" f"&version={version}" ) assert result.status_code == expected_response_status_code assert result.text == expected_response_text assert result.headers["content-type"] == expected_response_content_type assert generate_mock.mock_calls == expected_generate_calls