|
3 | 3 | from sentry.seer.similarity.config import ( |
4 | 4 | SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, |
5 | 5 | SEER_GROUPING_NEW_VERSION, |
| 6 | + SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE, |
| 7 | + SEER_GROUPING_NEXT_VERSION, |
6 | 8 | SEER_GROUPING_STABLE_VERSION, |
7 | 9 | get_grouping_model_version, |
8 | | - get_new_model_version, |
9 | | - is_new_model_rolled_out, |
10 | 10 | should_send_to_seer_for_training, |
11 | 11 | ) |
12 | | -from sentry.seer.similarity.types import GroupingVersion |
13 | 12 | from sentry.testutils.cases import TestCase |
14 | 13 |
|
15 | 14 |
|
16 | 15 | class GetGroupingModelVersionTest(TestCase): |
17 | | - def test_returns_stable_when_rollout_disabled(self) -> None: |
18 | | - """When new model rollout is disabled, return stable version""" |
19 | | - with patch("sentry.seer.similarity.config.SEER_GROUPING_NEW_VERSION", None): |
20 | | - result = get_grouping_model_version(self.project) |
21 | | - assert result == SEER_GROUPING_STABLE_VERSION |
22 | | - |
23 | | - def test_returns_stable_when_feature_not_enabled(self) -> None: |
24 | | - """When feature flag is not enabled for project, return stable version""" |
25 | | - result = get_grouping_model_version(self.project) |
26 | | - assert result == SEER_GROUPING_STABLE_VERSION |
27 | | - |
28 | | - def test_returns_new_when_feature_enabled(self) -> None: |
29 | | - """When feature flag is enabled for project, return new version""" |
30 | | - with self.feature(SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE): |
31 | | - result = get_grouping_model_version(self.project) |
32 | | - assert result == SEER_GROUPING_NEW_VERSION |
33 | | - |
34 | | - |
35 | | -class IsNewModelRolledOutTest(TestCase): |
36 | | - def test_returns_false_when_no_new_version(self) -> None: |
37 | | - """When no new version is configured, rollout is not active""" |
38 | | - with patch("sentry.seer.similarity.config.SEER_GROUPING_NEW_VERSION", None): |
39 | | - result = is_new_model_rolled_out(self.project) |
40 | | - assert result is False |
41 | | - |
42 | | - def test_returns_false_when_feature_not_enabled(self) -> None: |
43 | | - """When feature flag is not enabled, rollout is not active for project""" |
44 | | - result = is_new_model_rolled_out(self.project) |
45 | | - assert result is False |
46 | | - |
47 | | - def test_returns_true_when_feature_enabled(self) -> None: |
48 | | - """When feature flag is enabled, rollout is active for project""" |
49 | | - with self.feature(SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE): |
50 | | - result = is_new_model_rolled_out(self.project) |
51 | | - assert result is True |
52 | | - |
53 | | - |
54 | | -class GetNewModelVersionTest(TestCase): |
55 | | - def test_returns_configured_version(self) -> None: |
56 | | - """Returns the configured new model version""" |
57 | | - result = get_new_model_version() |
58 | | - assert result == GroupingVersion.V2 |
| 16 | + def test_returns_stable_when_no_flags(self) -> None: |
| 17 | + assert get_grouping_model_version(self.project) == SEER_GROUPING_STABLE_VERSION |
59 | 18 |
|
60 | | - def test_returns_none_when_disabled(self) -> None: |
61 | | - """Returns None when rollout is disabled""" |
62 | | - with patch("sentry.seer.similarity.config.SEER_GROUPING_NEW_VERSION", None): |
63 | | - result = get_new_model_version() |
64 | | - assert result is None |
| 19 | + def test_returns_stable_when_rollout_disabled(self) -> None: |
| 20 | + with ( |
| 21 | + patch("sentry.seer.similarity.config.SEER_GROUPING_NEW_VERSION", None), |
| 22 | + patch("sentry.seer.similarity.config.SEER_GROUPING_NEXT_VERSION", None), |
| 23 | + ): |
| 24 | + assert get_grouping_model_version(self.project) == SEER_GROUPING_STABLE_VERSION |
| 25 | + |
| 26 | + def test_returns_flagged_version(self) -> None: |
| 27 | + cases = [ |
| 28 | + (SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, SEER_GROUPING_NEW_VERSION), |
| 29 | + (SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE, SEER_GROUPING_NEXT_VERSION), |
| 30 | + ] |
| 31 | + for feature_flag, expected_version in cases: |
| 32 | + with self.subTest(feature_flag=feature_flag), self.feature(feature_flag): |
| 33 | + assert get_grouping_model_version(self.project) == expected_version |
| 34 | + |
| 35 | + def test_next_flag_takes_priority_over_new_flag(self) -> None: |
| 36 | + with self.feature( |
| 37 | + [SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE] |
| 38 | + ): |
| 39 | + assert get_grouping_model_version(self.project) == SEER_GROUPING_NEXT_VERSION |
| 40 | + |
| 41 | + def test_falls_back_to_new_when_next_version_is_none(self) -> None: |
| 42 | + with ( |
| 43 | + patch("sentry.seer.similarity.config.SEER_GROUPING_NEXT_VERSION", None), |
| 44 | + self.feature( |
| 45 | + [SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE] |
| 46 | + ), |
| 47 | + ): |
| 48 | + assert get_grouping_model_version(self.project) == SEER_GROUPING_NEW_VERSION |
65 | 49 |
|
66 | 50 |
|
67 | 51 | class ShouldSendToSeerForTrainingTest(TestCase): |
68 | 52 | def test_returns_false_when_no_rollout(self) -> None: |
69 | | - """Returns False when no new version is being rolled out""" |
70 | | - with patch("sentry.seer.similarity.config.SEER_GROUPING_NEW_VERSION", None): |
| 53 | + with ( |
| 54 | + patch("sentry.seer.similarity.config.SEER_GROUPING_NEW_VERSION", None), |
| 55 | + patch("sentry.seer.similarity.config.SEER_GROUPING_NEXT_VERSION", None), |
| 56 | + ): |
71 | 57 | result = should_send_to_seer_for_training( |
72 | 58 | self.project, grouphash_seer_latest_training_model=None |
73 | 59 | ) |
74 | 60 | assert result is False |
75 | 61 |
|
76 | | - def test_returns_false_when_feature_not_enabled(self) -> None: |
77 | | - """Returns False when feature flag is not enabled for project""" |
| 62 | + def test_returns_false_when_no_flags(self) -> None: |
78 | 63 | result = should_send_to_seer_for_training( |
79 | 64 | self.project, grouphash_seer_latest_training_model=None |
80 | 65 | ) |
81 | 66 | assert result is False |
82 | 67 |
|
83 | | - def test_returns_true_when_never_sent(self) -> None: |
84 | | - """Returns True when grouphash has never been sent to Seer""" |
85 | | - with self.feature(SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE): |
86 | | - result = should_send_to_seer_for_training( |
87 | | - self.project, grouphash_seer_latest_training_model=None |
88 | | - ) |
89 | | - assert result is True |
90 | | - |
91 | | - def test_returns_true_when_sent_to_old_version(self) -> None: |
92 | | - """Returns True when grouphash was sent to an older model version""" |
93 | | - with self.feature(SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE): |
94 | | - result = should_send_to_seer_for_training( |
95 | | - self.project, grouphash_seer_latest_training_model="v1" |
96 | | - ) |
97 | | - assert result is True |
98 | | - |
99 | | - def test_returns_false_when_already_sent_to_new_version(self) -> None: |
100 | | - """Returns False when grouphash was already sent to the new version""" |
101 | | - with self.feature(SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE): |
102 | | - result = should_send_to_seer_for_training( |
103 | | - self.project, grouphash_seer_latest_training_model="v2" |
104 | | - ) |
105 | | - assert result is False |
| 68 | + def test_returns_true_when_training_needed(self) -> None: |
| 69 | + cases = [ |
| 70 | + # (feature_flag, seer_latest_training_model) |
| 71 | + (SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, None), |
| 72 | + (SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, "v1"), |
| 73 | + (SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE, None), |
| 74 | + (SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE, "v1"), |
| 75 | + (SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE, "v2"), # v2 → v2.1 transition |
| 76 | + ] |
| 77 | + for feature_flag, training_model in cases: |
| 78 | + with self.subTest(feature_flag=feature_flag, training_model=training_model): |
| 79 | + with self.feature(feature_flag): |
| 80 | + result = should_send_to_seer_for_training( |
| 81 | + self.project, grouphash_seer_latest_training_model=training_model |
| 82 | + ) |
| 83 | + assert result is True |
| 84 | + |
| 85 | + def test_returns_false_when_already_sent_to_current_version(self) -> None: |
| 86 | + cases = [ |
| 87 | + # (feature_flag, seer_latest_training_model) |
| 88 | + (SEER_GROUPING_NEW_MODEL_ROLLOUT_FEATURE, "v2"), |
| 89 | + (SEER_GROUPING_NEXT_MODEL_ROLLOUT_FEATURE, "v2.1"), |
| 90 | + ] |
| 91 | + for feature_flag, training_model in cases: |
| 92 | + with self.subTest(feature_flag=feature_flag, training_model=training_model): |
| 93 | + with self.feature(feature_flag): |
| 94 | + result = should_send_to_seer_for_training( |
| 95 | + self.project, grouphash_seer_latest_training_model=training_model |
| 96 | + ) |
| 97 | + assert result is False |
0 commit comments