"""Tests for get publishing obligation logic.""" from unittest.mock import MagicMock from oto import response from ows_product_physical.constant import error from ows_product_physical.logic import product_physical_tracks from ows_product_physical.models import ows_product from ows_product_physical.models import persister from ows_product_physical.models import track as track_model def test_get_publishing_obligation_success(monkeypatch, valid_get_header): """Test get publishing obligation for product success.""" monkeypatch.setattr( ows_product, 'check_product_ownership', value=MagicMock( return_value=response.Response(message=True))) monkeypatch.setattr( persister, 'get_product_by_id', value=MagicMock( return_value=response.Response())) monkeypatch.setattr( track_model, 'get_tracks', value=MagicMock( return_value=response.Response(message={'items': ['Test Track']}))) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.Response())) account_type = valid_get_header['Grass-Account-Type'] account_id = valid_get_header['Grass-Account-Id'] result = product_physical_tracks.get_publishing_obligations_for_product( 1234, account_type, account_id) assert result.status == 200 assert track_model.get_publishing_obligations.called def test_get_publishing_obligation_fail(monkeypatch, valid_get_header): """Test get publishing obligation fails when mysql error occurs.""" monkeypatch.setattr( ows_product, 'check_product_ownership', value=MagicMock( return_value=response.Response(message=True))) monkeypatch.setattr( persister, 'get_product_by_id', value=MagicMock( return_value=response.Response())) monkeypatch.setattr( track_model, 'get_tracks', value=MagicMock( return_value=response.Response(message={'items': ['Test Track']}))) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.create_error_response( code=error.INTERNAL_ERROR, message='mysql error', status=500))) account_type = valid_get_header['Grass-Account-Type'] account_id = valid_get_header['Grass-Account-Id'] result = product_physical_tracks.get_publishing_obligations_for_product( 1234, account_type, account_id) assert result.status == 500 assert track_model.get_publishing_obligations.called def test_get_publishing_obligation_not_found(monkeypatch, valid_get_header): """Test get publishing obligation fails when it is not found.""" monkeypatch.setattr( ows_product, 'check_product_ownership', value=MagicMock( return_value=response.Response(message=True))) monkeypatch.setattr( persister, 'get_product_by_id', value=MagicMock( return_value=response.Response())) monkeypatch.setattr( track_model, 'get_tracks', value=MagicMock( return_value=response.Response(message={'items': ['Test Track']}))) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.create_not_found_response())) account_type = valid_get_header['Grass-Account-Type'] account_id = valid_get_header['Grass-Account-Id'] result = product_physical_tracks.get_publishing_obligations_for_product( 1234, account_type, account_id) assert result.status == 404 assert track_model.get_publishing_obligations.called def test_get_publishing_obligation_invalid_ownership( monkeypatch, valid_get_header): """Test get publishing obligation fails when ownership is false.""" monkeypatch.setattr( ows_product, 'check_product_ownership', value=MagicMock( return_value=response.Response(message=False))) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.Response())) account_type = valid_get_header['Grass-Account-Type'] account_id = 'invalid_id' result = product_physical_tracks.get_publishing_obligations_for_product( 1234, account_type, account_id) assert result.status == 403 assert result.errors['message'] == error.OWNERSHIP_ERROR_MESSAGE.format( account_type) assert not track_model.get_publishing_obligations.called args, kwargs = ows_product.check_product_ownership.call_args assert args == ( 1234, valid_get_header['Grass-Account-Type'], 'invalid_id') def test_get_publishing_obligation_product_not_found( monkeypatch, valid_get_header): """Test get publishing obligation fails when product not found.""" monkeypatch.setattr( ows_product, 'check_product_ownership', value=MagicMock( return_value=response.Response(message=True))) monkeypatch.setattr( persister, 'get_product_by_id', value=MagicMock( return_value=response.create_not_found_response())) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.Response())) account_type = valid_get_header['Grass-Account-Type'] account_id = valid_get_header['Grass-Account-Id'] result = product_physical_tracks.get_publishing_obligations_for_product( 1234, account_type, account_id) assert result.status == 404 assert persister.get_product_by_id.called assert not track_model.get_publishing_obligations.called def test_get_publishing_obligation_tracks_not_found( monkeypatch, valid_get_header): """Test get publishing obligation fails if tracks for product not found.""" monkeypatch.setattr( ows_product, 'check_product_ownership', value=MagicMock( return_value=response.Response(message=True))) monkeypatch.setattr( persister, 'get_product_by_id', value=MagicMock( return_value=response.Response())) monkeypatch.setattr( track_model, 'get_tracks', value=MagicMock( return_value=response.Response(message={'items': []}))) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.Response())) account_type = valid_get_header['Grass-Account-Type'] account_id = valid_get_header['Grass-Account-Id'] result = product_physical_tracks.get_publishing_obligations_for_product( 1234, account_type, account_id) assert result.status == 404 assert result.errors['code'] == ( error.PUBLISHING_OBLIGATION_NOT_FOUND_NO_TRACK_CODE.format(1234)) assert persister.get_product_by_id.called assert not track_model.get_publishing_obligations.called def test_get_publishing_obligation_without_grass_header(monkeypatch): """Test get publishing obligation call without grass-headers succeeds.""" monkeypatch.setattr( persister, 'get_product_by_id', value=MagicMock( return_value=response.Response())) monkeypatch.setattr( track_model, 'get_tracks', value=MagicMock( return_value=response.Response(message={'items': ['Test Track']}))) monkeypatch.setattr( track_model, 'get_publishing_obligations', value=MagicMock(return_value=response.Response())) result = product_physical_tracks.get_publishing_obligations_for_product( 1234, None, None) assert result.status == 200 assert track_model.get_publishing_obligations.called