README
¶
Table of Contents generated with DocToc
httpspec
httpspec allow you to create HTTP API specifications with ease.
Documentation
The documentation maintained in GoDoc, including the examples.
Usage
package mypkg_test
import (
"encoding/json"
"net/http"
"testing"
"my/pkg/path/mypkg"
"github.com/stretchr/testify/require"
"github.com/adamluzsi/testcase"
. "github.com/adamluzsi/testcase/httpspec"
)
func TestMyHandlerCreate(t *testing.T) {
s := testcase.NewSpec(t)
GivenThisIsAJSONAPI(s)
// Arrange
LetHandler(s, func(t *testcase.T) http.Handler { return mypkg.MyHandler{} })
LetMethodValue(s, http.MethodPost)
LetPathValue(s, `/`)
LetBody(s, func(t *testcase.T) interface{} {
// this will end up as {"foo":"bar"} in the request body
return map[string]string{"foo": "bar"}
})
s.Then(`it will...`, func(t *testcase.T) {
rr := ServeHTTP(t) // Act
require.Equal(t, http.StatusOK, rr.Code)
var resp mypkg.CreateResponse
require.Nil(t, json.Unmarshal(rr.Body.Bytes(), &resp))
// more assertion
})
}
package mypkg_test
import (
"encoding/json"
"net/http"
"testing"
"my/pkg/path/mypkg"
"github.com/stretchr/testify/require"
"github.com/adamluzsi/testcase"
. "github.com/adamluzsi/testcase/httpspec"
)
func TestMyHandler(t *testing.T) {
s := testcase.NewSpec(t)
GivenThisIsAJSONAPI(s)
LetHandler(s, func(t *testcase.T) http.Handler { return mypkg.MyHandler{} })
s.Describe(`POST / - create X`, func(s *testcase.Spec) {
LetMethodValue(s, http.MethodPost)
LetPathValue(s, `/`)
LetBody(s, func(t *testcase.T) interface{} {
// this will end up as {"foo":"bar"} in the request body
return map[string]string{"foo": "bar"}
})
var onSuccess = func(t *testcase.T) mypkg.CreateResponse {
rr := ServeHTTP(t)
require.Equal(t, http.StatusOK, rr.Code)
var resp mypkg.CreateResponse
require.Nil(t, json.Unmarshal(rr.Body.Bytes(), &resp))
return resp
}
s.Then(`it will create a new resource`, func(t *testcase.T) {
createResponse := onSuccess(t)
// assert
_ = createResponse
})
})
}
Documentation
¶
Index ¶
- Constants
- Variables
- func GivenThisIsAJSONAPI(s *testcase.Spec)
- func GivenThisIsAnAPI(s *testcase.Spec)
- func Header(t *testcase.T) http.Header
- func LetBody(s *testcase.Spec, f func(t *testcase.T) interface{})
- func LetContext(s *testcase.Spec, f func(t *testcase.T) context.Context)
- func LetHandler(s *testcase.Spec, f func(t *testcase.T) http.Handler)
- func LetMethod(s *testcase.Spec, f func(t *testcase.T) string)
- func LetMethodValue(s *testcase.Spec, m string)
- func LetPath(s *testcase.Spec, f func(t *testcase.T) string)
- func LetPathValue(s *testcase.Spec, p string)
- func Query(t *testcase.T) url.Values
- func ServeHTTP(t *testcase.T) *httptest.ResponseRecorder
Examples ¶
Constants ¶
const ( RequestContextVarName = requestAttributePrefix + `context` RequestMethodVarName = requestAttributePrefix + `method` RequestPathVarName = requestAttributePrefix + `path` RequestQueryVarName = requestAttributePrefix + `query` RequestHeaderVarName = requestAttributePrefix + `header` RequestBodyVarName = requestAttributePrefix + `body` RequestHandlerVarName = requestAttributePrefix + `handler` )
Variables ¶
var Debug bool
Debug enables debug logs for httpspec
Functions ¶
func Header ¶
Header allows you to set the current test scope's http path for ServeHTTP.
Example ¶
Output:
func LetBody ¶
LetBody allow you to define a http request body value for the ServeHTTP. The value of this can be a struct, map or url.Values. The Serialization for the request body is based on the Header "Content-Type" value. Currently only json and form url encoding is supported.
Example ¶
Output:
func LetContext ¶
LetContext allow you to Set the ServeHTTP request context
Example ¶
Output:
Example (WithValue) ¶
Output:
func LetHandler ¶
LetHandler is the subject of a HTTP Spec. You must set for all the spec
func LetMethod ¶
LetMethod allow you to set the current test scope's http method for ServeHTTP
Example ¶
Output:
func LetMethodValue ¶
LetMethodValue allow you to set the current test scope's http method for ServeHTTP
Example ¶
Output:
func LetPathValue ¶
LetPathValue allows you to set the current test scope's http path for ServeHTTP.
func Query ¶
Query allows you to retrieve the current test scope's http path query that will be used for ServeHTTP. In a Before Block you can access the query and then specify the values in it.
Example ¶
Output:
func ServeHTTP ¶
func ServeHTTP(t *testcase.T) *httptest.ResponseRecorder
ServeHTTP will make a request to the spec context it requires the following spec variables
- method -> http method <string>
- path -> http path <string>
- query -> http query string <url.Values>
- body -> http payload <io.Reader|io.ReadCloser>
Types ¶
This section is empty.