Matti R
a31e14177e
* ci: migrate from Travis to GitHub Actions Co-authored-by: unknwon <u@gogs.io> * Fix lint errors * README * Fix tests on Windows * Skip test Co-authored-by: Sourcegraph Bot <campaigns@sourcegraph.com>
219 lines
5.0 KiB
Go
219 lines
5.0 KiB
Go
// Copyright 2013 Martini Authors
|
|
// Copyright 2014 The Macaron Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
|
// not use this file except in compliance with the License. You may obtain
|
|
// a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
// License for the specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
package macaron
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
. "github.com/smartystreets/goconvey/convey"
|
|
)
|
|
|
|
func Test_Version(t *testing.T) {
|
|
Convey("Get version", t, func() {
|
|
So(Version(), ShouldEqual, _VERSION)
|
|
})
|
|
}
|
|
|
|
func Test_New(t *testing.T) {
|
|
Convey("Initialize a new instance", t, func() {
|
|
So(New(), ShouldNotBeNil)
|
|
})
|
|
|
|
Convey("Just test that Run doesn't bomb", t, func() {
|
|
go New().Run()
|
|
time.Sleep(1 * time.Second)
|
|
os.Setenv("PORT", "4001")
|
|
go New().Run("0.0.0.0")
|
|
go New().Run(4002)
|
|
go New().Run("0.0.0.0", 4003)
|
|
})
|
|
}
|
|
|
|
func Test_Macaron_Before(t *testing.T) {
|
|
Convey("Register before handlers", t, func() {
|
|
m := New()
|
|
m.Before(func(rw http.ResponseWriter, req *http.Request) bool {
|
|
return false
|
|
})
|
|
m.Before(func(rw http.ResponseWriter, req *http.Request) bool {
|
|
return true
|
|
})
|
|
resp := httptest.NewRecorder()
|
|
req, err := http.NewRequest("GET", "/", nil)
|
|
So(err, ShouldBeNil)
|
|
m.ServeHTTP(resp, req)
|
|
})
|
|
}
|
|
|
|
func Test_Macaron_ServeHTTP(t *testing.T) {
|
|
Convey("Serve HTTP requests", t, func() {
|
|
result := ""
|
|
m := New()
|
|
m.Use(func(c *Context) {
|
|
result += "foo"
|
|
c.Next()
|
|
result += "ban"
|
|
})
|
|
m.Use(func(c *Context) {
|
|
result += "bar"
|
|
c.Next()
|
|
result += "baz"
|
|
})
|
|
m.Get("/", func() {})
|
|
m.Action(func(res http.ResponseWriter, req *http.Request) {
|
|
result += "bat"
|
|
res.WriteHeader(http.StatusBadRequest)
|
|
})
|
|
|
|
resp := httptest.NewRecorder()
|
|
req, err := http.NewRequest("GET", "/", nil)
|
|
So(err, ShouldBeNil)
|
|
m.ServeHTTP(resp, req)
|
|
So(result, ShouldEqual, "foobarbatbazban")
|
|
So(resp.Code, ShouldEqual, http.StatusBadRequest)
|
|
})
|
|
}
|
|
|
|
func Test_Macaron_Handlers(t *testing.T) {
|
|
Convey("Add custom handlers", t, func() {
|
|
result := ""
|
|
batman := func(c *Context) {
|
|
result += "batman!"
|
|
}
|
|
|
|
m := New()
|
|
m.Use(func(c *Context) {
|
|
result += "foo"
|
|
c.Next()
|
|
result += "ban"
|
|
})
|
|
m.Handlers(
|
|
batman,
|
|
batman,
|
|
batman,
|
|
)
|
|
|
|
Convey("Add not callable function", func() {
|
|
defer func() {
|
|
So(recover(), ShouldNotBeNil)
|
|
}()
|
|
m.Use("shit")
|
|
})
|
|
|
|
m.Get("/", func() {})
|
|
m.Action(func(res http.ResponseWriter, req *http.Request) {
|
|
result += "bat"
|
|
res.WriteHeader(http.StatusBadRequest)
|
|
})
|
|
|
|
resp := httptest.NewRecorder()
|
|
req, err := http.NewRequest("GET", "/", nil)
|
|
So(err, ShouldBeNil)
|
|
m.ServeHTTP(resp, req)
|
|
So(result, ShouldEqual, "batman!batman!batman!bat")
|
|
So(resp.Code, ShouldEqual, http.StatusBadRequest)
|
|
})
|
|
}
|
|
|
|
func Test_Macaron_EarlyWrite(t *testing.T) {
|
|
Convey("Write early content to response", t, func() {
|
|
result := ""
|
|
m := New()
|
|
m.Use(func(res http.ResponseWriter) {
|
|
result += "foobar"
|
|
_, _ = res.Write([]byte("Hello world"))
|
|
})
|
|
m.Use(func() {
|
|
result += "bat"
|
|
})
|
|
m.Get("/", func() {})
|
|
m.Action(func(res http.ResponseWriter) {
|
|
result += "baz"
|
|
res.WriteHeader(http.StatusBadRequest)
|
|
})
|
|
|
|
resp := httptest.NewRecorder()
|
|
req, err := http.NewRequest("GET", "/", nil)
|
|
So(err, ShouldBeNil)
|
|
m.ServeHTTP(resp, req)
|
|
So(result, ShouldEqual, "foobar")
|
|
So(resp.Code, ShouldEqual, http.StatusOK)
|
|
})
|
|
}
|
|
|
|
func Test_Macaron_Written(t *testing.T) {
|
|
Convey("Written sign", t, func() {
|
|
resp := httptest.NewRecorder()
|
|
m := New()
|
|
m.Handlers(func(res http.ResponseWriter) {
|
|
res.WriteHeader(http.StatusOK)
|
|
})
|
|
|
|
ctx := m.createContext(resp, &http.Request{Method: "GET"})
|
|
So(ctx.Written(), ShouldBeFalse)
|
|
|
|
ctx.run()
|
|
So(ctx.Written(), ShouldBeTrue)
|
|
})
|
|
}
|
|
|
|
func Test_Macaron_Basic_NoRace(t *testing.T) {
|
|
Convey("Make sure no race between requests", t, func() {
|
|
m := New()
|
|
handlers := []Handler{func() {}, func() {}}
|
|
// Ensure append will not realloc to trigger the race condition
|
|
m.handlers = handlers[:1]
|
|
m.Get("/", func() {})
|
|
for i := 0; i < 2; i++ {
|
|
go func() {
|
|
req, _ := http.NewRequest("GET", "/", nil)
|
|
resp := httptest.NewRecorder()
|
|
m.ServeHTTP(resp, req)
|
|
}()
|
|
}
|
|
})
|
|
}
|
|
|
|
func Test_SetENV(t *testing.T) {
|
|
Convey("Get and save environment variable", t, func() {
|
|
tests := []struct {
|
|
in string
|
|
out string
|
|
}{
|
|
{"", "development"},
|
|
{"not_development", "not_development"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
setENV(test.in)
|
|
So(Env, ShouldEqual, test.out)
|
|
}
|
|
})
|
|
}
|
|
|
|
func Test_Config(t *testing.T) {
|
|
Convey("Set and get configuration object", t, func() {
|
|
So(Config(), ShouldNotBeNil)
|
|
cfg, err := SetConfig([]byte(""))
|
|
So(err, ShouldBeNil)
|
|
So(cfg, ShouldNotBeNil)
|
|
})
|
|
}
|