|
9 | 9 | from scripts.reviewer_bot_lib.reminder_comments import scan_reviewer_reminder_comments |
10 | 10 |
|
11 | 11 |
|
12 | | -def _projection(issue_number: int, actual_labels: tuple[str, ...], state: str): |
13 | | - decision = to_reviewer_response_decision( |
14 | | - { |
15 | | - "issue_number": issue_number, |
16 | | - "current_reviewer": "iglesias", |
17 | | - "response_state": state, |
18 | | - "suppression_reason": "legacy_duplicate_reminders_exhausted" |
19 | | - if state == "reviewer_reassignment_needed" |
20 | | - else None, |
21 | | - "current_scope_key": "scope", |
22 | | - "current_scope_basis": "reminder_cadence_exhausted", |
23 | | - } |
24 | | - ) |
| 12 | +def _projection( |
| 13 | + issue_number: int, |
| 14 | + actual_labels: tuple[str, ...], |
| 15 | + state: str, |
| 16 | + *, |
| 17 | + suppresses_overdue_reminder: bool | None = None, |
| 18 | +): |
| 19 | + decision_payload = { |
| 20 | + "issue_number": issue_number, |
| 21 | + "current_reviewer": "iglesias", |
| 22 | + "response_state": state, |
| 23 | + "suppression_reason": "legacy_duplicate_reminders_exhausted" |
| 24 | + if state == "reviewer_reassignment_needed" |
| 25 | + else None, |
| 26 | + "current_scope_key": "scope", |
| 27 | + "current_scope_basis": "reminder_cadence_exhausted", |
| 28 | + } |
| 29 | + if suppresses_overdue_reminder is not None: |
| 30 | + decision_payload["suppresses_overdue_reminder"] = suppresses_overdue_reminder |
| 31 | + decision = to_reviewer_response_decision(decision_payload) |
25 | 32 | return decision, reviews_projection.derive_status_label_projection( |
26 | 33 | reviews_projection.StatusLabelProjectionInput( |
27 | 34 | issue_number=issue_number, |
@@ -135,13 +142,105 @@ def test_issue314_classifier_marks_pr264_stale_label_as_operator_action_without_ |
135 | 142 | assert payload["output_keys"] == sorted(payload.keys()) |
136 | 143 |
|
137 | 144 |
|
138 | | -def test_issue314_classifier_blocks_rows_with_automated_reminder_risk(): |
139 | | - decision, projection = _projection(42, (), "awaiting_reviewer_response") |
| 145 | +def test_issue314_classifier_keeps_aligned_awaiting_reviewer_response_healthy(): |
| 146 | + decision, projection = _projection( |
| 147 | + 42, |
| 148 | + ("status: awaiting reviewer response",), |
| 149 | + "awaiting_reviewer_response", |
| 150 | + ) |
140 | 151 | input = issue314_state_health.Issue314StateHealthClassificationInput( |
141 | 152 | state_issue_number=314, |
142 | 153 | validation_nonce="nonce", |
143 | 154 | active_review_rows=({"issue_number": 42, "review_data": {"current_reviewer": "alice"}},), |
144 | | - live_snapshots={42: {"number": 42, "state": "open", "pull_request": {}, "labels": []}}, |
| 155 | + live_snapshots={ |
| 156 | + 42: { |
| 157 | + "number": 42, |
| 158 | + "state": "open", |
| 159 | + "pull_request": {}, |
| 160 | + "labels": [{"name": "status: awaiting reviewer response"}], |
| 161 | + } |
| 162 | + }, |
| 163 | + reviewer_responses={42: decision}, |
| 164 | + status_projections={42: projection}, |
| 165 | + reminder_scans={42: scan_reviewer_reminder_comments([])}, |
| 166 | + evaluated_repo="rustfoundation/safety-critical-rust-coding-guidelines", |
| 167 | + head_sha="head", |
| 168 | + evaluated_ref="head", |
| 169 | + workflow_path=".github/workflows/reviewer-bot-preview.yml", |
| 170 | + run_id="1", |
| 171 | + run_attempt="1", |
| 172 | + ) |
| 173 | + |
| 174 | + summary = issue314_state_health.classify_issue314_state_health(input) |
| 175 | + |
| 176 | + assert summary.rows_blocked == () |
| 177 | + assert summary.rows_repairable == () |
| 178 | + row = summary.row_inventory[0] |
| 179 | + assert row.health_classification == "healthy" |
| 180 | + assert row.automated_reminder_risk is False |
| 181 | + assert row.status_label_risk == "aligned" |
| 182 | + |
| 183 | + |
| 184 | +def test_issue314_classifier_marks_awaiting_reviewer_response_label_drift_repairable(): |
| 185 | + decision, projection = _projection( |
| 186 | + 360, |
| 187 | + ("status: awaiting reviewer response", "status: draft"), |
| 188 | + "awaiting_reviewer_response", |
| 189 | + ) |
| 190 | + input = issue314_state_health.Issue314StateHealthClassificationInput( |
| 191 | + state_issue_number=314, |
| 192 | + validation_nonce="nonce", |
| 193 | + active_review_rows=({"issue_number": 360, "review_data": {"current_reviewer": "alice"}},), |
| 194 | + live_snapshots={ |
| 195 | + 360: { |
| 196 | + "number": 360, |
| 197 | + "state": "open", |
| 198 | + "labels": [ |
| 199 | + {"name": "status: awaiting reviewer response"}, |
| 200 | + {"name": "status: draft"}, |
| 201 | + ], |
| 202 | + } |
| 203 | + }, |
| 204 | + reviewer_responses={360: decision}, |
| 205 | + status_projections={360: projection}, |
| 206 | + reminder_scans={360: scan_reviewer_reminder_comments([])}, |
| 207 | + evaluated_repo="rustfoundation/safety-critical-rust-coding-guidelines", |
| 208 | + head_sha="head", |
| 209 | + evaluated_ref="head", |
| 210 | + workflow_path=".github/workflows/reviewer-bot-preview.yml", |
| 211 | + run_id="1", |
| 212 | + run_attempt="1", |
| 213 | + ) |
| 214 | + |
| 215 | + summary = issue314_state_health.classify_issue314_state_health(input) |
| 216 | + |
| 217 | + assert summary.rows_blocked == () |
| 218 | + assert summary.rows_repairable == (360,) |
| 219 | + row = summary.row_inventory[0] |
| 220 | + assert row.health_classification == "repairable" |
| 221 | + assert row.automated_reminder_risk is False |
| 222 | + assert row.status_label_risk == "repairable_drift" |
| 223 | + |
| 224 | + |
| 225 | +def test_issue314_classifier_blocks_contradictory_non_remindable_response(): |
| 226 | + decision, projection = _projection( |
| 227 | + 42, |
| 228 | + ("status: reviewer reassignment needed",), |
| 229 | + "reviewer_reassignment_needed", |
| 230 | + suppresses_overdue_reminder=False, |
| 231 | + ) |
| 232 | + input = issue314_state_health.Issue314StateHealthClassificationInput( |
| 233 | + state_issue_number=314, |
| 234 | + validation_nonce="nonce", |
| 235 | + active_review_rows=({"issue_number": 42, "review_data": {"current_reviewer": "alice"}},), |
| 236 | + live_snapshots={ |
| 237 | + 42: { |
| 238 | + "number": 42, |
| 239 | + "state": "open", |
| 240 | + "pull_request": {}, |
| 241 | + "labels": [{"name": "status: reviewer reassignment needed"}], |
| 242 | + } |
| 243 | + }, |
145 | 244 | reviewer_responses={42: decision}, |
146 | 245 | status_projections={42: projection}, |
147 | 246 | reminder_scans={42: scan_reviewer_reminder_comments([])}, |
|
0 commit comments