"""Tests for ReleaseSpatial model.""" from unittest.mock import MagicMock import pytest import sqlalchemy from product_digital.constants import error from product_digital.models import release_spatial SPATIAL_DATA = { 'release_id': 12345, 'upc': 9876543210123, } @pytest.fixture def mock_session(): """Return a mock SQLAlchemy session.""" return MagicMock() @pytest.fixture def mock_release_spatial(): """Return a mock ReleaseSpatial instance.""" obj = MagicMock(spec=release_spatial.ReleaseSpatial) obj.release_id = SPATIAL_DATA['release_id'] obj.upc = SPATIAL_DATA['upc'] obj.to_dict.return_value = { 'release_id': obj.release_id, 'upc': obj.upc, } return obj def test_get_release_spatial_found(mock_session, mock_release_spatial): """Test successful retrieval of a release spatial record.""" mock_session.query.return_value.filter_by.return_value.first.return_value = ( mock_release_spatial) result = release_spatial.get_release_spatial( SPATIAL_DATA['release_id'], session=mock_session) assert result.status == 200 assert result.message['release_id'] == SPATIAL_DATA['release_id'] assert result.message['upc'] == SPATIAL_DATA['upc'] def test_get_release_spatial_not_found(mock_session): """Test that a 404 is returned when no spatial record exists.""" mock_session.query.return_value.filter_by.return_value.first.return_value = None result = release_spatial.get_release_spatial( SPATIAL_DATA['release_id'], session=mock_session) assert result.status == 404 assert error.ERROR_MESSAGE_RELEASE_SPATIAL_NOT_FOUND in str(result.errors) def test_create_release_spatial_success(mock_session): """Test successful creation of a release spatial record.""" mock_session.add = MagicMock() mock_session.commit = MagicMock() result = release_spatial.create_release_spatial( SPATIAL_DATA.copy(), session=mock_session) assert result.status == 200 def test_create_release_spatial_already_exists(mock_session): """Test that 409 is returned when a spatial record already exists for the release.""" orig = MagicMock() mock_session.add = MagicMock() mock_session.flush.side_effect = sqlalchemy.exc.IntegrityError( statement=None, params=None, orig=orig) mock_session.rollback = MagicMock() result = release_spatial.create_release_spatial( SPATIAL_DATA.copy(), session=mock_session) assert result.status == 409 assert error.ERROR_MESSAGE_RELEASE_SPATIAL_ALREADY_EXISTS in str(result.errors) mock_session.rollback.assert_called_once() def test_create_release_spatial_dual_writes_product_additional_upc(mock_session): """Creating a release spatial also mirrors a product_additional_upc row.""" mock_session.query.return_value.filter.return_value.one_or_none.return_value = None result = release_spatial.create_release_spatial( SPATIAL_DATA.copy(), session=mock_session) assert result.status == 200 added = [type(call.args[0]).__name__ for call in mock_session.add.call_args_list] assert 'ReleaseSpatial' in added assert 'ProductAdditionalUpc' in added def test_delete_release_spatial_success(mock_session): """Test successful deletion of a release spatial record.""" mock_session.query.return_value.filter_by.return_value.delete.return_value = 1 result = release_spatial.delete_release_spatial( SPATIAL_DATA['release_id'], session=mock_session) assert result.status == 200 mock_session.commit.assert_called_once() def test_delete_release_spatial_not_found(mock_session): """Test that a 404 is returned when no spatial record exists.""" mock_session.query.return_value.filter_by.return_value.delete.return_value = 0 result = release_spatial.delete_release_spatial( SPATIAL_DATA['release_id'], session=mock_session) assert result.status == 404 assert error.ERROR_MESSAGE_RELEASE_SPATIAL_NOT_FOUND in str(result.errors)