grab/http/http_test.go

71 lines
1.3 KiB
Go

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()
}
}
}