"""Tests for physical reporting top open orders 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_OPEN_ORDERS_URL = '/physical-reporting/top-open-orders' TOP_OPEN_ORDERS_RESULT = [ { 'open_order_qt': 500, 'artist_product': 'Artist A/Album X', 'local_product_cd': 'ABC123', 'vendor_id': 22221, 'subacct_id': 33034, }, { 'open_order_qt': 300, 'artist_product': 'Artist B/Album Y', 'local_product_cd': 'DEF456', 'vendor_id': 24583, 'subacct_id': 22321, }, ] def test_physical_reporting_top_open_orders_success(client, monkeypatch): """Test physical_reporting_top_open_orders returns 200 with results.""" monkeypatch.setattr( pr, 'get_top_open_orders', value=MagicMock(return_value={'results': TOP_OPEN_ORDERS_RESULT}), ) result = client.post(TOP_OPEN_ORDERS_URL, json={'vendor_ids': VENDOR_IDS}) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': TOP_OPEN_ORDERS_RESULT} pr.get_top_open_orders.assert_called_once_with(VENDOR_IDS, None) def test_physical_reporting_top_open_orders_with_subacct_ids( client, monkeypatch ): """Test top open orders passes subacct_ids to logic when provided.""" monkeypatch.setattr( pr, 'get_top_open_orders', value=MagicMock(return_value={'results': TOP_OPEN_ORDERS_RESULT}), ) result = client.post( TOP_OPEN_ORDERS_URL, json={'vendor_ids': VENDOR_IDS, 'subacct_ids': SUBACCT_IDS}, ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': TOP_OPEN_ORDERS_RESULT} pr.get_top_open_orders.assert_called_once_with(VENDOR_IDS, SUBACCT_IDS) def test_physical_reporting_top_open_orders_empty_results(client, monkeypatch): """Test physical_reporting_top_open_orders returns 200 with empty list.""" monkeypatch.setattr( pr, 'get_top_open_orders', value=MagicMock(return_value={'results': []}), ) result = client.post(TOP_OPEN_ORDERS_URL, json={'vendor_ids': VENDOR_IDS}) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': []} def test_physical_reporting_top_open_orders_exception(client, monkeypatch): """Test physical_reporting_top_open_orders returns 500 on exception.""" monkeypatch.setattr( pr, 'get_top_open_orders', value=MagicMock(side_effect=Exception('DB connection failed')), ) result = client.post(TOP_OPEN_ORDERS_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_open_orders_invalid_input( client, monkeypatch, payload ): """Test returns 400 for invalid vendor_ids.""" mock_logic = MagicMock() monkeypatch.setattr(pr, 'get_top_open_orders', value=mock_logic) result = client.post(TOP_OPEN_ORDERS_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()