Initial cloud-services repo - gateway service + pkg modules
This commit is contained in:
173
pkg/testhelper/testhelper.go
Normal file
173
pkg/testhelper/testhelper.go
Normal file
@@ -0,0 +1,173 @@
|
||||
package testhelper
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"fiskerinc.com/modules/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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user