"""Tests for physical reporting top yesterday 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_YESTERDAY_SHIPMENTS_URL = '/physical-reporting/top-yesterday-shipments' TOP_YESTERDAY_SHIPMENTS_RESULT = [ { 'yesterday_ship_qt': 400, 'artist_product': 'Artist A/Album X', 'local_product_cd': 'ABC123', 'vendor_id': 22221, 'subacct_id': 33034, }, { 'yesterday_ship_qt': 250, 'artist_product': 'Artist B/Album Y', 'local_product_cd': 'DEF456', 'vendor_id': 24583, 'subacct_id': 22321, }, ] def test_physical_reporting_top_yesterday_shipments_success( client, monkeypatch ): """Test top yesterday shipments handler returns 200 with results.""" monkeypatch.setattr( pr, 'get_top_yesterday_shipments', value=MagicMock( return_value={'results': TOP_YESTERDAY_SHIPMENTS_RESULT} ), ) result = client.post( TOP_YESTERDAY_SHIPMENTS_URL, json={'vendor_ids': VENDOR_IDS} ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': TOP_YESTERDAY_SHIPMENTS_RESULT} pr.get_top_yesterday_shipments.assert_called_once_with(VENDOR_IDS, None) def test_physical_reporting_top_yesterday_shipments_with_subacct_ids( client, monkeypatch ): """Test top yesterday shipments passes subacct_ids to logic.""" monkeypatch.setattr( pr, 'get_top_yesterday_shipments', value=MagicMock( return_value={'results': TOP_YESTERDAY_SHIPMENTS_RESULT} ), ) result = client.post( TOP_YESTERDAY_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_YESTERDAY_SHIPMENTS_RESULT} pr.get_top_yesterday_shipments.assert_called_once_with( VENDOR_IDS, SUBACCT_IDS ) def test_physical_reporting_top_yesterday_shipments_empty_results( client, monkeypatch ): """Test top yesterday shipments handler returns 200 with empty list.""" monkeypatch.setattr( pr, 'get_top_yesterday_shipments', value=MagicMock(return_value={'results': []}), ) result = client.post( TOP_YESTERDAY_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_yesterday_shipments_exception( client, monkeypatch ): """Test top yesterday shipments handler returns 500 on exception.""" monkeypatch.setattr( pr, 'get_top_yesterday_shipments', value=MagicMock(side_effect=Exception('DB connection failed')), ) result = client.post( TOP_YESTERDAY_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_yesterday_shipments_invalid_input( client, monkeypatch, payload ): """Test returns 400 for invalid vendor_ids.""" mock_logic = MagicMock() monkeypatch.setattr(pr, 'get_top_yesterday_shipments', value=mock_logic) result = client.post(TOP_YESTERDAY_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()