81 строка
1,8 КиБ
Go
81 строка
1,8 КиБ
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"reflect"
|
|
|
|
"github.com/cucumber/godog"
|
|
)
|
|
|
|
type apiFeature struct {
|
|
resp *httptest.ResponseRecorder
|
|
}
|
|
|
|
func (a *apiFeature) resetResponse(*godog.Scenario) {
|
|
a.resp = httptest.NewRecorder()
|
|
}
|
|
|
|
func (a *apiFeature) iSendrequestTo(method, endpoint string) (err error) {
|
|
req, err := http.NewRequest(method, endpoint, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// handle panic
|
|
defer func() {
|
|
switch t := recover().(type) {
|
|
case string:
|
|
err = fmt.Errorf(t)
|
|
case error:
|
|
err = t
|
|
}
|
|
}()
|
|
|
|
switch endpoint {
|
|
case "/version":
|
|
getVersion(a.resp, req)
|
|
default:
|
|
err = fmt.Errorf("unknown endpoint: %s", endpoint)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (a *apiFeature) theResponseCodeShouldBe(code int) error {
|
|
if code != a.resp.Code {
|
|
return fmt.Errorf("expected response code to be: %d, but actual is: %d", code, a.resp.Code)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *apiFeature) theResponseShouldMatchJSON(body *godog.DocString) (err error) {
|
|
var expected, actual interface{}
|
|
|
|
// re-encode expected response
|
|
if err = json.Unmarshal([]byte(body.Content), &expected); err != nil {
|
|
return
|
|
}
|
|
|
|
// re-encode actual response too
|
|
if err = json.Unmarshal(a.resp.Body.Bytes(), &actual); err != nil {
|
|
return
|
|
}
|
|
|
|
// the matching may be adapted per different requirements.
|
|
if !reflect.DeepEqual(expected, actual) {
|
|
return fmt.Errorf("expected JSON does not match actual, %v vs. %v", expected, actual)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func InitializeScenario(ctx *godog.ScenarioContext) {
|
|
api := &apiFeature{}
|
|
|
|
ctx.BeforeScenario(api.resetResponse)
|
|
|
|
ctx.Step(`^I send "(GET|POST|PUT|DELETE)" request to "([^"]*)"$`, api.iSendrequestTo)
|
|
ctx.Step(`^the response code should be (\d+)$`, api.theResponseCodeShouldBe)
|
|
ctx.Step(`^the response should match json:$`, api.theResponseShouldMatchJSON)
|
|
}
|