Skip to content

Commit bda7069

Browse files
wesmclaude
andcommitted
Use typed struct for safer JSON decoding in tests
- Add addressRequest struct to avoid unchecked type assertions - Check Decode errors explicitly with t.Fatalf - Assert reviewID=0 for queue view commands (intentional) - Add body validation to address-error test 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 4003d6a commit bda7069

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

cmd/roborev/tui_test.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,12 @@ func TestTUIToggleAddressedNoReview(t *testing.T) {
188188
}
189189
}
190190

191+
// addressRequest is used to decode and validate POST body in tests
192+
type addressRequest struct {
193+
ReviewID int64 `json:"review_id"`
194+
Addressed bool `json:"addressed"`
195+
}
196+
191197
func TestTUIAddressReviewInBackgroundSuccess(t *testing.T) {
192198
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
193199
switch {
@@ -198,13 +204,15 @@ func TestTUIAddressReviewInBackgroundSuccess(t *testing.T) {
198204
review := storage.Review{ID: 10, Addressed: false}
199205
json.NewEncoder(w).Encode(review)
200206
case r.URL.Path == "/api/review/address" && r.Method == http.MethodPost:
201-
var req map[string]interface{}
202-
json.NewDecoder(r.Body).Decode(&req)
203-
if req["review_id"].(float64) != 10 {
204-
t.Errorf("Expected review_id=10, got %v", req["review_id"])
207+
var req addressRequest
208+
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
209+
t.Fatalf("Failed to decode request body: %v", err)
205210
}
206-
if req["addressed"].(bool) != true {
207-
t.Errorf("Expected addressed=true, got %v", req["addressed"])
211+
if req.ReviewID != 10 {
212+
t.Errorf("Expected review_id=10, got %d", req.ReviewID)
213+
}
214+
if req.Addressed != true {
215+
t.Errorf("Expected addressed=true, got %v", req.Addressed)
208216
}
209217
json.NewEncoder(w).Encode(map[string]bool{"success": true})
210218
default:
@@ -233,6 +241,10 @@ func TestTUIAddressReviewInBackgroundSuccess(t *testing.T) {
233241
if result.reviewView {
234242
t.Error("Expected reviewView=false for queue view command")
235243
}
244+
// reviewID is intentionally 0 for queue view commands (only jobID is set)
245+
if result.reviewID != 0 {
246+
t.Errorf("Expected reviewID=0 for queue view, got %d", result.reviewID)
247+
}
236248
}
237249

238250
func TestTUIAddressReviewInBackgroundNotFound(t *testing.T) {
@@ -320,6 +332,17 @@ func TestTUIAddressReviewInBackgroundAddressError(t *testing.T) {
320332
review := storage.Review{ID: 10, Addressed: false}
321333
json.NewEncoder(w).Encode(review)
322334
case r.URL.Path == "/api/review/address" && r.Method == http.MethodPost:
335+
// Validate request body before returning error
336+
var req addressRequest
337+
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
338+
t.Fatalf("Failed to decode request body: %v", err)
339+
}
340+
if req.ReviewID != 10 {
341+
t.Errorf("Expected review_id=10, got %d", req.ReviewID)
342+
}
343+
if req.Addressed != true {
344+
t.Errorf("Expected addressed=true, got %v", req.Addressed)
345+
}
323346
w.WriteHeader(http.StatusInternalServerError)
324347
default:
325348
t.Fatalf("Unexpected request: %s %s", r.Method, r.URL.Path)

0 commit comments

Comments
 (0)