def test_flag_returns_off_variation_and_event_if_prerequisite_is_off(): store = InMemoryFeatureStore() flag = { 'key': 'feature0', 'on': True, 'prerequisites': [{'key': 'feature1', 'variation': 1}], 'fallthrough': { 'variation': 0 }, 'offVariation': 1, 'variations': ['a', 'b', 'c'], 'version': 1 } flag1 = { 'key': 'feature1', 'off': False, 'offVariation': 1, # note that even though it returns the desired variation, it is still off and therefore not a match 'fallthrough': { 'variation': 0 }, 'variations': ['d', 'e'], 'version': 2, 'trackEvents': False } store.upsert(FEATURES, flag1) user = { 'key': 'x' } detail = EvaluationDetail('b', 1, {'kind': 'PREREQUISITE_FAILED', 'prerequisiteKey': 'feature1'}) events_should_be = [{'kind': 'feature', 'key': 'feature1', 'variation': 1, 'value': 'e', 'default': None, 'version': 2, 'user': user, 'prereqOf': 'feature0'}] assert evaluate(flag, user, store, event_factory) == EvalResult(detail, events_should_be)
def test_flag_returns_fallthrough_and_event_if_prereq_is_met_and_there_are_no_rules(): store = InMemoryFeatureStore() flag = { 'key': 'feature0', 'on': True, 'prerequisites': [{ 'key': 'feature1', 'variation': 1 }], 'fallthrough': { 'variation': 0 }, 'offVariation': 1, 'variations': ['a', 'b', 'c'], 'version': 1 } flag1 = { 'key': 'feature1', 'on': True, 'fallthrough': { 'variation': 1 }, 'variations': ['d', 'e'], 'version': 2, 'trackEvents': False } store.upsert(FEATURES, flag1) user = { 'key': 'x' } detail = EvaluationDetail('a', 0, {'kind': 'FALLTHROUGH'}) events_should_be = [{'kind': 'feature', 'key': 'feature1', 'variation': 1, 'value': 'e', 'default': None, 'version': 2, 'user': user, 'prereqOf': 'feature0'}] assert evaluate(flag, user, store, event_factory) == EvalResult(detail, events_should_be)
def test_segment_match_clause_retrieves_segment_from_store(): store = InMemoryFeatureStore() segment = { "key": "segkey", "included": [ "foo" ], "version": 1 } store.upsert(SEGMENTS, segment) user = { "key": "foo" } flag = { "key": "test", "variations": [ False, True ], "fallthrough": { "variation": 0 }, "on": True, "rules": [ { "clauses": [ { "attribute": "", "op": "segmentMatch", "values": [ "segkey" ] } ], "variation": 1 } ] } assert evaluate(flag, user, store, event_factory).detail.value == True
def test_flag_returns_off_variation_and_event_if_prerequisite_is_off(): store = InMemoryFeatureStore() flag = { 'key': 'feature0', 'on': True, 'prerequisites': [{'key': 'feature1', 'variation': 1}], 'fallthrough': { 'variation': 0 }, 'offVariation': 1, 'variations': ['a', 'b', 'c'], 'version': 1 } flag1 = { 'key': 'feature1', 'off': False, 'offVariation': 1, # note that even though it returns the desired variation, it is still off and therefore not a match 'fallthrough': { 'variation': 0 }, 'variations': ['d', 'e'], 'version': 2, 'trackEvents': False } store.upsert(FEATURES, flag1) user = { 'key': 'x' } detail = EvaluationDetail('b', 1, {'kind': 'PREREQUISITE_FAILED', 'prerequisiteKey': 'feature1'}) events_should_be = [{'kind': 'feature', 'key': 'feature1', 'variation': 1, 'value': 'e', 'version': 2, 'user': user, 'prereqOf': 'feature0', 'trackEvents': False, 'debugEventsUntilDate': None, 'reason': None}] assert evaluate(flag, user, store) == EvalResult(detail, events_should_be)
def test_segment_match_clause_retrieves_segment_from_store(): store = InMemoryFeatureStore() segment = { "key": "segkey", "included": [ "foo" ], "version": 1 } store.upsert(SEGMENTS, segment) user = { "key": "foo" } flag = { "key": "test", "variations": [ False, True ], "fallthrough": { "variation": 0 }, "on": True, "rules": [ { "clauses": [ { "attribute": "", "op": "segmentMatch", "values": [ "segkey" ] } ], "variation": 1 } ] } assert evaluate(flag, user, store).detail.value == True
def test_flag_returns_fallthrough_and_event_if_prereq_is_met_and_there_are_no_rules(): store = InMemoryFeatureStore() flag = { 'key': 'feature0', 'on': True, 'prerequisites': [{ 'key': 'feature1', 'variation': 1 }], 'fallthrough': { 'variation': 0 }, 'offVariation': 1, 'variations': ['a', 'b', 'c'], 'version': 1 } flag1 = { 'key': 'feature1', 'on': True, 'fallthrough': { 'variation': 1 }, 'variations': ['d', 'e'], 'version': 2, 'trackEvents': False } store.upsert(FEATURES, flag1) user = { 'key': 'x' } detail = EvaluationDetail('a', 0, {'kind': 'FALLTHROUGH'}) events_should_be = [{'kind': 'feature', 'key': 'feature1', 'variation': 1, 'value': 'e', 'version': 2, 'user': user, 'prereqOf': 'feature0', 'trackEvents': False, 'debugEventsUntilDate': None, 'reason': None}] assert evaluate(flag, user, store) == EvalResult(detail, events_should_be)
def test_flag_returns_off_variation_and_event_if_prerequisite_is_not_met(): store = InMemoryFeatureStore() flag = { 'key': 'feature0', 'on': True, 'prerequisites': [{ 'key': 'feature1', 'variation': 1 }], 'fallthrough': { 'variation': 0 }, 'offVariation': 1, 'variations': ['a', 'b', 'c'], 'version': 1 } flag1 = { 'key': 'feature1', 'on': True, 'fallthrough': { 'variation': 0 }, 'variations': ['d', 'e'], 'version': 2, 'trackEvents': False } store.upsert(FEATURES, flag1) user = {'key': 'x'} detail = EvaluationDetail('b', 1, { 'kind': 'PREREQUISITE_FAILED', 'prerequisiteKey': 'feature1' }) events_should_be = [{ 'kind': 'feature', 'key': 'feature1', 'variation': 0, 'value': 'd', 'version': 2, 'user': user, 'prereqOf': 'feature0', 'trackEvents': False, 'debugEventsUntilDate': None, 'reason': None }] assert evaluate(flag, user, store) == EvalResult(detail, events_should_be)
def test_flag_returns_fallthrough_and_event_if_prereq_is_met_and_there_are_no_rules( ): store = InMemoryFeatureStore() flag = { 'key': 'feature0', 'on': True, 'prerequisites': [{ 'key': 'feature1', 'variation': 1 }], 'fallthrough': { 'variation': 0 }, 'offVariation': 1, 'variations': ['a', 'b', 'c'], 'version': 1 } flag1 = { 'key': 'feature1', 'on': True, 'fallthrough': { 'variation': 1 }, 'variations': ['d', 'e'], 'version': 2 } store.upsert(FEATURES, flag1) user = {'key': 'x'} events_should_be = [{ 'kind': 'feature', 'key': 'feature1', 'value': 'e', 'version': 2, 'user': user, 'prereqOf': 'feature0' }] assert evaluate(flag, user, store) == ('a', events_should_be)