"""Functional tests for endpoints for all features.""" import json from unittest.mock import MagicMock from owsrequest import request as requests import pytest from owsresponse import response from features.connectors import redis from features.constants import header from features.models import split_feature def all_split_feature_data(): """Return data for multiple split features.""" return { 'feature_1': 'variant_1', 'feature_2': 'variant_2', 'feature_3': 'variant_2', 'feature_4': 'variant_1', } def forced_all_split_feature_data(): """Return forced rule data for multiple split features.""" return { 'feature_1': 'variant_1', 'feature_2': 'variant_1', 'feature_3': 'variant_2', 'feature_4': 'variant_1', } @pytest.mark.parametrize( ( 'headers', 'ows_users_response', 'split_logic_response', 'expected_result_code', 'expected_result_message', ), [ # no headers ( None, None, MagicMock(return_value=all_split_feature_data()), 200, all_split_feature_data(), ), # oa user ( {header.ORCHARD_USER_ID: 'oa:555'}, MagicMock( return_value=response.Response( status=200, message={ 'type': 'oa', 'account': {'vendor_id': None, 'subaccount_id': None}, }, ) ), MagicMock(return_value=all_split_feature_data()), 200, all_split_feature_data(), ), # oa user, feature 2 = user forced ( {header.ORCHARD_USER_ID: 'oa:123'}, MagicMock( return_value=response.Response( status=200, message={ 'type': 'oa', 'account': {'vendor_id': None, 'subaccount_id': None}, }, ) ), MagicMock(return_value=forced_all_split_feature_data()), 200, forced_all_split_feature_data(), ), # contact for vendor 7123, feature 2 = vendor forced ( { header.GRASS_ACCOUNT_TYPE: 'vendor', header.GRASS_ACCOUNT_ID: 7122, header.ORCHARD_USER_ID: 'alw:16888', }, MagicMock( return_value=response.Response( status=200, message={ 'type': 'alw', 'account': {'vendor_id': 7122, 'subaccount_id': None}, }, ) ), MagicMock(return_value=forced_all_split_feature_data()), 200, forced_all_split_feature_data(), ), # alw user, no forced variants ( { header.GRASS_ACCOUNT_TYPE: 'vendor', header.GRASS_ACCOUNT_ID: 7122, header.ORCHARD_USER_ID: 'alw:44807', }, MagicMock( return_value=response.Response( status=200, message={ 'type': 'alw', 'account': {'vendor_id': 7122, 'subaccount_id': None}, }, ) ), MagicMock(return_value=all_split_feature_data()), 200, all_split_feature_data(), ), # subaccount user, no forced variants ( {header.ORCHARD_USER_ID: 'alw:53103'}, MagicMock( return_value=response.Response( status=200, message={ 'type': 'alw', 'account': {'vendor_id': 7123, 'subaccount_id': 31151}, }, ) ), MagicMock(return_value=all_split_feature_data()), 200, all_split_feature_data(), ), # subaccount user (16055), feature 2 = vendor forced ( { header.GRASS_ACCOUNT_TYPE: 'subaccount', header.GRASS_ACCOUNT_ID: 71223, header.ORCHARD_USER_ID: 'alw:46963', }, MagicMock( return_value=response.Response( status=200, message={ 'type': 'alw', 'account': {'vendor_id': 7123, 'subaccount_id': 28518}, }, ) ), MagicMock(return_value=forced_all_split_feature_data()), 200, forced_all_split_feature_data(), ), # identity id in header, forced variant ( { header.ORCHARD_IDENTITY_ID: '5c548bd462501638ea3ed999', }, None, MagicMock(return_value=forced_all_split_feature_data()), 200, forced_all_split_feature_data(), ), # profile id ,profile type and identity id in header, forced variant ( { header.ORCHARD_IDENTITY_ID: '5d542f411234a40db1f64010', header.ORCHARD_PROFILE_TYPE: 'ArtistProfile', header.ORCHARD_PROFILE_ID: 555, }, None, MagicMock(return_value=forced_all_split_feature_data()), 200, forced_all_split_feature_data(), ), # profile id ,profile type in header, forced variant ( { header.ORCHARD_IDENTITY_ID: '5d542f411234a40db1f64010', header.ORCHARD_PROFILE_TYPE: 'ArtistProfile', header.ORCHARD_PROFILE_ID: 555, }, None, MagicMock(return_value=forced_all_split_feature_data()), 200, forced_all_split_feature_data(), ), ], ) def test_get_split_features_functional( client, monkeypatch, headers, ows_users_response, split_logic_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)) monkeypatch.setattr(split_feature, 'get_all_split_features', split_logic_response) result = client.get('/features?splitioEnabled=true', headers=headers) assert result.status_code == expected_result_code assert json.loads(result.get_data().decode()) == expected_result_message