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(` Test of things `) var testExpected = []byte(` User: admin `) 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) }