iris/httptest/httptest.go
Gerasimos (Makis) Maropoulos 2a4ce876b6
add the stale release
2020-08-12 23:41:20 +03:00

173 lines
4.6 KiB
Go

package httptest
import (
"crypto/tls"
"net/http"
"net/http/httptest"
"testing"
"github.com/kataras/iris"
"github.com/kataras/iris/context"
"github.com/kataras/iris/core/router"
"github.com/iris-contrib/httpexpect/v2"
)
type (
// OptionSetter sets a configuration field to the configuration
OptionSetter interface {
// Set receives a pointer to the Configuration type and does the job of filling it
Set(c *Configuration)
}
// OptionSet implements the OptionSetter
OptionSet func(c *Configuration)
)
// Set is the func which makes the OptionSet an OptionSetter, this is used mostly
func (o OptionSet) Set(c *Configuration) {
o(c)
}
// Configuration httptest configuration
type Configuration struct {
// URL the base url.
// Defaults to empty string "".
URL string
// Debug if true then debug messages from the httpexpect will be shown when a test runs
// Defaults to false.
Debug bool
// LogLevel sets the application's log level.
// Defaults to "disable" when testing.
LogLevel string
}
// Set implements the OptionSetter for the Configuration itself
func (c Configuration) Set(main *Configuration) {
main.URL = c.URL
main.Debug = c.Debug
if c.LogLevel != "" {
main.LogLevel = c.LogLevel
}
}
var (
// URL if set then it sets the httptest's BaseURL.
// Defaults to empty string "".
URL = func(schemeAndHost string) OptionSet {
return func(c *Configuration) {
c.URL = schemeAndHost
}
}
// Debug if true then debug messages from the httpexpect will be shown when a test runs
// Defaults to false.
Debug = func(val bool) OptionSet {
return func(c *Configuration) {
c.Debug = val
}
}
// LogLevel sets the application's log level "val".
// Defaults to disabled when testing.
LogLevel = func(val string) OptionSet {
return func(c *Configuration) {
c.LogLevel = val
}
}
)
// DefaultConfiguration returns the default configuration for the httptest.
func DefaultConfiguration() *Configuration {
return &Configuration{URL: "", Debug: false, LogLevel: "disable"}
}
// New Prepares and returns a new test framework based on the "app".
// You can find example on the https://github.com/kataras/iris/tree/master/_examples/testing/httptest
func New(t *testing.T, app *iris.Application, setters ...OptionSetter) *httpexpect.Expect {
conf := DefaultConfiguration()
for _, setter := range setters {
setter.Set(conf)
}
// set the logger or disable it (default).
app.Logger().SetLevel(conf.LogLevel)
if err := app.Build(); err != nil {
if conf.LogLevel != "disable" {
app.Logger().Println(err.Error())
return nil
}
}
testConfiguration := httpexpect.Config{
BaseURL: conf.URL,
Client: &http.Client{
Transport: httpexpect.NewBinder(app),
Jar: httpexpect.NewJar(),
},
Reporter: httpexpect.NewAssertReporter(t),
}
if conf.Debug {
testConfiguration.Printers = []httpexpect.Printer{
httpexpect.NewDebugPrinter(t, true),
}
}
return httpexpect.WithConfig(testConfiguration)
}
// NewInsecure same as New but receives a single host instead of the whole framework.
// Useful for testing running TLS servers.
func NewInsecure(t *testing.T, setters ...OptionSetter) *httpexpect.Expect {
conf := DefaultConfiguration()
for _, setter := range setters {
setter.Set(conf)
}
transport := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
testConfiguration := httpexpect.Config{
BaseURL: conf.URL,
Client: &http.Client{
Transport: transport,
Jar: httpexpect.NewJar(),
},
Reporter: httpexpect.NewAssertReporter(t),
}
if conf.Debug {
testConfiguration.Printers = []httpexpect.Printer{
httpexpect.NewDebugPrinter(t, true),
}
}
return httpexpect.WithConfig(testConfiguration)
}
// Aliases for "net/http/httptest" package. See `Do` package-level function.
var (
NewRecorder = httptest.NewRecorder
NewRequest = httptest.NewRequest
)
// Do is a simple helper which can be used to test handlers individually
// with the "net/http/httptest" package.
// This package contains aliases for `NewRequest` and `NewRecorder` too.
//
// For a more efficient testing please use the `New` function instead.
func Do(w http.ResponseWriter, r *http.Request, handler iris.Handler, irisConfigurators ...iris.Configurator) {
app := new(iris.Application)
app.Configure(iris.WithConfiguration(iris.DefaultConfiguration()), iris.WithLogLevel("disable"))
app.Configure(irisConfigurators...)
app.HTTPErrorHandler = router.NewDefaultHandler(app.ConfigurationReadOnly(), app.Logger())
app.ContextPool = context.New(func() interface{} {
return context.NewContext(app)
})
ctx := app.ContextPool.Acquire(w, r)
handler(ctx)
app.ContextPool.Release(ctx)
}