"""Functional tests for endpoints for all features.""" import json from unittest.mock import MagicMock from owsrequest import request as requests import pytest from features.connectors import redis from features.constants import header def create_mock_response(status_code, message): """Create a mock response for requests.get.""" mock_response = MagicMock() mock_response.status_code = status_code mock_response.json.return_value = message return mock_response @pytest.mark.parametrize( ( 'headers', 'ows_users_response', 'expected_result_code', 'expected_result_message', ), [ # no headers (None, None, 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}), # oa user ( {header.ORCHARD_USER_ID: 'oa:555'}, create_mock_response( status_code=200, message={ 'type': 'oa', 'account': {'vendor_id': None, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # oa user, feature 2 = user forced ( {header.ORCHARD_USER_ID: 'oa:123'}, create_mock_response( status_code=200, message={ 'type': 'oa', 'account': {'vendor_id': None, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), # contact for vendor 7123, feature 2 = vendor forced ( {header.ORCHARD_USER_ID: 'alw:16888'}, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 7123, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), # alw user, no forced variants ( {header.ORCHARD_USER_ID: 'alw:44807'}, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 9999999, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # subaccount user, no forced variants ( {header.ORCHARD_USER_ID: 'alw:53103'}, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 9999999, 'subaccount_id': 88888888}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # subaccount user (16055), feature 2 = vendor forced ( {header.ORCHARD_USER_ID: 'alw:46963'}, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 16055, 'subaccount_id': 888888888888}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), ], ) def test_get_features_functional( client, monkeypatch, headers, ows_users_response, expected_result_code, expected_result_message, ): """Test get all features with different user contexts.""" if ows_users_response: monkeypatch.setattr(redis.client, 'get', MagicMock(return_value=None)) monkeypatch.setattr(redis.client, 'set', MagicMock()) monkeypatch.setattr(requests, 'get', MagicMock(return_value=ows_users_response)) response = client.get('/features', headers=headers) assert response.status_code == expected_result_code assert json.loads(response.get_data().decode()) == expected_result_message @pytest.mark.parametrize( ( 'user_id', 'ows_users_response', 'expected_result_code', 'expected_result_message', ), [ # oa user ( 'oa:555', create_mock_response( status_code=200, message={ 'type': 'oa', 'account': {'vendor_id': None, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # oa user, feature 2 = user forced ( 'oa:123', create_mock_response( status_code=200, message={ 'type': 'oa', 'account': {'vendor_id': None, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), # contact for vendor 7123, feature 2 = vendor forced ( 'alw:16888', create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 7123, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), # alw user, no forced variants ( 'alw:44807', create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 9999999, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # subaccount user, no forced variants ( 'alw:53103', create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 9999999, 'subaccount_id': 88888888}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # subaccount user (16055), feature 2 = vendor forced ( 'alw:46963', create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 16055, 'subaccount_id': 888888888888}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), ], ) def test_get_user_features_functional( client, monkeypatch, user_id, ows_users_response, expected_result_code, expected_result_message, ): """Test get user features.""" if ows_users_response: monkeypatch.setattr(redis.client, 'get', MagicMock(return_value=None)) monkeypatch.setattr(redis.client, 'set', MagicMock()) monkeypatch.setattr(requests, 'get', MagicMock(return_value=ows_users_response)) response = client.get('/features/user/{}'.format(user_id)) assert response.status_code == expected_result_code assert json.loads(response.get_data().decode()) == expected_result_message @pytest.mark.parametrize( ( 'user_id', 'vendor_id', 'ows_users_response', 'expected_result_code', 'expected_result_message', ), [ # contact for vendor 7123, feature 2 = vendor forced ( 'alw:16888', 7123, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 7123, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), # alw user, no forced variants ( 'alw:44807', 9999, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 9999, 'subaccount_id': None}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # subaccount user, no forced variants ( 'alw:53103', 9999, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 9999, 'subaccount_id': 888}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_2'}, ), # subaccount user (16055), feature 2 = vendor forced ( 'alw:46963', 16055, create_mock_response( status_code=200, message={ 'type': 'alw', 'account': {'vendor_id': 16055, 'subaccount_id': 777}, }, ), 200, {'feature_1': 'variant_1', 'feature_2': 'variant_1'}, ), ], ) def test_get_vendor_features_functional( client, monkeypatch, user_id, vendor_id, ows_users_response, expected_result_code, expected_result_message, ): """Test get vendor user features.""" if ows_users_response: monkeypatch.setattr(redis.client, 'get', MagicMock(return_value=None)) monkeypatch.setattr(redis.client, 'set', MagicMock()) monkeypatch.setattr(requests, 'get', MagicMock(return_value=ows_users_response)) response = client.get('/features/vendor/{}/user/{}'.format(vendor_id, user_id)) assert response.status_code == expected_result_code assert json.loads(response.get_data().decode()) == expected_result_message