Skip to content

Commit ad000db

Browse files
committed
updated dependency and segment matchers
1 parent a0cfafe commit ad000db

File tree

3 files changed

+31
-34
lines changed

3 files changed

+31
-34
lines changed

splitio/models/grammar/matchers/keys.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,10 @@ def _match(self, key, attributes=None, context=None):
6565
:returns: Wheter the match is successful.
6666
:rtype: bool
6767
"""
68-
segment_storage = context.get('segment_storage')
69-
if not segment_storage:
70-
raise Exception('Segment storage not present in matcher context.')
71-
7268
matching_data = self._get_matcher_input(key, attributes)
7369
if matching_data is None:
7470
return False
75-
return segment_storage.segment_contains(self._segment_name, matching_data)
71+
return context['segment_matchers'][self._segment_name]
7672

7773
def _add_matcher_specific_properties_to_json(self):
7874
"""Return UserDefinedSegment specific properties."""

splitio/models/grammar/matchers/misc.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,14 @@ def _match(self, key, attributes=None, context=None):
3535
assert evaluator is not None
3636

3737
bucketing_key = context.get('bucketing_key')
38-
39-
result = evaluator.evaluate_feature(self._split_name, key, bucketing_key, attributes)
38+
dependent_split = None
39+
condition_matchers = {}
40+
for split in context.get("dependent_splits"):
41+
if split[0].name == self._split_name:
42+
dependent_split = split[0]
43+
condition_matchers = split[1]
44+
break
45+
result = evaluator.evaluate_feature(dependent_split, key, bucketing_key, condition_matchers, attributes)
4046
return result['treatment'] in self._treatments
4147

4248
def _add_matcher_specific_properties_to_json(self):

tests/models/grammar/test_matchers.py

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import json
77
import os.path
88
import re
9+
import pytest
910

1011
from datetime import datetime
1112

1213
from splitio.models.grammar import matchers
14+
from splitio.models import splits
15+
from splitio.models.grammar import condition
1316
from splitio.storage import SegmentStorage
1417
from splitio.engine.evaluator import Evaluator
15-
18+
from tests.integration import splits_json
1619

1720
class MatcherTestsBase(object):
1821
"""Abstract class to make sure we test all relevant methods."""
@@ -398,26 +401,12 @@ def test_from_raw(self, mocker):
398401
def test_matcher_behaviour(self, mocker):
399402
"""Test if the matcher works properly."""
400403
matcher = matchers.UserDefinedSegmentMatcher(self.raw)
401-
segment_storage = mocker.Mock(spec=SegmentStorage)
402404

403405
# Test that if the key if the storage wrapper finds the key in the segment, it matches.
404-
segment_storage.segment_contains.return_value = True
405-
assert matcher.evaluate('some_key', {}, {'segment_storage': segment_storage}) is True
406+
assert matcher.evaluate('some_key', {}, {'segment_matchers':{'some_segment': True} }) is True
406407

407408
# Test that if the key if the storage wrapper doesn't find the key in the segment, it fails.
408-
segment_storage.segment_contains.return_value = False
409-
assert matcher.evaluate('some_key', {}, {'segment_storage': segment_storage}) is False
410-
411-
assert segment_storage.segment_contains.mock_calls == [
412-
mocker.call('some_segment', 'some_key'),
413-
mocker.call('some_segment', 'some_key')
414-
]
415-
416-
assert matcher.evaluate([], {}, {'segment_storage': segment_storage}) is False
417-
assert matcher.evaluate({}, {}, {'segment_storage': segment_storage}) is False
418-
assert matcher.evaluate(123, {}, {'segment_storage': segment_storage}) is False
419-
assert matcher.evaluate(True, {}, {'segment_storage': segment_storage}) is False
420-
assert matcher.evaluate(False, {}, {'segment_storage': segment_storage}) is False
409+
assert matcher.evaluate('some_key', {}, {'segment_matchers':{'some_segment': False}}) is False
421410

422411
def test_to_json(self):
423412
"""Test that the object serializes to JSON properly."""
@@ -784,30 +773,36 @@ def test_from_raw(self, mocker):
784773

785774
def test_matcher_behaviour(self, mocker):
786775
"""Test if the matcher works properly."""
787-
parsed = matchers.DependencyMatcher(self.raw)
776+
cond_raw = self.raw.copy()
777+
cond_raw['dependencyMatcherData']['split'] = 'SPLIT_2'
778+
parsed = matchers.DependencyMatcher(cond_raw)
788779
evaluator = mocker.Mock(spec=Evaluator)
789780

781+
cond = condition.from_raw(splits_json["splitChange1_1"]["splits"][0]['conditions'][0])
782+
split = splits.from_raw(splits_json["splitChange1_1"]["splits"][0])
783+
790784
evaluator.evaluate_feature.return_value = {'treatment': 'on'}
791-
assert parsed.evaluate('test1', {}, {'bucketing_key': 'buck', 'evaluator': evaluator}) is True
785+
assert parsed.evaluate('SPLIT_2', {}, {'bucketing_key': 'buck', 'evaluator': evaluator, 'dependent_splits': [(split, [cond])]}) is True
792786

793787
evaluator.evaluate_feature.return_value = {'treatment': 'off'}
794-
assert parsed.evaluate('test1', {}, {'bucketing_key': 'buck', 'evaluator': evaluator}) is False
788+
# pytest.set_trace()
789+
assert parsed.evaluate('SPLIT_2', {}, {'bucketing_key': 'buck', 'evaluator': evaluator, 'dependent_splits': [(split, [cond])]}) is False
795790

796791
assert evaluator.evaluate_feature.mock_calls == [
797-
mocker.call('some_split', 'test1', 'buck', {}),
798-
mocker.call('some_split', 'test1', 'buck', {})
792+
mocker.call(split, 'SPLIT_2', 'buck', [cond], {}),
793+
mocker.call(split, 'SPLIT_2', 'buck', [cond], {})
799794
]
800795

801-
assert parsed.evaluate([], {}, {'bucketing_key': 'buck', 'evaluator': evaluator}) is False
802-
assert parsed.evaluate({}, {}, {'bucketing_key': 'buck', 'evaluator': evaluator}) is False
803-
assert parsed.evaluate(123, {}, {'bucketing_key': 'buck', 'evaluator': evaluator}) is False
804-
assert parsed.evaluate(object(), {}, {'bucketing_key': 'buck', 'evaluator': evaluator}) is False
796+
assert parsed.evaluate([], {}, {'bucketing_key': 'buck', 'evaluator': evaluator, 'dependent_splits': [(split, [cond])]}) is False
797+
assert parsed.evaluate({}, {}, {'bucketing_key': 'buck', 'evaluator': evaluator, 'dependent_splits': [(split, [cond])]}) is False
798+
assert parsed.evaluate(123, {}, {'bucketing_key': 'buck', 'evaluator': evaluator, 'dependent_splits': [(split, [cond])]}) is False
799+
assert parsed.evaluate(object(), {}, {'bucketing_key': 'buck', 'evaluator': evaluator, 'dependent_splits': [(split, [cond])]}) is False
805800

806801
def test_to_json(self):
807802
"""Test that the object serializes to JSON properly."""
808803
as_json = matchers.DependencyMatcher(self.raw).to_json()
809804
assert as_json['matcherType'] == 'IN_SPLIT_TREATMENT'
810-
assert as_json['dependencyMatcherData']['split'] == 'some_split'
805+
assert as_json['dependencyMatcherData']['split'] == 'SPLIT_2'
811806
assert as_json['dependencyMatcherData']['treatments'] == ['on', 'almost_on']
812807

813808

0 commit comments

Comments
 (0)