"""Tests for Persister.""" from unittest.mock import MagicMock from oto import response import pytest import sentry_sdk from sqlalchemy.exc import OperationalError from ows_product_physical.constant import field from ows_product_physical.models import persister @pytest.mark.parametrize( ('assign_display_upc', 'expected_display_upc'), [ (True, '426489624127'), (False, '0000007686986'), ]) def test_persister_create_product_success( monkeypatch, context, mocker, valid_create_product_fields, valid_create_response, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id, assign_display_upc, expected_display_upc, valid_placeholder_upc): """Assert the tables representing a product were written to.""" monkeypatch.setattr( persister, '_create_release', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_release_status', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_primary_artist', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_product_physical', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_subgenre', MagicMock(return_value=valid_create_response)) valid_create_product_fields['assign_display_upc'] = assign_display_upc mocker.patch.object( persister, 'get_provisioned_upc', return_value=response.Response(message=expected_display_upc)) with context: mocker.spy(context.g.ows.log, 'info') resp = persister.create_product( valid_create_product_fields, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id) assert resp.status == 201 assert persister._create_release.call_args[0][1].get( 'display_upc') == expected_display_upc assert persister._create_release.call_args[0][1].get( 'upc') == valid_placeholder_upc assert persister._create_release.called assert persister._create_release_status.called assert persister._create_product_physical.called assert persister._insert_release_subgenre.called assert context.g.ows.log.info.called def test_upc_provisioner_with_persister_create_product( monkeypatch, context, mocker, valid_post_product_data, valid_create_response, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id): """Test creation of a physical product involving upc provisioner.""" monkeypatch.setattr( persister, '_create_release', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_release_status', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_primary_artist', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_product_physical', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_subgenre', value=MagicMock( return_value=valid_create_response)) valid_post_product_data['assign_display_upc'] = True mocker.patch.object( persister, 'get_provisioned_upc', return_value=response.Response(message='426489624127') ) with context: mocker.spy(context.g.ows.log, 'info') resp = persister.create_product( valid_post_product_data, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id) assert resp.status == 201 assert persister._create_release.called assert persister._create_release_status.called assert persister._create_product_physical.called assert persister._insert_release_subgenre.called assert context.g.ows.log.info.called assert persister.get_provisioned_upc.called assert valid_post_product_data['display_upc'] == '426489624127' def test_persister_create_product_subgenre_null( monkeypatch, db_fixture, context, mocker, valid_post_product_data, valid_create_response, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id): """Assert the release subgenre table was not written to.""" valid_post_product_data[field.SUBGENRE_ID] = None monkeypatch.setattr( persister, '_create_release', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_release_status', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_primary_artist', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_product_physical', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_subgenre', value=MagicMock()) with context: mocker.spy(context.g.ows.log, 'info') resp = persister.create_product( valid_post_product_data, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id) assert resp.status == 201 assert persister._create_release.called assert persister._create_release_status.called assert persister._create_product_physical.called assert persister._insert_release_subgenre.called is False assert context.g.ows.log.info.called def test_persister_create_product_fail( monkeypatch, valid_post_product_data, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id): """Assert Sentry captures the exception.""" monkeypatch.setattr( persister, '_assign_display_upc', value=MagicMock( side_effect=OperationalError('', None, None))) monkeypatch.setattr( sentry_sdk, 'capture_exception', value=MagicMock()) resp = persister.create_product( valid_post_product_data, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id) assert resp.status == 500 assert sentry_sdk.capture_exception.called def test_upc_provisioner_fails_with_persister_create_product( monkeypatch, context, mocker, valid_post_product_data, valid_create_response, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id): """Test creation of a physical product when upc provisioner call fails.""" monkeypatch.setattr( persister, '_create_release', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_release_status', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_primary_artist', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_product_physical', value=MagicMock( return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_subgenre', value=MagicMock( return_value=valid_create_response)) valid_post_product_data['assign_display_upc'] = True monkeypatch.setattr( persister, '_reserve_display_upc', value=MagicMock( return_value='426489624127')) mocker.patch.object( persister, 'get_provisioned_upc', return_value=response.Response(status=500) ) with context: mocker.spy(context.g.ows.log, 'info') resp = persister.create_product( valid_post_product_data, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id) assert resp.status == 201 assert persister._create_release.called assert persister._create_release_status.called assert persister._create_product_physical.called assert persister._insert_release_subgenre.called assert context.g.ows.log.info.called assert persister.get_provisioned_upc.called assert persister._reserve_display_upc.called assert valid_post_product_data['display_upc'] == '426489624127' @pytest.mark.parametrize( ('assign_display_upc', 'expected_display_upc'), [ (True, '426489624127'), (False, '0000007686986'), ]) def test_persister_create_product_with_supplychain_success( monkeypatch, context, mocker, valid_create_product_fields, valid_create_response, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id, assign_display_upc, expected_display_upc, valid_placeholder_upc): """Assert the tables representing a product were written to.""" monkeypatch.setattr( persister, '_create_release', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_release_status', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_primary_artist', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_create_product_physical', MagicMock(return_value=valid_create_response)) monkeypatch.setattr( persister, '_insert_release_subgenre', MagicMock(return_value=valid_create_response)) valid_create_product_fields['assign_display_upc'] = assign_display_upc mocker.patch.object( persister, 'get_provisioned_upc', return_value=response.Response(message=expected_display_upc)) with context: mocker.spy(context.g.ows.log, 'info') resp = persister.create_product( valid_create_product_fields, valid_vendor_id, valid_subaccount_id, valid_project_code, valid_artist_id) assert resp.status == 201 assert persister._create_release.call_args[0][1].get( 'display_upc') == expected_display_upc assert persister._create_release.call_args[0][1].get( 'upc') == valid_placeholder_upc assert persister._create_release.called assert persister._create_release_status.called assert persister._create_product_physical.called assert persister._insert_release_subgenre.called assert context.g.ows.log.info.called