@@ -4640,3 +4640,84 @@ def test_multivariate_flag_consistency(self, patch_get):
4640
4640
self .assertEqual (feature_flag_match , results [i ])
4641
4641
else :
4642
4642
self .assertFalse (feature_flag_match )
4643
+
4644
+ @mock .patch ("posthog.client.decide" )
4645
+ def test_feature_flag_case_sensitive (self , mock_decide ):
4646
+ mock_decide .return_value = {"featureFlags" : {}} # Ensure decide returns empty flags
4647
+
4648
+ client = Client (api_key = FAKE_TEST_API_KEY , personal_api_key = FAKE_TEST_API_KEY )
4649
+ client .feature_flags = [
4650
+ {
4651
+ "id" : 1 ,
4652
+ "key" : "Beta-Feature" ,
4653
+ "active" : True ,
4654
+ "filters" : {
4655
+ "groups" : [{"properties" : [], "rollout_percentage" : 100 }],
4656
+ },
4657
+ }
4658
+ ]
4659
+
4660
+ # Test that flag evaluation is case-sensitive
4661
+ self .assertTrue (client .feature_enabled ("Beta-Feature" , "user1" ))
4662
+ self .assertFalse (client .feature_enabled ("beta-feature" , "user1" ))
4663
+ self .assertFalse (client .feature_enabled ("BETA-FEATURE" , "user1" ))
4664
+
4665
+ @mock .patch ("posthog.client.decide" )
4666
+ def test_feature_flag_payload_case_sensitive (self , mock_decide ):
4667
+ mock_decide .return_value = {
4668
+ "featureFlags" : {"Beta-Feature" : True },
4669
+ "featureFlagPayloads" : {"Beta-Feature" : {"some" : "value" }},
4670
+ }
4671
+
4672
+ client = Client (api_key = FAKE_TEST_API_KEY , personal_api_key = FAKE_TEST_API_KEY )
4673
+ client .feature_flags = [
4674
+ {
4675
+ "id" : 1 ,
4676
+ "key" : "Beta-Feature" ,
4677
+ "active" : True ,
4678
+ "filters" : {
4679
+ "groups" : [{"properties" : [], "rollout_percentage" : 100 }],
4680
+ "payloads" : {
4681
+ "true" : {"some" : "value" },
4682
+ },
4683
+ },
4684
+ }
4685
+ ]
4686
+
4687
+ # Test that payload retrieval is case-sensitive
4688
+ self .assertEqual (client .get_feature_flag_payload ("Beta-Feature" , "user1" ), {"some" : "value" })
4689
+ self .assertIsNone (client .get_feature_flag_payload ("beta-feature" , "user1" ))
4690
+ self .assertIsNone (client .get_feature_flag_payload ("BETA-FEATURE" , "user1" ))
4691
+
4692
+ @mock .patch ("posthog.client.decide" )
4693
+ def test_feature_flag_case_sensitive_consistency (self , mock_decide ):
4694
+ mock_decide .return_value = {
4695
+ "featureFlags" : {"Beta-Feature" : True },
4696
+ "featureFlagPayloads" : {"Beta-Feature" : {"some" : "value" }},
4697
+ }
4698
+
4699
+ client = Client (api_key = FAKE_TEST_API_KEY , personal_api_key = FAKE_TEST_API_KEY )
4700
+ client .feature_flags = [
4701
+ {
4702
+ "id" : 1 ,
4703
+ "key" : "Beta-Feature" ,
4704
+ "active" : True ,
4705
+ "filters" : {
4706
+ "groups" : [{"properties" : [], "rollout_percentage" : 100 }],
4707
+ "payloads" : {
4708
+ "true" : {"some" : "value" },
4709
+ },
4710
+ },
4711
+ }
4712
+ ]
4713
+
4714
+ # Test that flag evaluation and payload retrieval are consistently case-sensitive
4715
+ # Only exact match should work
4716
+ self .assertTrue (client .feature_enabled ("Beta-Feature" , "user1" ))
4717
+ self .assertEqual (client .get_feature_flag_payload ("Beta-Feature" , "user1" ), {"some" : "value" })
4718
+
4719
+ # Different cases should not match
4720
+ test_cases = ["beta-feature" , "BETA-FEATURE" , "bEtA-FeAtUrE" ]
4721
+ for case in test_cases :
4722
+ self .assertFalse (client .feature_enabled (case , "user1" ))
4723
+ self .assertIsNone (client .get_feature_flag_payload (case , "user1" ))
0 commit comments