"""Test for ows-users model.""" import json from unittest.mock import Mock from unittest.mock import MagicMock from owsrequest import request as requests import pytest from features import config from features.connectors import redis from features.constants import error from features.models import ows_users @pytest.mark.parametrize( ('ows_users_response_status', 'expected_response_status'), [ # 200 ok (200, 200), # 404 not found (404, 404), # 401 unzuthorized (401, 401), # 500 server error (500, 500), ], ) def test_get_user_details_by_user_id( monkeypatch, ows_users_response_status, expected_response_status ): """Test fetching user details by user_id prefixed with alw: or oa: .""" user_id = 'alw:16088' user_response_message = { 'type': 'alw', 'user_id': 'alw:16088', 'account': {'vendor_id': 7123, 'subaccount_id': None}, } mock_response = MagicMock() mock_response.status_code = ows_users_response_status mock_response.json = Mock(return_value=user_response_message) monkeypatch.setattr( 'features.models.ows_users.requests.get', MagicMock(return_value=mock_response) ) monkeypatch.setattr( 'features.models.ows_users.capture_message', MagicMock(), ) monkeypatch.setattr(redis.client, 'get', MagicMock(return_value=None)) monkeypatch.setattr(redis.client, 'set', MagicMock()) user_response = ows_users.get_user_details_by_user_id(user_id) assert user_response.status == expected_response_status ows_users.requests.get.assert_called_once_with( 'ows-users', '/users/{}/minimum-details'.format(user_id) ) assert redis.client.get.called assert redis.client.get.call_args[0][0] == 'user_info_alw:16088' if ows_users_response_status == 200: assert mock_response.json.called assert user_response.message == user_response_message assert redis.client.set.called assert redis.client.set.call_args[0][0] == 'user_info_alw:16088' assert redis.client.set.call_args[0][1] == json.dumps(user_response_message) assert redis.client.set.call_args[1] == {'ex': config.REDIS_CACHE_TTL} if ows_users_response_status == 404: assert user_response.errors == { 'code': error.ERROR_CODE_USER_DOES_NOT_EXIST, 'message': error.ERROR_MESSAGE_USER_DOES_NOT_EXIST, } if ows_users_response_status == 401: assert user_response.errors == { 'code': error.ERROR_CODE_USER_UNAUTHORIZED, 'message': error.ERROR_MESSAGE_USER_UNAUTHORIZED, } @pytest.mark.parametrize( ('cache_get_value', 'ows_users_called', 'cache_set_called'), [ # cache does not exist (None, True, True), ( json.dumps( { 'type': 'alw', 'user_id': 'alw:16088', 'first_name': 'Jerome David', 'last_name': 'Salinger', 'account': {'vendor_id': 7123, 'subaccount_id': None}, } ).encode(), False, False, ), ], ) def test_get_user_details_by_user_id_caching( monkeypatch, cache_get_value, ows_users_called, cache_set_called ): """Test caching mechanism for user info fetch.""" user_id = 'alw:16088' user_response_message = { 'type': 'alw', 'user_id': 'alw:16088', 'first_name': 'Jerome David', 'last_name': 'Salinger', 'account': {'vendor_id': 7123, 'subaccount_id': None}, } mock_response = MagicMock() mock_response.status_code = 200 mock_response.json = Mock(return_value=user_response_message) monkeypatch.setattr(requests, 'get', MagicMock(return_value=mock_response)) monkeypatch.setattr(redis.client, 'get', MagicMock(return_value=cache_get_value)) monkeypatch.setattr(redis.client, 'set', MagicMock()) monkeypatch.setattr( 'features.models.ows_users.capture_message', MagicMock(), ) user_response = ows_users.get_user_details_by_user_id(user_id) assert user_response_message == user_response.message assert requests.get.called == ows_users_called assert redis.client.set.called == cache_set_called