140 lines
3.6 KiB
Go
140 lines
3.6 KiB
Go
package test
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
|
|
"allaboutapps.dev/aw/go-starter/internal/api"
|
|
"github.com/go-openapi/runtime"
|
|
"github.com/go-openapi/strfmt"
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
type GenericPayload map[string]interface{}
|
|
type GenericArrayPayload []interface{}
|
|
|
|
func (g GenericPayload) Reader(t TestingT) *bytes.Reader {
|
|
t.Helper()
|
|
|
|
b, err := json.Marshal(g)
|
|
if err != nil {
|
|
t.Fatalf("failed to serialize payload: %v", err)
|
|
}
|
|
|
|
return bytes.NewReader(b)
|
|
}
|
|
|
|
func (g GenericArrayPayload) Reader(t TestingT) *bytes.Reader {
|
|
t.Helper()
|
|
|
|
b, err := json.Marshal(g)
|
|
if err != nil {
|
|
t.Fatalf("failed to serialize payload: %v", err)
|
|
}
|
|
|
|
return bytes.NewReader(b)
|
|
}
|
|
|
|
func PerformRequestWithParams(t TestingT, s *api.Server, method string, path string, body GenericPayload, headers http.Header, queryParams map[string]string) *httptest.ResponseRecorder {
|
|
t.Helper()
|
|
|
|
if body == nil {
|
|
return PerformRequestWithRawBody(t, s, method, path, nil, headers, queryParams)
|
|
}
|
|
|
|
return PerformRequestWithRawBody(t, s, method, path, body.Reader(t), headers, queryParams)
|
|
}
|
|
|
|
func PerformRequestWithArrayAndParams(t TestingT, s *api.Server, method string, path string, body GenericArrayPayload, headers http.Header, queryParams map[string]string) *httptest.ResponseRecorder {
|
|
t.Helper()
|
|
|
|
if body == nil {
|
|
return PerformRequestWithRawBody(t, s, method, path, nil, headers, queryParams)
|
|
}
|
|
|
|
return PerformRequestWithRawBody(t, s, method, path, body.Reader(t), headers, queryParams)
|
|
}
|
|
|
|
func PerformRequestWithRawBody(t TestingT, s *api.Server, method string, path string, body io.Reader, headers http.Header, queryParams map[string]string) *httptest.ResponseRecorder {
|
|
t.Helper()
|
|
|
|
req := httptest.NewRequest(method, path, body)
|
|
|
|
if headers != nil {
|
|
req.Header = headers
|
|
}
|
|
if body != nil && len(req.Header.Get(echo.HeaderContentType)) == 0 {
|
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
|
}
|
|
|
|
if queryParams != nil {
|
|
q := req.URL.Query()
|
|
for k, v := range queryParams {
|
|
q.Add(k, v)
|
|
}
|
|
|
|
req.URL.RawQuery = q.Encode()
|
|
}
|
|
|
|
res := httptest.NewRecorder()
|
|
|
|
s.Echo.ServeHTTP(res, req)
|
|
|
|
return res
|
|
}
|
|
|
|
func PerformRequest(t TestingT, s *api.Server, method string, path string, body GenericPayload, headers http.Header) *httptest.ResponseRecorder {
|
|
t.Helper()
|
|
|
|
return PerformRequestWithParams(t, s, method, path, body, headers, nil)
|
|
}
|
|
|
|
func PerformRequestWithArray(t TestingT, s *api.Server, method string, path string, body GenericArrayPayload, headers http.Header) *httptest.ResponseRecorder {
|
|
t.Helper()
|
|
|
|
return PerformRequestWithArrayAndParams(t, s, method, path, body, headers, nil)
|
|
}
|
|
|
|
func ParseResponseBody(t TestingT, res *httptest.ResponseRecorder, v interface{}) {
|
|
t.Helper()
|
|
|
|
if err := json.NewDecoder(res.Result().Body).Decode(&v); err != nil {
|
|
t.Fatalf("Failed to parse response body: %v", err)
|
|
}
|
|
}
|
|
|
|
func ParseResponseAndValidate(t TestingT, res *httptest.ResponseRecorder, v runtime.Validatable) {
|
|
t.Helper()
|
|
|
|
ParseResponseBody(t, res, &v)
|
|
|
|
if err := v.Validate(strfmt.Default); err != nil {
|
|
t.Fatalf("Failed to validate response: %v", err)
|
|
}
|
|
}
|
|
|
|
func HeadersWithAuth(t TestingT, token string) http.Header {
|
|
t.Helper()
|
|
|
|
return HeadersWithConfigurableAuth(t, "Bearer", token)
|
|
}
|
|
|
|
func HeadersWithConfigurableAuth(t TestingT, scheme string, token string) http.Header {
|
|
t.Helper()
|
|
|
|
headers := http.Header{}
|
|
headers.Set(echo.HeaderAuthorization, fmt.Sprintf("%s %s", scheme, token))
|
|
|
|
return headers
|
|
}
|
|
|
|
func HeadersWithAPIKeyAuth(t TestingT, token string) http.Header {
|
|
t.Helper()
|
|
|
|
return HeadersWithConfigurableAuth(t, "APIKey", token)
|
|
}
|