"""Test for ows_product_physical model.""" from unittest.mock import MagicMock from flexmock import flexmock from owsrequest import request import pytest from product_digital.constants import services from product_digital.models import ows_product_physical @pytest.fixture def product_physical_payload(): """Return a valid payload for updating physical product metadata.""" return { 'sale_start_date': '2024-01-15', 'release_date': '2024-02-01', } def test_update_product_physical_correct_call(product_id, product_physical_payload): """Test correct call made to ows-product-physical.""" response_payload = { 'sale_start_date': product_physical_payload['sale_start_date'], 'release_date': product_physical_payload['release_date'], } mock_response = MagicMock(status_code=200) mock_response.json = MagicMock(return_value=response_payload) ( flexmock(request) .should_receive('put') .with_args( services.OWS_PRODUCT_PHYSICAL, '/product/{}'.format(product_id), json={ 'sale_start_date': product_physical_payload['sale_start_date'], 'release_date': product_physical_payload['release_date'], }, headers={} ) .and_return(mock_response) ) ows_product_physical.update_product_physical( product_physical_payload, product_id ) def test_update_product_physical_expected_return(product_id, product_physical_payload): """Test expected response body returned.""" response_payload = { 'sale_start_date': product_physical_payload['sale_start_date'], 'release_date': product_physical_payload['release_date'], } mock_response = MagicMock(status_code=200) mock_response.json = MagicMock(return_value=response_payload) ( flexmock(request) .should_receive('put') .with_args( services.OWS_PRODUCT_PHYSICAL, '/product/{}'.format(product_id), json={ 'sale_start_date': product_physical_payload['sale_start_date'], 'release_date': product_physical_payload['release_date'], }, headers={} ) .and_return(mock_response) ) result = ows_product_physical.update_product_physical( product_physical_payload, product_id ) assert result.status == 200 assert result.message == response_payload def test_update_product_physical_error_returned(product_id, product_physical_payload): """Test error response when ows-product-physical returns a non-200.""" response_payload = { 'code': 'validation_error', 'message': 'release_date is invalid', } mock_response = MagicMock(status_code=400) mock_response.json = MagicMock(return_value=response_payload) ( flexmock(request) .should_receive('put') .with_args( services.OWS_PRODUCT_PHYSICAL, '/product/{}'.format(product_id), json={ 'sale_start_date': product_physical_payload['sale_start_date'], 'release_date': product_physical_payload['release_date'], }, headers={} ) .and_return(mock_response) ) result = ows_product_physical.update_product_physical( product_physical_payload, product_id ) assert result.status == 400 assert result.errors == response_payload