"""Tests for Persister.""" from unittest.mock import MagicMock from oto import response import sentry_sdk from sqlalchemy.exc import OperationalError from sqlalchemy.orm.session import Session from ows_product_physical.models import persister def test_persister_update_product_status_tranfer_to_content( mocker, context, db_fixture): """Test update product status success.""" with context: mocker.spy(context.g.ows.log, 'info') mocker.patch.object( persister, '_update_release_status', return_value=response.Response(), autospec=True) mocker.patch.object( persister, '_create_release_approval_queue', return_value=response.Response(status=201), autospec=True) result = persister.update_product_status( 1234, 'transfer_to_content', 5555) assert result.status == 201 assert persister._update_release_status.called assert persister._create_release_approval_queue.called assert context.g.ows.log.info.called def test_persister_update_product_status_other(mocker, context, db_fixture): """Test update product status success, status != transfer_to_content.""" with context: mocker.spy(context.g.ows.log, 'info') mocker.patch.object( persister, '_update_release_status', return_value=response.Response()) mocker.patch.object( persister, '_create_release_approval_queue', return_value=response.Response( status=201), autospec=True) result = persister.update_product_status( 1234, 'pizza', 5555) assert result.status == 201 assert persister._update_release_status.called assert not persister._create_release_approval_queue.called assert context.g.ows.log.info.called def test_persister_update_product_status_update_fail(mocker): """Test update product status update fails calls rollback().""" mocker.patch.object( persister, '_update_release_status', return_value=response.create_error_response( code='whatever', message='whatever'), autospec=True) mocker.patch.object( persister, '_create_release_approval_queue', return_value=response.Response( status=201), autospec=True) result = persister.update_product_status( 1234, 'transfer_to_content', 5555) assert result.status == 400 assert persister._update_release_status.called assert not persister._create_release_approval_queue.called def test_persister_update_product_insert_release_status_fail( mocker, db_fixture): """Test update product status update fails calls rollback().""" mocker.patch.object( persister, '_update_release_status', return_value=response.Response( status=200), autospec=True) mocker.patch.object( persister, '_create_release_status', return_value=response.create_fatal_response(), autospec=True) result = persister.update_product_status(1234, {}, 5555) assert result.status == 500 assert persister._update_release_status.called def test_persister_update_product_db_failure( monkeypatch): """Test update product status db failure is captured in Sentry.""" monkeypatch.setattr( Session, 'execute', value=MagicMock( side_effect=OperationalError('', None, None))) monkeypatch.setattr( sentry_sdk, 'capture_exception', value=MagicMock()) result = persister.update_product_status(1234, {}, 5555) assert result.status == 500 assert sentry_sdk.capture_exception.called