"""Tests for ows-project model.""" from unittest.mock import MagicMock from owsrequest import request import pytest from product_digital import api from product_digital.connectors import sentry from product_digital.models import project @pytest.fixture def project_account_kwargs(): """Return keyword arguments used for ownership check.""" return { 'project_id': 12345, 'account_type': 'vendor', 'account_id': 123} def test_get_project_by_id_success(monkeypatch, test_request_context, valid_get_header): """Test getting a project by its id.""" testing_payload = {'project_id': 1, 'project_code': 'ABC'} mock_response = MagicMock() mock_response.status_code = 200 mock_response.json = MagicMock(return_value=testing_payload) monkeypatch.setattr(request, 'get', MagicMock(return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): project_response = project.get_project_by_id(1) assert project_response.status == 200 assert project_response.message == testing_payload def test_get_project_by_id_failure(monkeypatch, test_request_context, valid_get_header): """Test getting a project that does not exist fails.""" mock_response = MagicMock() mock_response.status_code = 404 mock_response.json = MagicMock(return_value={ 'code': 'not_found_error', 'message': 'Unable to find project_id 1'}) monkeypatch.setattr(request, 'get', MagicMock( return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): project_response = project.get_project_by_id(1) assert project_response.status == 400 assert 'bad_request' in project_response.errors.get('code') assert 'Invalid project id' == project_response.errors.get('message') def test_get_project_by_id_unexpected( mocker, monkeypatch, test_request_context, valid_get_header): """Test getting a project when unpredicted error response returned.""" expected_error = 'ows-project-manager returns 418 status with body '\ 'An error occurred' mock_response = MagicMock() mock_response.status_code = 418 mock_response.json = MagicMock(return_value={ 'code': 'teapot_error', 'message': 'An error occurred'}) monkeypatch.setattr(request, 'get', MagicMock( return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): mocker.spy(sentry.sentry_sdk, 'capture_message') mock_g = mocker.patch('product_digital.models.project.g') project_response = project.get_project_by_id(1) assert project_response.status == 500 assert project_response.errors.get('code') == 'internal_error' mock_g.ows.log.error.assert_called_with(expected_error) sentry.sentry_sdk.capture_message.assert_called_with(message=expected_error) def test_get_project_by_id_deletions(monkeypatch, test_request_context, valid_get_header): """Test getting a project by its id with deletions included.""" testing_payload = {'project_id': 1, 'project_code': 'ABC'} mock_response = MagicMock() mock_response.status_code = 200 mock_response.json = MagicMock(return_value=testing_payload) monkeypatch.setattr(request, 'get', MagicMock(return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): project_response = project.get_project_by_id(1, True) request.get.assert_called_with( 'ows-project-manager', '/project/1?include_deletions=True') assert project_response.status == 200 assert project_response.message == testing_payload def test_ownership_success( mocker, test_request_context, project_account_kwargs, valid_get_header): """Test checking project ownership success.""" mock_response = MagicMock() mock_response.status_code = 200 mocker.patch.object(request, 'head', MagicMock(return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): project_response = project.check_project_ownership( **project_account_kwargs) assert project_response.status == 200 def test_ownership_forbidden( mocker, test_request_context, project_account_kwargs, valid_get_header): """Test checking project ownership when not owner.""" mock_response = MagicMock() mock_response.status_code = 403 mocker.patch.object(request, 'head', MagicMock(return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): project_response = project.check_project_ownership( **project_account_kwargs) assert project_response.status == 403 def test_ownership_not_found( mocker, test_request_context, project_account_kwargs, valid_get_header): """Test checking project ownership when not owner.""" mock_response = MagicMock() mock_response.status_code = 404 mocker.patch.object(request, 'head', MagicMock(return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): project_response = project.check_project_ownership( **project_account_kwargs) assert project_response.status == 400 def test_ownership_unexpected( mocker, test_request_context, project_account_kwargs, valid_get_header): """Test checking project ownership when unexpected response.""" expected_error = 'ows-project-manager returns 418 status' mock_response = MagicMock() mock_response.status_code = 418 mocker.patch.object(request, 'head', MagicMock(return_value=mock_response)) with api.app.test_request_context(headers=valid_get_header): mocker.spy(sentry.sentry_sdk, 'capture_message') mock_g = mocker.patch('product_digital.models.project.g') project_response = project.check_project_ownership( **project_account_kwargs) assert project_response.status == 500 mock_g.ows.log.error.assert_called_with(expected_error) sentry.sentry_sdk.capture_message.assert_called_with(message=expected_error)