Files
cloud-services/pkg/testhelper/testhelper.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)
}
}