From c59880de3cd54955ef11b4187daf7f930badb5e2 Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Thu, 26 Mar 2026 17:15:55 -0400 Subject: internal/api: add unmarshalResponse Add a useful helper. Use it once. We must use it at least once to pass our check for unused functions. Change-Id: Ied063f74dc7e3bc7dc7c12d4a17b0e55680951ad Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/759840 LUCI-TryBot-Result: Go LUCI kokoro-CI: kokoro Reviewed-by: Ethan Lee --- internal/api/api_test.go | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) (limited to 'internal/api') diff --git a/internal/api/api_test.go b/internal/api/api_test.go index 50c11327..caa620b4 100644 --- a/internal/api/api_test.go +++ b/internal/api/api_test.go @@ -5,8 +5,10 @@ package api import ( + "bytes" "context" "encoding/json" + "errors" "net/http" "net/http/httptest" "strconv" @@ -206,23 +208,12 @@ func TestServePackage(t *testing.T) { } if test.want != nil { - switch want := test.want.(type) { - case *Package: - var got Package - if err := json.Unmarshal(w.Body.Bytes(), &got); err != nil { - t.Fatalf("json.Unmarshal Package: %v", err) - } - if diff := cmp.Diff(want, &got); diff != "" { - t.Errorf("mismatch (-want +got):\n%s", diff) - } - case *Error: - var got Error - if err := json.Unmarshal(w.Body.Bytes(), &got); err != nil { - t.Fatalf("json.Unmarshal Error: %v. Body: %s", err, w.Body.String()) - } - if diff := cmp.Diff(want, &got); diff != "" { - t.Errorf("mismatch (-want +got):\n%s", diff) - } + got, err := unmarshalResponse[Package](w.Body.Bytes()) + if err != nil { + t.Fatal(err) + } + if diff := cmp.Diff(test.want, got); diff != "" { + t.Errorf("mismatch (-want +got):\n%s", diff) } } }) @@ -710,3 +701,23 @@ func TestServePackageSymbols(t *testing.T) { }) } } + +// unmarshalResponse unmarshals an API response into either +// a *T or an *Error. +func unmarshalResponse[T any](data []byte) (any, error) { + d := json.NewDecoder(bytes.NewReader(data)) + d.DisallowUnknownFields() + var t T + err1 := d.Decode(&t) + if err1 == nil { + return &t, nil + } + d = json.NewDecoder(bytes.NewReader(data)) + d.DisallowUnknownFields() + var e Error + err2 := d.Decode(&e) + if err2 == nil { + return &e, nil + } + return nil, errors.Join(err1, err2) +} -- cgit v1.3