"""Tests for physical reporting label/subaccount summary 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] LABEL_SUBACCOUNT_SUMMARY_URL = '/physical-reporting/label-subaccount-summary' LABEL_SUBACCOUNT_SUMMARY_RESULT = [ { 'label name': 'Fat Wreck Chords', 'sub label': 'Fat Wreck Chords', 'open orders': 500, 'backorders': 0, 'day1s#': 150, 'mtds#': 206, 'vendor_id': 22221, 'subacct_id': 33034, }, { 'label name': 'Epitaph', 'sub label': 'Epitaph', 'open orders': 300, 'backorders': 0, 'day1s#': 100, 'mtds#': 180, 'vendor_id': 24583, 'subacct_id': 22321, }, ] def test_physical_reporting_label_subaccount_summary_success( client, monkeypatch ): """Test label/subaccount summary handler returns 200 with results.""" monkeypatch.setattr( pr, 'get_label_subaccount_summary', value=MagicMock( return_value={'results': LABEL_SUBACCOUNT_SUMMARY_RESULT} ), ) result = client.post( LABEL_SUBACCOUNT_SUMMARY_URL, json={'vendor_ids': VENDOR_IDS} ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': LABEL_SUBACCOUNT_SUMMARY_RESULT} pr.get_label_subaccount_summary.assert_called_once_with(VENDOR_IDS, None) def test_physical_reporting_label_subaccount_summary_with_subacct_ids( client, monkeypatch ): """Test label/subaccount summary passes subacct_ids to logic.""" monkeypatch.setattr( pr, 'get_label_subaccount_summary', value=MagicMock( return_value={'results': LABEL_SUBACCOUNT_SUMMARY_RESULT} ), ) result = client.post( LABEL_SUBACCOUNT_SUMMARY_URL, json={'vendor_ids': VENDOR_IDS, 'subacct_ids': SUBACCT_IDS}, ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': LABEL_SUBACCOUNT_SUMMARY_RESULT} pr.get_label_subaccount_summary.assert_called_once_with( VENDOR_IDS, SUBACCT_IDS ) def test_physical_reporting_label_subaccount_summary_empty_results( client, monkeypatch ): """Test label/subaccount summary handler returns 200 with empty list.""" monkeypatch.setattr( pr, 'get_label_subaccount_summary', value=MagicMock(return_value={'results': []}), ) result = client.post( LABEL_SUBACCOUNT_SUMMARY_URL, json={'vendor_ids': VENDOR_IDS} ) assert result.status_code == 200 body = json.loads(result.data) assert body == {'results': []} def test_physical_reporting_label_subaccount_summary_exception( client, monkeypatch ): """Test label/subaccount summary handler returns 500 on exception.""" monkeypatch.setattr( pr, 'get_label_subaccount_summary', value=MagicMock(side_effect=Exception('DB connection failed')), ) result = client.post( LABEL_SUBACCOUNT_SUMMARY_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_label_subaccount_summary_invalid_input( client, monkeypatch, payload ): """Test returns 400 for invalid vendor_ids.""" mock_logic = MagicMock() monkeypatch.setattr( pr, 'get_label_subaccount_summary', value=mock_logic ) result = client.post(LABEL_SUBACCOUNT_SUMMARY_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()