82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/mock"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type mockAPI struct {
|
|
ts *httptest.Server
|
|
t *testing.T
|
|
mock.Mock
|
|
}
|
|
|
|
func setupMockAPI(t *testing.T) (*mockAPI, *Client) {
|
|
mapi := mockAPI{t: t}
|
|
mapi.Test(t)
|
|
mapi.ts = httptest.NewServer(&mapi)
|
|
t.Cleanup(func() {
|
|
mapi.ts.Close()
|
|
mapi.Mock.AssertExpectations(t)
|
|
})
|
|
|
|
cfg := DefaultConfig()
|
|
cfg.Address = mapi.ts.URL
|
|
|
|
client, err := NewClient(cfg)
|
|
require.NoError(t, err)
|
|
return &mapi, client
|
|
}
|
|
|
|
func (m *mockAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
var body interface{}
|
|
|
|
if r.Body != nil {
|
|
bodyBytes, err := io.ReadAll(r.Body)
|
|
if err == nil && len(bodyBytes) > 0 {
|
|
body = bodyBytes
|
|
|
|
var bodyMap map[string]interface{}
|
|
if err := json.Unmarshal(bodyBytes, &bodyMap); err != nil {
|
|
body = bodyMap
|
|
}
|
|
}
|
|
}
|
|
|
|
ret := m.Called(r.Method, r.URL.Path, body)
|
|
|
|
if replyFn, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request)); ok {
|
|
replyFn(w, r)
|
|
return
|
|
}
|
|
}
|
|
|
|
func (m *mockAPI) static(method string, path string, body interface{}) *mock.Call {
|
|
return m.On("ServeHTTP", method, path, body)
|
|
}
|
|
|
|
func (m *mockAPI) withReply(method, path string, body interface{}, status int, reply interface{}) *mock.Call {
|
|
return m.static(method, path, body).Return(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(status)
|
|
|
|
if reply == nil {
|
|
return
|
|
}
|
|
|
|
rdr, ok := reply.(io.Reader)
|
|
if ok {
|
|
io.Copy(w, rdr)
|
|
return
|
|
}
|
|
|
|
enc := json.NewEncoder(w)
|
|
require.NoError(m.t, enc.Encode(reply))
|
|
})
|
|
}
|