Skip to content

Commit 1fb12f6

Browse files
committed
tests + docs
1 parent 18d3b80 commit 1fb12f6

File tree

3 files changed

+91
-2
lines changed

3 files changed

+91
-2
lines changed

docs/index.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ Setup :code:`reddit-experiments` in your application's configuration file:
4343
experiments.path = /var/local/foo.json
4444
4545
# optional: how long to wait for the experiments file to exist before failing
46-
# (default: do not wait. fail immediately if not available)
46+
# default:
47+
# >= v1.7.0 wait 30 seconds
48+
# < v1.7.0 do not wait, fail immediately if not available
4749
experiments.timeout = 60 seconds
4850
4951
# optional: the base amount of time for exponential backoff while waiting

tests/decider_tests.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ def test_none_returned_on_get_variant_call_with_bad_id(self):
497497
self.assertEqual(self.event_logger.log.call_count, 0)
498498

499499
assert any(
500-
"Partially loaded Decider: 1 features failed to load: {'test': 'invalid type: string \"1\", expected u32'}"
500+
"Partially loaded Decider: 1 features failed to load: {'test': 'Manifest parsing error: invalid type: string \"1\", expected u32'}"
501501
in x.getMessage()
502502
for x in captured.records
503503
)
@@ -1481,6 +1481,58 @@ def test_get_variant_without_expose_with_HG_as_control_1_and_child_returns_none_
14811481
experiment_name="hg", variant="control_1", event_fields=event_fields
14821482
)
14831483

1484+
def test_get_variant_for_okta_groups(self):
1485+
identifier = "t2_test"
1486+
bucket_val = "user_id"
1487+
group_overrides = {"variant_2": {"EQ": {"field": "user_id", "values": ["$some_group_id"]}}}
1488+
1489+
self.exp_base_config["exp_1"]["experiment"].update({"overrides": [group_overrides]})
1490+
# reset variant for override to make sure it's not organically bucketed into it
1491+
self.exp_base_config["exp_1"]["experiment"].update({"variants": [{"range_start": 0.0, "range_end": 0.0, "name": "variant_2"},]})
1492+
1493+
og_cfg = {
1494+
"$override_groups": {
1495+
"id": 1337,
1496+
"value": {
1497+
"$some_group_id": {
1498+
"name": "some_group_id",
1499+
"values": [identifier],
1500+
"field": "user_id",
1501+
}
1502+
},
1503+
"type": "dynamic_config",
1504+
"version": "1",
1505+
"enabled": False,
1506+
"owner": "test",
1507+
"name": "$override_group",
1508+
"value_type": "Map",
1509+
"experiment": {
1510+
"experiment_version": 1
1511+
}
1512+
},
1513+
}
1514+
self.exp_base_config.update(og_cfg)
1515+
1516+
with create_temp_config_file(self.exp_base_config) as f:
1517+
decider = setup_decider(f, self.dc, self.mock_span, self.event_logger)
1518+
1519+
self.assertEqual(self.event_logger.log.call_count, 0)
1520+
variant = decider.get_variant_for_identifier_without_expose(
1521+
experiment_name="exp_1", identifier=identifier, identifier_type=bucket_val
1522+
)
1523+
self.assertEqual(variant, "variant_2")
1524+
1525+
self.dc._user_id = identifier
1526+
decider = setup_decider(f, self.dc, self.mock_span, self.event_logger)
1527+
variant = decider.get_variant_without_expose(experiment_name="exp_1")
1528+
self.assertEqual(variant, "variant_2")
1529+
1530+
# no exposures should be triggered
1531+
self.assertEqual(self.event_logger.log.call_count, 0)
1532+
1533+
def test_get_variant_for_okta_groups_non_user_id_identifier(self):
1534+
pass
1535+
14841536

14851537
class TestDeciderGetDynamicConfig(unittest.TestCase):
14861538
def setUp(self):

tests/experiment_tests.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,41 @@ def test_none_returned_on_variant_call_with_no_experiment_with_cfg_data(self):
674674
variant = experiments.variant("test", user=self.user)
675675
self.assertEqual(variant, None)
676676

677+
def test_new_identifier_compatibility(self):
678+
self.mock_filewatcher.get_data.return_value = {
679+
"test": {
680+
"id": 1,
681+
"name": "test",
682+
"enabled": True,
683+
"owner": "test_owner",
684+
"version": "1",
685+
"emit_event": True,
686+
"type": "range_variant",
687+
"start_ts": time.time() - THIRTY_DAYS,
688+
"stop_ts": time.time() + THIRTY_DAYS,
689+
"experiment": {
690+
"variants": [
691+
{"name": "active", "size": 1, "range_end": 1.0, "range_start": 0},
692+
],
693+
"experiment_version": 5,
694+
"shuffle_version": 91,
695+
"bucket_val": "ad_account_id",
696+
"log_bucketing": False,
697+
},
698+
}
699+
}
700+
701+
experiments = Experiments(
702+
config_watcher=self.mock_filewatcher,
703+
server_span=self.mock_span,
704+
context_name="test",
705+
event_logger=self.event_logger,
706+
)
707+
708+
self.assertEqual(self.event_logger.log.call_count, 0)
709+
variant = experiments.variant("test", ad_account_id="a2_xxx")
710+
711+
self.assertEqual(variant, "active")
677712

678713
@mock.patch("reddit_experiments.FileWatcher")
679714
class ExperimentsClientFromConfigTests(unittest.TestCase):

0 commit comments

Comments
 (0)