vspd/client/client_test.go
jholdstock be79a8e279 client: Hard-code validate func.
The client supported overriding the default server signature validation func. This was originally added to facilitate testing, but at the moment only serves to make using the client more clunky and error prone.
2023-03-15 10:46:13 +00:00

92 lines
2.3 KiB
Go

package client
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"testing"
"github.com/decred/slog"
"github.com/decred/vspd/types"
)
// TestErrorDetails ensures errors returned by client.do contain adequate
// information for debugging (HTTP status and response body).
func TestErrorDetails(t *testing.T) {
tests := map[string]struct {
httpStatus int
responseBodyBytes []byte
expectedErr string
vspdError bool
}{
"500, vspd error": {
httpStatus: 500,
responseBodyBytes: []byte(`{"code": 1, "message": "bad request"}`),
expectedErr: `bad request`,
vspdError: true,
},
"500, no body": {
httpStatus: 500,
responseBodyBytes: nil,
expectedErr: `http status 500 (Internal Server Error) with no body`,
vspdError: false,
},
"500, non vspd error": {
httpStatus: 500,
responseBodyBytes: []byte(`an error occurred`),
expectedErr: `http status 500 (Internal Server Error) with body "an error occurred"`,
vspdError: false,
},
"500, non vspd error (json)": {
httpStatus: 500,
responseBodyBytes: []byte(`{"some": "json"}`),
expectedErr: `http status 500 (Internal Server Error) with body "{\"some\": \"json\"}"`,
vspdError: false,
},
}
for testName, testData := range tests {
t.Run(testName, func(t *testing.T) {
testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
res.WriteHeader(testData.httpStatus)
_, err := res.Write(testData.responseBodyBytes)
if err != nil {
t.Fatalf("writing response body failed: %v", err)
}
}))
client := Client{
URL: testServer.URL,
PubKey: []byte("fake pubkey"),
Log: slog.Disabled,
}
var resp interface{}
err := client.do(context.TODO(), http.MethodGet, "", nil, &resp, nil)
testServer.Close()
if err == nil {
t.Fatalf("client.do did not return an error")
}
if err.Error() != testData.expectedErr {
t.Fatalf("client.do returned incorrect error, expected %q, got %q",
testData.expectedErr, err.Error())
}
if testData.vspdError {
// Error should be unwrappable as a vspd error response.
var e types.ErrorResponse
if !errors.As(err, &e) {
t.Fatal("unable to unwrap vspd error")
}
}
})
}
}