"""Tests for update-dim-tables PM client.""" import pytest from pytest_mock import MockerFixture from src import config from src.client import get_transfer_job, get_transfer_job_products def test_get_transfer_job_returns_all_fields(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = { "destination_vendor_id": 7, "destination_subaccount_id": 99, "revenue_cutoff_date": "2025-03-31", } result = get_transfer_job(42) mock_get.assert_called_once_with("ows-project-manager", path="/transfer/job/42") assert result == {"destination_vendor_id": 7, "destination_subaccount_id": 99, "revenue_cutoff_date": "2025-03-31"} def test_get_transfer_job_returns_null_subaccount_id(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = { "destination_vendor_id": 7, "destination_subaccount_id": None, "revenue_cutoff_date": "2025-03-31", } result = get_transfer_job(42) assert result["destination_subaccount_id"] is None def test_get_transfer_job_raises_on_null_revenue_cutoff_date(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = { "destination_vendor_id": 7, "destination_subaccount_id": None, "revenue_cutoff_date": None, } with pytest.raises(RuntimeError, match="revenue_cutoff_date"): get_transfer_job(42) def test_get_transfer_job_raises_on_missing_revenue_cutoff_date(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = {"destination_vendor_id": 7, "destination_subaccount_id": None} with pytest.raises(RuntimeError, match="revenue_cutoff_date"): get_transfer_job(42) def test_get_transfer_job_raises_on_error_status(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 404 mock_get.return_value.text = "not found" mock_get.return_value.json.return_value = {} with pytest.raises(RuntimeError, match="status=404"): get_transfer_job(42) def test_get_transfer_job_raises_on_invalid_destination_vendor_id(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = {"destination_vendor_id": "not-an-int"} with pytest.raises(RuntimeError, match="destination_vendor_id"): get_transfer_job(42) def test_get_transfer_job_products_returns_release_ids(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = [{"release_id": 100}, {"release_id": 200}] result = get_transfer_job_products(42, 7) mock_get.assert_called_once_with( "ows-project-manager", path="/transfer/job/42/products", headers={"Grass-Account-Type": "vendor", "Grass-Account-Id": "7"}, ) assert result == [{"release_id": 100}, {"release_id": 200}] def test_get_transfer_job_products_raises_on_error_status(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 500 mock_get.return_value.text = "server error" with pytest.raises(RuntimeError, match="status=500"): get_transfer_job_products(42, 7) def test_get_transfer_job_products_raises_on_invalid_release_id(mocker: MockerFixture) -> None: mock_get = mocker.patch.object(config.ows_client, "get") mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = [{"release_id": "bad"}] with pytest.raises(RuntimeError, match="release_id"): get_transfer_job_products(42, 7)