snap/server_test.go

162 lines
3.7 KiB
Go

package snap
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"git.twelvetwelve.org/library/snap/auth"
)
var rootExpected = []byte(`
<html lang="en">
<head>
<link rel="stylesheet" href="/static/skin/css/normalize.css">
</head>
<body>
Test of things
</body>
</html>
`)
var testExpected = []byte(`
<html lang="en">
<head>
<link rel="stylesheet" href="/static/skin/css/normalize.css">
</head>
<body>
User: admin
</body>
</html>
`)
func handlerRoot(c *Context) {
c.RenderEx("index.html", nil)
}
func handlerLogin(c *Context) {
c.RenderEx("index.html", nil)
}
func handlerTest(c *Context) {
fmt.Printf(":handlerTest\n")
c.RenderEx("test.html", nil)
}
func doTestRequest(t *testing.T, req *http.Request) ([]byte, int, error) {
resp, err := http.DefaultClient.Do(req)
assert.Nil(t, err)
assert.NotNil(t, resp)
data, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
assert.Nil(t, err)
return data, resp.StatusCode, err
}
func TestServer_BasicAuth(t *testing.T) {
auth := auth.NewBasicAuth()
auth.AddUser("admin", "admin", "test")
s := New("", "test", auth)
s.SetDebug(true)
s.SetTemplatePath("/templates")
s.WithStaticFiles("/static")
s.WithTheme("skin/")
s.HandleFunc("/", handlerRoot)
s.HandleFuncAuthenticated("/login", "", handlerLogin)
s.HandleFunc("/test", handlerTest)
s.Dump()
ts := httptest.NewServer(s.router)
defer ts.Close()
// Simple Get:/
req, err := http.NewRequest(http.MethodGet, ts.URL, nil)
assert.Nil(t, err)
data, code, err := doTestRequest(t, req)
assert.Nil(t, err)
assert.Equal(t, http.StatusOK, code)
assert.Equal(t, rootExpected, data)
// Check GOOD password
req, err = http.NewRequest(http.MethodGet, ts.URL+"/login", nil)
assert.Nil(t, err)
req.SetBasicAuth("admin", "test")
data, code, err = doTestRequest(t, req)
assert.Nil(t, err)
assert.Equal(t, http.StatusOK, code)
assert.Equal(t, rootExpected, data)
// Check BAD password
req, err = http.NewRequest(http.MethodGet, ts.URL+"/login", nil)
assert.Nil(t, err)
req.SetBasicAuth("admin", "badpass")
data, code, err = doTestRequest(t, req)
assert.Nil(t, err)
assert.Equal(t, http.StatusUnauthorized, code)
// Check GOOD password and context in templates
req, err = http.NewRequest(http.MethodGet, ts.URL+"/test", nil)
assert.Nil(t, err)
req.SetBasicAuth("admin", "test")
data, code, err = doTestRequest(t, req)
assert.Nil(t, err)
assert.Equal(t, http.StatusOK, code)
assert.Equal(t, testExpected, data)
// Test Static Content
// Check GOOD password and context in templates
req, err = http.NewRequest(http.MethodGet, ts.URL+"/static/skin/skin.html", nil)
assert.Nil(t, err)
data, code, err = doTestRequest(t, req)
assert.Nil(t, err)
assert.Equal(t, http.StatusOK, code)
assert.Equal(t, []byte(`skin-file`), data)
}
func TestServer_TokenAuth(t *testing.T) {
auth := auth.NewTokenAuth()
auth.AddUser("admin", "admin", "1234567890")
s := New("", "test", auth)
s.SetDebug(true)
s.SetTemplatePath("/templates")
s.WithStaticFiles("/static")
s.WithTheme("skin/")
s.HandleFunc("/", handlerRoot)
s.HandleFuncAuthenticated("/login", "", handlerLogin)
s.HandleFuncAuthenticated("/test", "", handlerTest)
s.Dump()
ts := httptest.NewServer(s.router)
defer ts.Close()
// Check GOOD password
req, err := http.NewRequest(http.MethodGet, ts.URL+"/login", nil)
assert.Nil(t, err)
req.Header.Add("token", "1234567890")
data, code, err := doTestRequest(t, req)
assert.Nil(t, err)
assert.Equal(t, http.StatusOK, code)
assert.Equal(t, rootExpected, data)
}
func TestFilesystem(t *testing.T) {
fs := http.FileSystem(http.FileSystem(http.Dir("./test")))
s := New("", "test", nil)
tmpl, err := s.LoadTemplatesFS(fs, "/templates")
assert.Nil(t, err)
assert.NotNil(t, tmpl)
}