@@ -2682,6 +2682,102 @@ def test_kick_off_seer_automation_runs_with_missing_summary_cache(
2682
2682
2683
2683
mock_start_seer_automation .assert_called_once_with (group .id )
2684
2684
2685
+ @patch ("sentry.autofix.utils.is_seer_scanner_rate_limited" )
2686
+ @patch ("sentry.quotas.backend.has_available_reserved_budget" )
2687
+ @patch ("sentry.seer.seer_setup.get_seer_org_acknowledgement" )
2688
+ @patch ("sentry.tasks.autofix.start_seer_automation.delay" )
2689
+ @with_feature ("organizations:gen-ai-features" )
2690
+ @with_feature ("organizations:trigger-autofix-on-issue-summary" )
2691
+ def test_rate_limit_only_checked_after_all_other_checks_pass (
2692
+ self ,
2693
+ mock_start_seer_automation ,
2694
+ mock_get_seer_org_acknowledgement ,
2695
+ mock_has_budget ,
2696
+ mock_is_rate_limited ,
2697
+ ):
2698
+ """Test that rate limit check only happens after all other checks pass"""
2699
+ mock_get_seer_org_acknowledgement .return_value = True
2700
+ mock_has_budget .return_value = True
2701
+ mock_is_rate_limited .return_value = (False , 0 , 100 ) # Not rate limited
2702
+
2703
+ self .project .update_option ("sentry:seer_scanner_automation" , True )
2704
+ event = self .create_event (
2705
+ data = {"message" : "testing" },
2706
+ project_id = self .project .id ,
2707
+ )
2708
+
2709
+ # Test 1: When all checks pass, rate limit should be checked
2710
+ self .call_post_process_group (
2711
+ is_new = True ,
2712
+ is_regression = False ,
2713
+ is_new_group_environment = True ,
2714
+ event = event ,
2715
+ )
2716
+ mock_is_rate_limited .assert_called_once_with (event .project , event .group .organization )
2717
+ mock_start_seer_automation .assert_called_once_with (event .group .id )
2718
+
2719
+ mock_is_rate_limited .reset_mock ()
2720
+ mock_start_seer_automation .reset_mock ()
2721
+
2722
+ # Test 2: When seer org acknowledgement fails, rate limit should NOT be checked
2723
+ mock_get_seer_org_acknowledgement .return_value = False
2724
+
2725
+ event2 = self .create_event (
2726
+ data = {"message" : "testing 2" },
2727
+ project_id = self .project .id ,
2728
+ )
2729
+
2730
+ self .call_post_process_group (
2731
+ is_new = True ,
2732
+ is_regression = False ,
2733
+ is_new_group_environment = True ,
2734
+ event = event2 ,
2735
+ )
2736
+ mock_is_rate_limited .assert_not_called ()
2737
+ mock_start_seer_automation .assert_not_called ()
2738
+
2739
+ mock_is_rate_limited .reset_mock ()
2740
+ mock_start_seer_automation .reset_mock ()
2741
+ mock_get_seer_org_acknowledgement .return_value = True # Reset to success
2742
+
2743
+ # Test 3: When budget check fails, rate limit should NOT be checked
2744
+ mock_has_budget .return_value = False
2745
+
2746
+ event3 = self .create_event (
2747
+ data = {"message" : "testing 3" },
2748
+ project_id = self .project .id ,
2749
+ )
2750
+
2751
+ self .call_post_process_group (
2752
+ is_new = True ,
2753
+ is_regression = False ,
2754
+ is_new_group_environment = True ,
2755
+ event = event3 ,
2756
+ )
2757
+ mock_is_rate_limited .assert_not_called ()
2758
+ mock_start_seer_automation .assert_not_called ()
2759
+
2760
+ mock_is_rate_limited .reset_mock ()
2761
+ mock_start_seer_automation .reset_mock ()
2762
+ mock_has_budget .return_value = True # Reset to success
2763
+
2764
+ # Test 4: When project option is disabled, rate limit should NOT be checked
2765
+ self .project .update_option ("sentry:seer_scanner_automation" , False )
2766
+
2767
+ event4 = self .create_event (
2768
+ data = {"message" : "testing 4" },
2769
+ project_id = self .project .id ,
2770
+ )
2771
+
2772
+ self .call_post_process_group (
2773
+ is_new = True ,
2774
+ is_regression = False ,
2775
+ is_new_group_environment = True ,
2776
+ event = event4 ,
2777
+ )
2778
+ mock_is_rate_limited .assert_not_called ()
2779
+ mock_start_seer_automation .assert_not_called ()
2780
+
2685
2781
2686
2782
class PostProcessGroupErrorTest (
2687
2783
TestCase ,
0 commit comments