Mock payload to be sent as data
|
var mockPayload = map [ string ] interface { } {
"color_s" : "blue" ,
"extra_data_m" : map [ string ] interface { } {
"param1" : 1 ,
"param2" : false ,
} ,
}
var headerTestsWithData = [ ] struct {
testName string
fName functionWithData
expectedHeader int
} {
{ "responses.SendOK" , responses . SendOK , http . StatusOK } ,
{ "responses.SendCreated" , responses . SendCreated , http . StatusCreated } ,
{ "responses.SendAccepted" , responses . SendAccepted , http . StatusAccepted } ,
}
var headerTestsWithoutData = [ ] struct {
testName string
fName functionWithoutData
expectedHeader int
} {
{ "responses.SendBadRequest" , responses . SendBadRequest , http . StatusBadRequest } ,
{ "responses.SendUnauthorized" , responses . SendUnauthorized , http . StatusUnauthorized } ,
{ "responses.SendForbidden" , responses . SendForbidden , http . StatusForbidden } ,
{ "responses.SendForbidden" , responses . SendForbidden , http . StatusForbidden } ,
{ "responses.SendNotFound" , responses . SendNotFound , http . StatusNotFound } ,
{ "responses.SendInternalServerError" , responses . SendInternalServerError , http . StatusInternalServerError } ,
{ "responses.SendServiceUnavailable" , responses . SendServiceUnavailable , http . StatusServiceUnavailable } ,
}
var sendTests = [ ] struct {
testName string
statusCode int
expectedStatus int
data interface { }
expectedData string
} {
{
"responses.Send(http.StatusInternalServerError, ...)" ,
http . StatusInternalServerError ,
http . StatusInternalServerError ,
"unable to connect to the database" ,
`{"status": "unable to connect to the database"}` ,
} ,
{
"responses.Send(http.StatusInternalServerError, ...)" ,
http . StatusBadRequest ,
http . StatusBadRequest ,
"wrong ID format" ,
`{"status": "wrong ID format"}` ,
} ,
{
"responses.Send(http.StatusOK, ...)" ,
http . StatusOK ,
http . StatusOK ,
map [ string ] interface { } { "list_of_something" : [ ] string { } } ,
`{"list_of_something": []}` ,
} ,
{
"responses.Send(http.StatusOK, ...)" ,
http . StatusOK ,
http . StatusOK ,
[ ] byte { 123 , 34 , 107 , 101 , 121 , 49 , 34 , 58 , 32 , 34 , 104 , 101 , 108 , 108 , 111 , 32 , 119 , 111 , 114 , 108 , 100 , 34 , 125 } ,
`{"key1": "hello world"}` ,
} ,
}
func closeResponseBody ( t * testing . T , response * http . Response ) {
err := response . Body . Close ( )
if err != nil {
t . Fatal ( err )
}
}
|
checkResponse checks status code against the expected one and check content-type + payload
|
func checkResponse (
url string ,
expectedStatusCode int ,
checkPayload bool ,
expectedBody string ,
t * testing . T ,
) {
res , err := http . Get ( url )
if err != nil {
t . Fatal ( err )
}
if res . StatusCode != expectedStatusCode {
t . Errorf ( "Expected status code %v, got %v" , expectedStatusCode , res . StatusCode )
}
if checkPayload {
contentType := res . Header . Get ( contentType )
if contentType != appJSON {
t . Errorf ( "Unexpected content type. Expected %v, got %v" , appJSON , contentType )
}
body , err := io . ReadAll ( res . Body )
if err != nil {
t . Fatal ( err )
}
defer closeResponseBody ( t , res )
fmt . Println ( body )
var expected map [ string ] interface { }
err = json . NewDecoder ( strings . NewReader ( expectedBody ) ) . Decode ( & expected )
if err != nil {
t . Fatalf ( "Response body is not JSON" )
}
var response map [ string ] interface { }
err = json . Unmarshal ( body , & response )
if err != nil {
t . Fatal ( err )
}
if equal := reflect . DeepEqual ( response , expected ) ; ! equal {
t . Errorf ( `Expected response "%+v", got "%+v"` , expected , response )
}
}
}
|
TestHeaders run table tests to test StatusCodes and payloads.
|
func TestHeaders ( t * testing . T ) {
for _ , test := range headerTestsWithData {
t . Run ( test . testName , func ( t * testing . T ) {
testServer := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
err := test . fName ( w , mockPayload )
if err != nil {
t . Fatal ( err )
}
} ) )
defer testServer . Close ( )
const expectedBody = `{"color_s":"blue","extra_data_m":{"param1":1,"param2":false}}`
checkResponse (
testServer . URL ,
test . expectedHeader ,
true ,
expectedBody ,
t ,
)
} )
}
for _ , test := range headerTestsWithoutData {
t . Run ( test . testName , func ( t * testing . T ) {
testServer := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
err := test . fName ( w , "Test Status" )
if err != nil {
t . Fatal ( err )
}
} ) )
defer testServer . Close ( )
checkResponse (
testServer . URL ,
test . expectedHeader ,
false ,
"" ,
t ,
)
} )
}
t . Run ( "responses.SendNoContent" , func ( t * testing . T ) {
testServer := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
err := responses . SendNoContent ( w )
if err != nil {
t . Fatal ( err )
}
} ) )
defer testServer . Close ( )
checkResponse (
testServer . URL ,
http . StatusNoContent ,
false ,
"" ,
t ,
)
} )
for _ , test := range sendTests {
t . Run ( test . testName , func ( t * testing . T ) {
testServer := httptest . NewServer ( http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
err := responses . Send ( test . statusCode , w , test . data )
if err != nil {
t . Fatal ( err )
}
} ) )
defer testServer . Close ( )
checkResponse (
testServer . URL ,
test . expectedStatus ,
true ,
test . expectedData ,
t ,
)
} )
}
}
|