174 lines
6.2 KiB
Go
174 lines
6.2 KiB
Go
package testhelper
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"encoding/xml"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/common/dbbasemodel"
|
|
"github.com/julienschmidt/httprouter"
|
|
)
|
|
|
|
var Now = time.Now()
|
|
var Timestamp = dbbasemodel.DBModelBase{
|
|
CreatedAt: &Now,
|
|
UpdatedAt: &Now,
|
|
}
|
|
|
|
type BasicHttpTest struct {
|
|
Name string
|
|
Request *http.Request
|
|
ExpectedStatus int
|
|
ExpectedResponse string
|
|
}
|
|
|
|
// TestErrorTemplate test failure message
|
|
const TestErrorTemplate string = "%s test.\nExpected '%v'.\nGot '%v'"
|
|
const TestErrorTemplate2 string = "%s test.\nExpected '%v':'%v'.\nGot '%v'"
|
|
|
|
// ExecHTTPHandler passes request to handler and returns test response recorder
|
|
func ExecHTTPHandler(handler http.HandlerFunc, request *http.Request) *httptest.ResponseRecorder {
|
|
recorder := httptest.NewRecorder()
|
|
|
|
handler(recorder, request)
|
|
|
|
return recorder
|
|
}
|
|
|
|
func ExecHTTPRouterHandler(handler http.HandlerFunc, routePath string, request *http.Request) *httptest.ResponseRecorder {
|
|
recorder := httptest.NewRecorder()
|
|
|
|
router := httprouter.New()
|
|
router.HandlerFunc(request.Method, routePath, handler)
|
|
router.ServeHTTP(recorder, request)
|
|
|
|
return recorder
|
|
}
|
|
|
|
func MakeTestRequest(method string, path string, body interface{}) *http.Request {
|
|
data, _ := json.Marshal(body)
|
|
req, _ := http.NewRequest(method, path, bytes.NewBuffer(data))
|
|
req.RequestURI = path
|
|
|
|
return req
|
|
}
|
|
|
|
func MakeTestRequestRawBody(method string, path string, data []byte) *http.Request {
|
|
req, _ := http.NewRequest(method, path, bytes.NewBuffer(data))
|
|
req.RequestURI = path
|
|
|
|
return req
|
|
}
|
|
|
|
func MakeXMLTestRequest(method string, path string, body interface{}) *http.Request {
|
|
data, _ := xml.Marshal(body)
|
|
req, _ := http.NewRequest(method, path, bytes.NewBuffer(data))
|
|
req.RequestURI = path
|
|
|
|
return req
|
|
}
|
|
|
|
func AddValueToContext(r *http.Request, valkey interface{}, value interface{}) *http.Request {
|
|
ctx := context.WithValue(r.Context(), valkey, value)
|
|
return r.WithContext(ctx)
|
|
}
|
|
|
|
func AddParamsToContext(r *http.Request, params httprouter.Params) *http.Request {
|
|
ctx := context.WithValue(r.Context(), httprouter.ParamsKey, params)
|
|
return r.WithContext(ctx)
|
|
}
|
|
|
|
func MakeTestRequestWithHeaders(method string, path string, headers map[string]string, body interface{}) *http.Request {
|
|
request := MakeTestRequest(method, path, body)
|
|
|
|
for key, value := range headers {
|
|
request.Header.Add(key, value)
|
|
}
|
|
|
|
return request
|
|
}
|
|
|
|
func MakeTestMultipartRequest(path string, form string, boundary string, headers map[string]string) *http.Request {
|
|
request, _ := http.NewRequest(http.MethodPost, path, ioutil.NopCloser(strings.NewReader(form)))
|
|
request.Header.Add("Content-Type", fmt.Sprintf("multipart/form-data; boundary=%s", boundary))
|
|
for key, value := range headers {
|
|
request.Header.Add(key, value)
|
|
}
|
|
return request
|
|
}
|
|
|
|
func MakeTestRequestFakeAuthHeader(method string, path string, body interface{}) *http.Request {
|
|
const token = "eyJraWQiOiJzUFVaTlZOMnZXSUhrOVd2N3FUeXROYTY5Q3NaK3JBSFloTDVtRm9QV0p3PSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJhN2Y1OTUxMi0xZWM3LTQ4OGUtYmIxYy01ZWMwMjYwNzc3NGEiLCJldmVudF9pZCI6IjdkM2Y4OWQ5LTA3ZjQtNDVlNC05ZDE4LTc4OWEwOTQzNjIwMiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2MjU2MjA1MjYsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC51cy13ZXN0LTIuYW1hem9uYXdzLmNvbVwvdXMtd2VzdC0yX2M3UXU5MW0zSiIsImV4cCI6MTYyNTcwNjkyNiwiaWF0IjoxNjI1NjIwNTI2LCJqdGkiOiIxOTkxNWIyMC1hNWY3LTQwM2YtOWEzMi03NTUyNWRkZGNlMTQiLCJjbGllbnRfaWQiOiIyODJuOWhmZ2NoaG12cGhwamVvMGpicDkxZyIsInVzZXJuYW1lIjoiZjY4NzczOGMtNmZkNC00ZGFjLWI3MDAtMDg1OWI2OWQxODQ4In0.KD54niJe71TiVZTbiK384WTTulKWk89bdlwE-0_ldznr1nQqxinYjG8Omg1zqKvfidoD2OIpCujUhE5K6T2zMynHGxUfxPhcaux4TQw5luV1A8EMzo3bFTLnOzoo3KdtJLx7_5i3RmOSaxaXtNBau-DWWjuruN9EDgYILrwptMNaUV9MFFDrCqJxkftz0hrmce4v9xoI7F28FIqlfilvDK5YH_VuDFfNTKm8-EsXu3tt4RmRwDgSnxb9-u-bfKSy5ROOPHRb0o2-vKhP0Kk3Muf8SB8K479Ts4xxP0l1LHAKM26aAf0jQO2o1yFzAJPja5RIkLMLv_3pA7Tn5rx97A"
|
|
req := MakeTestRequestWithHeaders(method, path, map[string]string{
|
|
"Authorization": strings.Join([]string{"Bearer", token}, " "),
|
|
}, body)
|
|
|
|
identity := map[string]interface{}{
|
|
"sub": "162e57ce-39c4-40f1-a232-cea5d3fe50e4",
|
|
"email_verified": true,
|
|
"iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2_SEgxwcFms",
|
|
"phone_number_verified": false,
|
|
"username": "162e57ce-39c4-40f1-a232-cea5d3fe50e4",
|
|
"firstname": "First",
|
|
"aud": "4jj6pokr1ajuab5t4o2i2g069l",
|
|
"event_id": "ee6eae01-eba5-48a6-92f8-e019f8a32541",
|
|
"token_use": "id",
|
|
"auth_time": 1622221405,
|
|
"phonenumber": "+17601234567",
|
|
"exp": 1622307805,
|
|
"iat": 1622221405,
|
|
"lastname": "Last",
|
|
"email": "test@fiskerinc.com",
|
|
}
|
|
|
|
ctx := req.Context()
|
|
ctx = context.WithValue(ctx, "identity", identity)
|
|
return req.WithContext(ctx)
|
|
}
|
|
|
|
func RunBasicHttpTest(t *testing.T, test BasicHttpTest, handler http.HandlerFunc) *httptest.ResponseRecorder {
|
|
w := ExecHTTPHandler(handler, test.Request)
|
|
|
|
if w.Result().StatusCode != test.ExpectedStatus {
|
|
t.Errorf(TestErrorTemplate, test.Name, test.ExpectedStatus, w.Result().StatusCode)
|
|
}
|
|
|
|
if w.Body.String() != test.ExpectedResponse {
|
|
t.Errorf(TestErrorTemplate, test.Name, test.ExpectedResponse, w.Body.String())
|
|
}
|
|
return w
|
|
}
|
|
|
|
func RunBasicHttpTests(t *testing.T, tests []BasicHttpTest, handler http.HandlerFunc) {
|
|
for _, test := range tests {
|
|
RunBasicHttpTest(t, test, handler)
|
|
}
|
|
}
|
|
|
|
func RunParamHttpTest(t *testing.T, test BasicHttpTest, handler http.HandlerFunc, routePath string) *httptest.ResponseRecorder {
|
|
w := ExecHTTPRouterHandler(handler, routePath, test.Request)
|
|
|
|
if w.Result().StatusCode != test.ExpectedStatus {
|
|
t.Errorf(TestErrorTemplate, test.Name, test.ExpectedStatus, w.Result().StatusCode)
|
|
}
|
|
|
|
if w.Body.String() != test.ExpectedResponse {
|
|
t.Errorf(TestErrorTemplate, test.Name, test.ExpectedResponse, w.Body.String())
|
|
}
|
|
return w
|
|
}
|
|
|
|
func RunParamHttpTests(t *testing.T, tests []BasicHttpTest, handler http.HandlerFunc, routePath string) {
|
|
for _, test := range tests {
|
|
RunParamHttpTest(t, test, handler, routePath)
|
|
}
|
|
}
|