package packd import ( "bytes" "io" "net/http" "net/http/httptest" "strconv" "strings" "testing" "github.com/stretchr/testify/require" ) var bigString = func() string { bb := &bytes.Buffer{} for i := 0; i < 100; i++ { bb.WriteString("xxxxx") } return bb.String() }() func Test_MemoryBox(t *testing.T) { r := require.New(t) box := NewMemoryBox() r.False(box.Has("a/a.txt")) r.NoError(box.AddString("b/b.txt", "B")) r.NoError(box.AddBytes("a/a.txt", []byte("A"))) r.True(box.Has("a/a.txt")) b, err := box.Find("b/b.txt") r.NoError(err) r.Equal([]byte("B"), b) s, err := box.FindString("a/a.txt") r.NoError(err) r.Equal("A", s) r.Equal([]string{"a/a.txt", "b/b.txt"}, box.List()) wm := map[string]string{} box.Walk(func(path string, file File) error { bb := &bytes.Buffer{} io.Copy(bb, file) wm[path] = bb.String() return nil }) r.Len(wm, 2) r.Equal("A", wm["a/a.txt"]) r.Equal("B", wm["b/b.txt"]) box.Remove("b/b.txt") _, err = box.Find("b/b.txt") r.Error(err) } var httpBox = func() *MemoryBox { box := NewMemoryBox() box.AddString("hello.txt", "hello world!") box.AddString("index.html", "

Index!

") box.AddString("bigger.txt", bigString) return box }() func Test_HTTPBox(t *testing.T) { r := require.New(t) mux := http.NewServeMux() mux.Handle("/", http.FileServer(httpBox)) req, err := http.NewRequest("GET", "/bigger.txt", nil) r.NoError(err) res := httptest.NewRecorder() mux.ServeHTTP(res, req) r.Equal(200, res.Code) r.Equal(bigString, strings.TrimSpace(res.Body.String())) l := res.Header().Get("Content-Length") r.Equal(strconv.Itoa(len(bigString)), l) } func Test_HTTPBox_NotFound(t *testing.T) { r := require.New(t) mux := http.NewServeMux() mux.Handle("/", http.FileServer(httpBox)) req, err := http.NewRequest("GET", "/notInBox.txt", nil) r.NoError(err) res := httptest.NewRecorder() mux.ServeHTTP(res, req) r.Equal(404, res.Code) } func Test_HTTPBox_Handles_IndexHTML(t *testing.T) { r := require.New(t) mux := http.NewServeMux() mux.Handle("/", http.FileServer(httpBox)) req, err := http.NewRequest("GET", "/", nil) r.NoError(err) res := httptest.NewRecorder() mux.ServeHTTP(res, req) r.Equal(200, res.Code) r.Equal("

Index!

", strings.TrimSpace(res.Body.String())) } func Test_HTTPBox_CaseInsensitive(t *testing.T) { mux := http.NewServeMux() httpBox.AddString("myfile.txt", "this is my file") mux.Handle("/", http.FileServer(httpBox)) for _, path := range []string{"/MyFile.txt", "/myfile.txt", "/Myfile.txt"} { t.Run(path, func(st *testing.T) { r := require.New(st) req, err := http.NewRequest("GET", path, nil) r.NoError(err) res := httptest.NewRecorder() mux.ServeHTTP(res, req) res.Flush() r.Equal(200, res.Code) r.Equal("this is my file", strings.TrimSpace(res.Body.String())) }) } }