package grabhttp import ( "bytes" "io" "net/http" "net/http/httptest" "testing" ) func TestWriteJSON(t *testing.T) { testcases := []struct { input interface{} code int outcode int output []byte }{ { input: struct{}{}, code: http.StatusOK, output: []byte("{}\n"), }, { input: struct{}{}, code: http.StatusNotFound, output: []byte("{}\n"), }, { input: struct { Foo string }{ Foo: "foo", }, code: http.StatusOK, output: []byte(`{"Foo":"foo"}` + "\n"), }, { input: struct { Foo struct { Bar string `json:"quuz"` } }{ Foo: struct { Bar string `json:"quuz"` }{Bar: "foo"}, }, code: http.StatusOK, output: []byte(`{"Foo":{"quuz":"foo"}}` + "\n"), }, { input: struct{ C func() }{C: func() {}}, code: http.StatusOK, outcode: http.StatusInternalServerError, output: []byte(`{"status":"error","error":"json: unsupported type: func()"}` + "\n"), }, } for i, c := range testcases { w := httptest.NewRecorder() WriteJSON(c.input, c.code, w, httptest.NewRequest("", "/", nil)) if w.Code != c.code && w.Code != c.outcode { t.Logf("code mismatch on case %d", i) t.Fail() } b, err := io.ReadAll(w.Body) if err != nil || !bytes.Equal(b, c.output) { t.Logf("failed: %s != %s", b, c.output) t.Fail() } } }