"""Tests for ows-marketing Model.""" from owsrequest import request from owsrequest import test_utils from owsrequest.test_utils import MockOwsResponse import pytest from project_manager.constant import header_const from project_manager.constant.services import OWS_MARKETING from project_manager.models import ows_marketing def raise_value_error(_): """Raise error when parsing json.""" raise ValueError('No json here!') @pytest.fixture def valid_get_header(): """Return valid GET request headers. Returns: (dict): header dict """ return { header_const.CORRELATION_ID: '1234567890-1234567890', header_const.GRASS_ACCOUNT_TYPE: 'vendor', header_const.GRASS_ACCOUNT_ID: '25257'} @pytest.fixture def project_id(): """Return a fake project id for testing.""" return 1900566 def test_get_project_highlights_by_project_id_success( db_fixture, highlight_data, monkeypatch, project_highlight_ok): """Test getting a project's project highlights.""" monkeypatch.setattr( request, 'get', test_utils.mock_ows_requests([project_highlight_ok])) marketing_response = ows_marketing.get_project_highlights_by_project_id( 1900566) assert marketing_response.status == 200 assert marketing_response.message.get('entity_id') == 1900566 assert marketing_response.message.get('highlight_id') == 39752 def test_get_project_highlights_by_project_id_fail( monkeypatch, project_highlight_not_found): """Test getting project highlights for a project that doesn't exist.""" monkeypatch.setattr( request, 'get', test_utils.mock_ows_requests([project_highlight_not_found])) marketing_response = ows_marketing.get_project_highlights_by_project_id( 1900566) assert marketing_response.status == 404 assert marketing_response.errors.get('code') == 'not_found_error' def test_create_project_highlights_success(highlight_created, monkeypatch): """Test creating a project's project highlights success state.""" monkeypatch.setattr( request, 'post', test_utils.mock_ows_requests([highlight_created])) marketing_response = ows_marketing.create_project_highlights( 1900566, 'new project highlight') assert marketing_response.status == 201 assert marketing_response.message.get('entity_id') == 1900566 assert marketing_response.message.get('highlight_id') == 39754 def test_create_project_highlights_fail(monkeypatch, valid_get_header): """Test creating a project's project highlights fail state.""" error_json = { 'code': 'validation_error', 'message': { 'attachment': "'attachment' is a required property", 'scope': "'scope' is a required property", 'mkt_program_id': "'mkt_program_id' is a required property"}} post_specs = [{ 'service': OWS_MARKETING, 'path': '/highlights', 'status': 404, 'json': error_json}] monkeypatch.setattr( request, 'post', test_utils.mock_ows_requests(post_specs)) marketing_response = ows_marketing.create_project_highlights( 1900566, 'new project highlight') assert marketing_response.status == 404 assert marketing_response.errors.get('code') == 'validation_error' def test_update_project_highlights_success(monkeypatch): """Test updating a project's project highlights success.""" highlight_id = 39757 highlight_payload = { 'description': 'updated project highlight', 'entity': 'project', 'scope': 'public', 'subject': 'Product Marketing Highlight', 'entity_id': 1900566, 'highlight_id': highlight_id, 'attachment': 'N', 'client': 'alw', 'mkt_program_id': 12} put_specs = [{ 'service': OWS_MARKETING, 'path': '/highlights/{}'.format(highlight_id), 'status': 200, 'json': highlight_payload}] monkeypatch.setattr( request, 'put', test_utils.mock_ows_requests(put_specs)) marketing_response = ows_marketing.update_project_highlights( highlight_id, 'updated project highlight') assert marketing_response.status == 200 assert marketing_response.message.get('entity_id') == 1900566 assert marketing_response.message.get('highlight_id') == highlight_id def test_update_project_highlights_fail(monkeypatch): """Test updating a project's project highlights fail state.""" highlight_id = 39757 put_specs = [{ 'service': OWS_MARKETING, 'path': '/highlights/{}'.format(highlight_id), 'status': 400, 'json': {'foo': 'bar'}}] monkeypatch.setattr( request, 'put', test_utils.mock_ows_requests(put_specs)) marketing_response = ows_marketing.update_project_highlights( 39757, 'updated project highlight') assert marketing_response.status == 400 def test_delete_project_highlight_success(mocker): """Test deleting a project highlight.""" highlight_id = 39757 delete_specs = [{ 'service': OWS_MARKETING, 'path': '/highlights/{}'.format(highlight_id), 'status': 200, 'json': {}}] mocker.patch.object( request, 'delete', test_utils.mock_ows_requests(delete_specs)) result = ows_marketing.delete_project_highlight_with_project_deletion( highlight_id) assert result.status == 200 def test_update_project_highlights_fatal_error(monkeypatch): """Test updating a project's project highlights returns 500 error.""" highlight_id = 39757 put_specs = [{ 'service': OWS_MARKETING, 'path': '/highlights/{}'.format(highlight_id), 'status': 500}] monkeypatch.setattr( request, 'put', test_utils.mock_ows_requests(put_specs)) monkeypatch.setattr(MockOwsResponse, 'json', raise_value_error) marketing_response = ows_marketing.update_project_highlights( 39757, 'updated project highlight') assert marketing_response.status == 500 def test_get_project_highlights_by_project_id_fatal_error(monkeypatch): """Test getting project highlights for a project returns 500 error.""" project_id = 39757 monkeypatch.setattr( request, 'get', test_utils.mock_ows_requests([{ 'service': OWS_MARKETING, 'path': '/highlights/project/39757?mkt_program_id=20', 'status': 500}])) monkeypatch.setattr(MockOwsResponse, 'json', raise_value_error) marketing_response = ows_marketing.get_project_highlights_by_project_id( project_id) assert marketing_response.status == 500 def test_create_project_highlights_fatal_error(monkeypatch): """Test creating a project's project highlights returns 500 error.""" monkeypatch.setattr( request, 'post', test_utils.mock_ows_requests([{ 'service': OWS_MARKETING, 'path': '/highlights', 'status': 500}])) monkeypatch.setattr(MockOwsResponse, 'json', raise_value_error) marketing_response = ows_marketing.create_project_highlights( 1900566, 'new project highlight') assert marketing_response.status == 500 assert marketing_response.errors['code'] == 'Internal Error'