mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-29 20:24:11 +08:00
247 lines
5.1 KiB
Go
247 lines
5.1 KiB
Go
package browse
|
|
|
|
import (
|
|
//"bytes"
|
|
"encoding/json"
|
|
"github.com/mholt/caddy/middleware"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"net/url"
|
|
"os"
|
|
"sort"
|
|
"testing"
|
|
"text/template"
|
|
"time"
|
|
)
|
|
|
|
// "sort" package has "IsSorted" function, but no "IsReversed";
|
|
func isReversed(data sort.Interface) bool {
|
|
n := data.Len()
|
|
for i := n - 1; i > 0; i-- {
|
|
if !data.Less(i, i-1) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func TestSort(t *testing.T) {
|
|
// making up []fileInfo with bogus values;
|
|
// to be used to make up our "listing"
|
|
fileInfos := []FileInfo{
|
|
{
|
|
Name: "fizz",
|
|
Size: 4,
|
|
ModTime: time.Now().AddDate(-1, 1, 0),
|
|
},
|
|
{
|
|
Name: "buzz",
|
|
Size: 2,
|
|
ModTime: time.Now().AddDate(0, -3, 3),
|
|
},
|
|
{
|
|
Name: "bazz",
|
|
Size: 1,
|
|
ModTime: time.Now().AddDate(0, -2, -23),
|
|
},
|
|
{
|
|
Name: "jazz",
|
|
Size: 3,
|
|
ModTime: time.Now(),
|
|
},
|
|
}
|
|
listing := Listing{
|
|
Name: "foobar",
|
|
Path: "/fizz/buzz",
|
|
CanGoUp: false,
|
|
Items: fileInfos,
|
|
}
|
|
|
|
// sort by name
|
|
listing.Sort = "name"
|
|
listing.applySort()
|
|
if !sort.IsSorted(byName(listing)) {
|
|
t.Errorf("The listing isn't name sorted: %v", listing.Items)
|
|
}
|
|
|
|
// sort by size
|
|
listing.Sort = "size"
|
|
listing.applySort()
|
|
if !sort.IsSorted(bySize(listing)) {
|
|
t.Errorf("The listing isn't size sorted: %v", listing.Items)
|
|
}
|
|
|
|
// sort by Time
|
|
listing.Sort = "time"
|
|
listing.applySort()
|
|
if !sort.IsSorted(byTime(listing)) {
|
|
t.Errorf("The listing isn't time sorted: %v", listing.Items)
|
|
}
|
|
|
|
// reverse by name
|
|
listing.Sort = "name"
|
|
listing.Order = "desc"
|
|
listing.applySort()
|
|
if !isReversed(byName(listing)) {
|
|
t.Errorf("The listing isn't reversed by name: %v", listing.Items)
|
|
}
|
|
|
|
// reverse by size
|
|
listing.Sort = "size"
|
|
listing.Order = "desc"
|
|
listing.applySort()
|
|
if !isReversed(bySize(listing)) {
|
|
t.Errorf("The listing isn't reversed by size: %v", listing.Items)
|
|
}
|
|
|
|
// reverse by time
|
|
listing.Sort = "time"
|
|
listing.Order = "desc"
|
|
listing.applySort()
|
|
if !isReversed(byTime(listing)) {
|
|
t.Errorf("The listing isn't reversed by time: %v", listing.Items)
|
|
}
|
|
}
|
|
|
|
func TestBrowseTemplate(t *testing.T) {
|
|
tmpl, err := template.ParseFiles("testdata/photos.tpl")
|
|
if err != nil {
|
|
t.Fatalf("An error occured while parsing the template: %v", err)
|
|
}
|
|
|
|
b := Browse{
|
|
Next: middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
|
|
t.Fatalf("Next shouldn't be called")
|
|
return 0, nil
|
|
}),
|
|
Root: "./testdata",
|
|
Configs: []Config{
|
|
Config{
|
|
PathScope: "/photos",
|
|
Template: tmpl,
|
|
},
|
|
},
|
|
}
|
|
|
|
req, err := http.NewRequest("GET", "/photos/", nil)
|
|
if err != nil {
|
|
t.Fatalf("Test: Could not create HTTP request: %v", err)
|
|
}
|
|
|
|
rec := httptest.NewRecorder()
|
|
|
|
b.ServeHTTP(rec, req)
|
|
if rec.Code != http.StatusOK {
|
|
t.Fatalf("Wrong status, expected %d, got %d", http.StatusOK, rec.Code)
|
|
}
|
|
|
|
respBody := rec.Body.String()
|
|
expectedBody := `<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>Template</title>
|
|
</head>
|
|
<body>
|
|
<h1>Header</h1>
|
|
|
|
<h1>/photos/</h1>
|
|
|
|
<a href="test.html">test.html</a><br>
|
|
|
|
<a href="test2.html">test2.html</a><br>
|
|
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
if respBody != expectedBody {
|
|
t.Fatalf("Expected body: %v got: %v", expectedBody, respBody)
|
|
}
|
|
|
|
}
|
|
|
|
func TestBrowseJson(t *testing.T) {
|
|
|
|
b := Browse{
|
|
Next: middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
|
|
t.Fatalf("Next shouldn't be called")
|
|
return 0, nil
|
|
}),
|
|
Root: "./testdata",
|
|
Configs: []Config{
|
|
Config{
|
|
PathScope: "/photos",
|
|
},
|
|
},
|
|
}
|
|
|
|
req, err := http.NewRequest("GET", "/photos/", nil)
|
|
if err != nil {
|
|
t.Fatalf("Test: Could not create HTTP request: %v", err)
|
|
}
|
|
req.Header.Set("Accept", "application/json")
|
|
rec := httptest.NewRecorder()
|
|
|
|
b.ServeHTTP(rec, req)
|
|
if rec.Code != http.StatusOK {
|
|
t.Fatalf("Wrong status, expected %d, got %d", http.StatusOK, rec.Code)
|
|
}
|
|
if rec.HeaderMap.Get("Content-Type") != "application/json; charset=utf-8" {
|
|
t.Fatalf("Expected Content type to be application/json; charset=utf-8, but got %s ", rec.HeaderMap.Get("Content-Type"))
|
|
}
|
|
|
|
actualJsonResponseString := rec.Body.String()
|
|
//t.Logf("json response body: %s\n", respBody)
|
|
//generating the listing to compare it with the response body
|
|
file, err := os.Open(b.Root + req.URL.Path)
|
|
if err != nil {
|
|
if os.IsPermission(err) {
|
|
t.Fatalf("Os Permission Error")
|
|
|
|
}
|
|
|
|
}
|
|
defer file.Close()
|
|
|
|
files, err := file.Readdir(-1)
|
|
if err != nil {
|
|
t.Fatalf("Unable to Read Contents of the directory")
|
|
}
|
|
var fileinfos []FileInfo
|
|
for _, f := range files {
|
|
name := f.Name()
|
|
|
|
if f.IsDir() {
|
|
name += "/"
|
|
}
|
|
|
|
url := url.URL{Path: name}
|
|
|
|
fileinfos = append(fileinfos, FileInfo{
|
|
IsDir: f.IsDir(),
|
|
Name: f.Name(),
|
|
Size: f.Size(),
|
|
URL: url.String(),
|
|
ModTime: f.ModTime(),
|
|
Mode: f.Mode(),
|
|
})
|
|
}
|
|
listing := Listing{
|
|
Items: fileinfos,
|
|
}
|
|
listing.Sort = "name"
|
|
listing.Order = "asc"
|
|
listing.applySort()
|
|
|
|
//var buf bytes.Buffer
|
|
marsh, err := json.Marshal(listing.Items)
|
|
if err != nil {
|
|
t.Fatalf("Unable to Marshal the listing ")
|
|
}
|
|
//t.Logf("json value: %s\n", string(marsh))
|
|
expectedJsonString := string(marsh)
|
|
if actualJsonResponseString != expectedJsonString {
|
|
t.Errorf("Json response string doesnt match the expected Json response ")
|
|
}
|
|
}
|