"""Tests for release_spatial logic.""" from unittest.mock import patch from oto import response import pytest from product_digital.constants import error from product_digital.logic import release_spatial PRODUCT_ID = 12345 SPATIAL_UPC = 9876543210123 @pytest.fixture def spatial_record(): """Return a sample spatial record dict.""" return { 'release_id': PRODUCT_ID, 'upc': SPATIAL_UPC, } @patch('product_digital.logic.release_spatial.release_spatial.get_release_spatial') def test_get_release_spatial_success(mock_get, spatial_record): """Test successful retrieval returns the spatial record.""" mock_get.return_value = response.Response(message=spatial_record) result = release_spatial.get_release_spatial(PRODUCT_ID) assert result.status == 200 assert result.message['release_id'] == PRODUCT_ID mock_get.assert_called_once_with(PRODUCT_ID) @patch('product_digital.logic.release_spatial.release_spatial.create_release_spatial') def test_create_release_spatial_success_with_provided_upc(mock_create, spatial_record): """Test creation succeeds when a upc is provided in the request.""" mock_create.return_value = response.Response(message=spatial_record) result = release_spatial.create_release_spatial(PRODUCT_ID, {'upc': SPATIAL_UPC}) assert result.status == 200 mock_create.assert_called_once_with({'release_id': PRODUCT_ID, 'upc': SPATIAL_UPC}) @patch('product_digital.logic.release_spatial.ows_product.get_provisioned_upc') @patch('product_digital.logic.release_spatial.release_spatial.create_release_spatial') @patch('product_digital.logic.release_spatial.product_additional_upc.get_atmos_upc') def test_create_release_spatial_auto_provisioned_upc( mock_get_atmos, mock_create, mock_provision, spatial_record): """Test that a UPC is auto-provisioned when none is provided and none exists.""" mock_get_atmos.return_value = response.Response(message=None) mock_provision.return_value = response.Response(message=SPATIAL_UPC) mock_create.return_value = response.Response(message=spatial_record) result = release_spatial.create_release_spatial(PRODUCT_ID, {}) assert result.status == 200 mock_provision.assert_called_once_with(mark_used=True) @patch('product_digital.logic.release_spatial.ows_product.get_provisioned_upc') @patch('product_digital.logic.release_spatial.release_spatial.create_release_spatial') @patch('product_digital.logic.release_spatial.product_additional_upc.get_atmos_upc') def test_create_release_spatial_reuses_existing_atmos_upc( mock_get_atmos, mock_create, mock_provision, spatial_record): """Reuse the product's existing additional UPC instead of provisioning a new one.""" mock_get_atmos.return_value = response.Response(message=SPATIAL_UPC) mock_create.return_value = response.Response(message=spatial_record) result = release_spatial.create_release_spatial(PRODUCT_ID, {}) assert result.status == 200 mock_get_atmos.assert_called_once_with(PRODUCT_ID) mock_provision.assert_not_called() mock_create.assert_called_once_with({'release_id': PRODUCT_ID, 'upc': SPATIAL_UPC}) @patch('product_digital.logic.release_spatial.ows_product.get_provisioned_upc') @patch('product_digital.logic.release_spatial.product_additional_upc.get_atmos_upc') def test_create_release_spatial_reuse_lookup_db_error(mock_get_atmos, mock_provision): """A DB error during the reuse lookup surfaces as 500 -- no fallback provisioning.""" mock_get_atmos.return_value = response.create_fatal_response() result = release_spatial.create_release_spatial(PRODUCT_ID, {}) assert result.status == 500 mock_provision.assert_not_called() @patch('product_digital.logic.release_spatial.ows_product.get_provisioned_upc') @patch('product_digital.logic.release_spatial.product_additional_upc.get_atmos_upc') def test_create_release_spatial_upc_provision_failure(mock_get_atmos, mock_provision): """Test that a 500 is returned when UPC provisioning fails.""" mock_get_atmos.return_value = response.Response(message=None) mock_provision.return_value = response.create_error_response( code=error.INTERNAL_ERROR, message=error.ERROR_MESSAGE_UPC_FETCH_FAILED, status=500) result = release_spatial.create_release_spatial(PRODUCT_ID, {}) assert result.status == 500 @patch('product_digital.logic.release_spatial.release_spatial.delete_release_spatial') def test_delete_release_spatial_success(mock_delete, spatial_record): """Test successful deletion delegates to the model layer.""" mock_delete.return_value = response.Response(message={}) result = release_spatial.delete_release_spatial(PRODUCT_ID) assert result.status == 200 mock_delete.assert_called_once_with(PRODUCT_ID) @patch('product_digital.logic.release_spatial.release_spatial.delete_release_spatial') def test_delete_release_spatial_not_found(mock_delete): """Test that a 404 is propagated from the model layer.""" mock_delete.return_value = response.create_not_found_response( error.ERROR_MESSAGE_RELEASE_SPATIAL_NOT_FOUND) result = release_spatial.delete_release_spatial(PRODUCT_ID) assert result.status == 404