"""Tests for physical reporting top MTD shipments handler.""" import json from unittest.mock import MagicMock import pytest from reporting.logic import physical_reporting as pr VENDOR_IDS = [22221, 24583] SUBACCT_IDS = [33034, 22321] TOP_MTD_SHIPMENTS_URL = '/physical-reporting/top-mtd-shipments' TOP_MTD_SHIPMENTS_RESULT = [ { 'mtd_ship_qt': 400, 'artist_product': 'Artist A/Album X', 'local_product_cd': 'ABC123', 'vendor_id': 22221, 'subacct_id': 33034, }, { 'mtd_ship_qt': 250, 'artist_product': 'Artist B/Album Y', 'local_product_cd': 'DEF456', 'vendor_id': 24583, 'subacct_id': 22321, }, ] def test_physical_reporting_top_mtd_shipments_success(client, monkeypatch): """Test top MTD shipments handler returns 200 with results.""" monkeypatch.setattr( pr, 'get_top_mtd_shipments', value=MagicMock(return_value={'results': TOP_MTD_SHIPMENTS_RESULT}), ) result = client.post( TOP_MTD_SHIPMENTS_URL, json={'vendor_ids': VENDOR_IDS} ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': TOP_MTD_SHIPMENTS_RESULT} pr.get_top_mtd_shipments.assert_called_once_with(VENDOR_IDS, None) def test_physical_reporting_top_mtd_shipments_with_subacct_ids( client, monkeypatch ): """Test top MTD shipments passes subacct_ids to logic when provided.""" monkeypatch.setattr( pr, 'get_top_mtd_shipments', value=MagicMock(return_value={'results': TOP_MTD_SHIPMENTS_RESULT}), ) result = client.post( TOP_MTD_SHIPMENTS_URL, json={'vendor_ids': VENDOR_IDS, 'subacct_ids': SUBACCT_IDS}, ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': TOP_MTD_SHIPMENTS_RESULT} pr.get_top_mtd_shipments.assert_called_once_with(VENDOR_IDS, SUBACCT_IDS) def test_physical_reporting_top_mtd_shipments_empty_results( client, monkeypatch ): """Test top MTD shipments handler returns 200 with empty list.""" monkeypatch.setattr( pr, 'get_top_mtd_shipments', value=MagicMock(return_value={'results': []}), ) result = client.post( TOP_MTD_SHIPMENTS_URL, json={'vendor_ids': VENDOR_IDS} ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': []} def test_physical_reporting_top_mtd_shipments_exception(client, monkeypatch): """Test top MTD shipments handler returns 500 on exception.""" monkeypatch.setattr( pr, 'get_top_mtd_shipments', value=MagicMock(side_effect=Exception('DB connection failed')), ) result = client.post( TOP_MTD_SHIPMENTS_URL, json={'vendor_ids': VENDOR_IDS} ) assert result.status_code == 500 @pytest.mark.parametrize( 'payload', [ pytest.param({'vendor_ids': []}, id='empty vendor_ids'), pytest.param({}, id='missing vendor_ids'), pytest.param({'vendor_ids': None}, id='null vendor_ids'), ], ) def test_physical_reporting_top_mtd_shipments_invalid_input( client, monkeypatch, payload ): """Test returns 400 for invalid vendor_ids.""" mock_logic = MagicMock() monkeypatch.setattr(pr, 'get_top_mtd_shipments', value=mock_logic) result = client.post(TOP_MTD_SHIPMENTS_URL, json=payload) assert result.status_code == 400 body = json.loads(result.data) assert body['code'] == 'bad_request' assert 'vendor_ids' in body['message'] mock_logic.assert_not_called()