package gig
import (
"io/ioutil"
"strings"
"testing"
"github.com/matryer/is"
)
func TestGroupFile(t *testing.T) {
gig := New()
g := gig.Group("/group")
g.File("/walle", "_fixture/images/walle.png")
expectedData, err := ioutil.ReadFile("_fixture/images/walle.png")
is := is.New(t)
is.NoErr(err)
c, conn := gig.NewFakeContext("/group/walle", nil)
gig.ServeGemini(c)
is.Equal("20 image/png\r\n"+string(expectedData), conn.Written)
}
func TestGroupStatic(t *testing.T) {
is := is.New(t)
gig := New()
g := gig.Group("/group")
// OK
g.Static("/images", "_fixture/images")
b := request("/group/images/walle.png", gig)
is.True(strings.HasPrefix(b, "20 image/png\r\n"))
// No file
g.Static("/images", "_fixture/scripts")
b = request("/group/images/bolt.png", gig)
is.Equal("51 Not Found\r\n", b)
// Directory
g.Static("/images", "_fixture/images")
b = request("/group/images", gig)
is.Equal("51 Not Found\r\n", b)
b = request("/group/images/", gig)
is.Equal("20 text/gemini\r\n# Listing /group/images/\n\n=> /group/images/walle.png walle.png [ 219.9kB ]\n", b)
// Directory with index.gmi
g.Static("/d", "_fixture")
b = request("/group/d/", gig)
is.Equal("20 text/gemini\r\n# Hello from gig\n\n=> / 🏠 Home\n", b)
// Sub-directory with index.gmi
b = request("/group/d/folder", gig)
is.Equal("20 text/gemini\r\n# Listing /group/d/folder\n\n=> /group/d/folder/about.gmi about.gmi [ 29B ]\n=> /group/d/folder/another.blah another.blah [ 14B ]\n", b)
// File without known mime
b = request("/group/d/folder/another.blah", gig)
is.Equal("20 octet/stream\r\n# Another page", b)
// Escape
b = request("/d/../../../../../../../../etc/profile", gig)
is.Equal(b, "51 Not Found\r\n")
}
func TestGroupRouteMiddleware(t *testing.T) {
// Ensure middleware slices are not re-used
gig := New()
g := gig.Group("/group")
h := func(Context) error { return nil }
m1 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return next(c)
}
}
m2 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return next(c)
}
}
m3 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return next(c)
}
}
m4 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return c.NoContent(40, "oops")
}
}
m5 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return c.NoContent(40, "another")
}
}
g.Use(m1, m2, m3)
g.Handle("/40_1", h, m4)
g.Handle("/40_2", h, m5)
is := is.New(t)
b := request("/group/40_1", gig)
is.Equal("40 oops\r\n", b)
b = request("/group/40_2", gig)
is.Equal("40 another\r\n", b)
}
func TestGroupRouteMiddlewareWithMatchAny(t *testing.T) {
// Ensure middleware and match any routes do not conflict
gig := New()
g := gig.Group("/group")
m1 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return next(c)
}
}
m2 := func(next HandlerFunc) HandlerFunc {
return func(c Context) error {
return c.Text(c.Path())
}
}
h := func(c Context) error {
return c.Text(c.Path())
}
g.Use(m1)
g.Handle("/help", h, m2)
g.Handle("/*", h, m2)
g.Handle("", h, m2)
gig.Handle("unrelated", h, m2)
gig.Handle("*", h, m2)
is := is.New(t)
b := request("/group/help", gig)
is.Equal("20 text/plain\r\n/group/help", b)
b = request("/group/help/other", gig)
is.Equal("20 text/plain\r\n/group/*", b)
b = request("/group/404", gig)
is.Equal("20 text/plain\r\n/group/*", b)
b = request("/group", gig)
is.Equal("20 text/plain\r\n/group", b)
b = request("/other", gig)
is.Equal("20 text/plain\r\n/*", b)
b = request("/", gig)
is.Equal("20 text/plain\r\n", b)
}
Source