"""Test for split.io feature model.""" from unittest.mock import MagicMock, patch import pytest from features.connectors import split from features.models import split_feature @pytest.mark.parametrize( ( 'traffic_type', 'split_name', 'attributes', 'split_response', 'expected_treatment', ), [ # feature exist ('vendor', 'feature_1', {}, 'variant_1', 'variant_1'), # feature exist for forced varaint for user ('user', 'feature_1', {'user_id': 'oa:123'}, 'variant_1', 'variant_1'), # feature exist for forced varaint for identity_id ( 'user', 'feature_1', {'identity_id': '5c548bd462501638ea3ed888'}, 'variant_2', 'variant_2', ), # feature exist for forced varaint for vendor ('vendor', 'feature_1', {'vendor_id': '5555'}, 'variant_2', 'variant_2'), # feature does not exist ('vendor', 'feature_99999', {}, 'control', 'control'), ], ) @patch('features.connectors.split', return_value=MagicMock()) def test_get_single_split_feature_model( mock_split, monkeypatch, traffic_type, split_name, attributes, split_response, expected_treatment, ): """Test get_split_feature from split.io sdk client""" mock_split_client = MagicMock() mock_split_client.get_treatment.return_value = expected_treatment monkeypatch.setattr( split, 'get_split_client', MagicMock(return_value=mock_split_client) ) treatment = split_feature.get_split_feature(traffic_type, split_name, attributes) assert treatment == expected_treatment @pytest.mark.parametrize( ('traffic_type', 'attributes', 'expected_split_names', 'expected_split_features'), [ # features exist ( 'vendor', {}, ['feature_1', 'feature_2', 'feature_3', 'feature_4'], { 'feature_1': 'variant_2', 'feature_2': 'variant_2', 'feature_3': 'variant_2', 'feature_4': 'variant_1', }, ), # feature exist for forced varaint for user ( 'user', {'user_id': 'oa:123'}, ['feature_1', 'feature_2', 'feature_3', 'feature_4'], { 'feature_1': 'variant_1', 'feature_2': 'variant_2', 'feature_3': 'variant_2', 'feature_4': 'variant_1', }, ), # feature exist for forced varaint for identity_id ( 'user', {'identity_id': '5c548bd462501638ea3ed888'}, ['feature_1', 'feature_2', 'feature_3', 'feature_4'], { 'feature_1': 'variant_1', 'feature_2': 'variant_1', 'feature_3': 'variant_2', 'feature_4': 'variant_1', }, ), # feature exist for forced varaint for vendor ( 'vendor', {'vendor_id': '5555'}, ['feature_1', 'feature_2', 'feature_3', 'feature_4'], { 'feature_1': 'variant_1', 'feature_2': 'variant_2', 'feature_3': 'variant_1', 'feature_4': 'variant_1', }, ), # features does not exist ('vendor', {}, {}, {}), ], ) @patch('features.connectors.split', return_value=MagicMock()) def test_get_all_split_feature_model( mock_split, monkeypatch, traffic_type, attributes, expected_split_names, expected_split_features, ): """Test get_split_feature from split.io sdk client""" mock_split_manager = MagicMock() mock_split_manager.split_names.return_value = expected_split_names monkeypatch.setattr( split, 'get_split_manager', MagicMock(return_value=mock_split_manager) ) mock_split_client = MagicMock() mock_split_client.get_treatments.return_value = expected_split_features monkeypatch.setattr( split, 'get_split_client', MagicMock(return_value=mock_split_client) ) split_features = split_feature.get_all_split_features(traffic_type, attributes) assert split_features == expected_split_features