import pytest from pytest_mock import MockerFixture from src import config from src.contract_attachments import remove_upcs_from_originating_account from src.errors import PermanentError, TransientError _UPCS = ["00602458823264"] _ISRCS = ["USRC17607839"] _SUCCESS_BODY = {"updated_terms": [], "total_removed": 2} def _mock_resp(mocker: MockerFixture, status_code: int, json_body: object = None, text: str = "") -> object: resp = mocker.MagicMock() resp.status_code = status_code resp.text = text if json_body is not None: resp.json.return_value = json_body else: resp.json.side_effect = ValueError("no JSON") return resp def test_happy_path_calls_delete_and_returns_result(mocker: MockerFixture) -> None: mock_delete = mocker.patch.object(config.ows_client, "delete") mock_delete.return_value = _mock_resp(mocker, 200, _SUCCESS_BODY) result = remove_upcs_from_originating_account(account_id=10, upcs=_UPCS, isrcs=_ISRCS) assert result == _SUCCESS_BODY mock_delete.assert_called_once_with( "ows-royalties", path="/account/10/contract-terms/attachments/bulk", json={"upcs": _UPCS, "isrcs": _ISRCS}, ) def test_4xx_raises_permanent_error(mocker: MockerFixture) -> None: mock_delete = mocker.patch.object(config.ows_client, "delete") mock_delete.return_value = _mock_resp(mocker, 400, text="bad request") with pytest.raises(PermanentError, match="400"): remove_upcs_from_originating_account(account_id=10, upcs=_UPCS, isrcs=_ISRCS) def test_5xx_raises_transient_error(mocker: MockerFixture) -> None: mock_delete = mocker.patch.object(config.ows_client, "delete") mock_delete.return_value = _mock_resp(mocker, 500, text="server error") with pytest.raises(TransientError, match="500"): remove_upcs_from_originating_account(account_id=10, upcs=_UPCS, isrcs=_ISRCS) def test_non_json_raises_transient_error(mocker: MockerFixture) -> None: mock_delete = mocker.patch.object(config.ows_client, "delete") mock_delete.return_value = _mock_resp(mocker, 200, text="not json") with pytest.raises(TransientError, match="non-JSON"): remove_upcs_from_originating_account(account_id=10, upcs=_UPCS, isrcs=_ISRCS)