"""Tests for item view.""" from unittest.mock import MagicMock from owsresponse import response import pytest from royalty_common.constants import error from royalty_common.marshalling.custom_fields import ma from royalty_common.test_utils.helpers import get_json_body from royalty_common.views.item_view import ItemView class FaceHugger: """Fake model.""" get_by_id_or_error = MagicMock() delete_by_id_or_error = MagicMock() def __init__(self, name): """Init.""" self.name = name class FaceHuggerSchema(ma.Schema): """Fake schema.""" name = ma.NonemptyString() class FaceHuggerItemView(ItemView): """View for operating on an existing face hugger.""" model_class = FaceHugger object_detail_schema = FaceHuggerSchema() put_schema = FaceHuggerSchema() @pytest.fixture def mock_update_handler(): """Mock the create handler.""" mock_update_handler = MagicMock() FaceHuggerItemView.update_handler = mock_update_handler return mock_update_handler @pytest.fixture(scope='module') def register_endpoint(test_app): """Add test endpoints for getting and deleting face huggers.""" test_app.add_url_rule( '/face-hugger/', view_func=FaceHuggerItemView.as_view('get_face_hugger') ) def test_get_success(register_endpoint, fixture_client): """Successfully retrieve a specified Face Hugger.""" FaceHugger.get_by_id_or_error.return_value = FaceHugger(name='hello') res = fixture_client.get('/face-hugger/2') assert res.status_code == 200 assert get_json_body(res) == {'name': 'hello'} FaceHugger.get_by_id_or_error.assert_called_with(2, 404) def test_delete_success(register_endpoint, fixture_client): """Successfully delete a specified Face Hugger.""" res = fixture_client.delete('/face-hugger/2') assert res.status_code == 204 FaceHugger.delete_by_id_or_error.assert_called_with(2, 404) def test_put_success(register_endpoint, fixture_client, mock_update_handler): """Update a face hugger.""" mock_face_hugger = MagicMock() mock_update_handler.return_value = \ response.Response(message='Ta-da!!', status=200) FaceHugger.get_by_id_or_error.return_value = mock_face_hugger res = fixture_client.put('/face-hugger/2', json={ 'name': 'aloha' }) FaceHugger.get_by_id_or_error.assert_called_with(2, 404) assert res.status_code == 200 mock_update_handler.assert_called_with(mock_face_hugger, name='aloha') def test_put_validation_failure(register_endpoint, fixture_client, mock_update_handler): """Update fails with invalid inputs.""" FaceHugger.get_by_id_or_error.return_value = '' res = fixture_client.put('/face-hugger/2', json={ 'name': '' }) assert res.status_code == 400 assert get_json_body(res)['message'] == { 'name': [error.ERROR_FIELD_MISSING] } mock_update_handler.assert_not_called()