From a27b879accb191b6a6c6e76a6251ed751967f73a Mon Sep 17 00:00:00 2001 From: tjpcc Date: Thu, 26 Jan 2023 16:22:58 -0700 Subject: test coverage and resulting bugfixes --- contrib/fs/dir_test.go | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 contrib/fs/dir_test.go (limited to 'contrib/fs/dir_test.go') diff --git a/contrib/fs/dir_test.go b/contrib/fs/dir_test.go new file mode 100644 index 0000000..c7492ff --- /dev/null +++ b/contrib/fs/dir_test.go @@ -0,0 +1,130 @@ +package fs_test + +import ( + "context" + "io" + "net/url" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "tildegit.org/tjp/gus" + "tildegit.org/tjp/gus/contrib/fs" + "tildegit.org/tjp/gus/gemini" +) + +func TestDirectoryDefault(t *testing.T) { + handler := fs.DirectoryDefault(os.DirFS("testdata"), "index.gmi") + + tests := []struct { + url string + status gus.Status + meta string + body string + }{ + { + url: "gemini://localhost/d", + status: gemini.StatusTemporaryRedirect, + meta: "gemini://localhost/d/", + }, + { + url: "gemini://localhost/d/", + status: gemini.StatusSuccess, + meta: "text/gemini", + body: "# This is d\n", + }, + { + url: "gemini://localhost/a/", + status: gemini.StatusNotFound, + }, + } + + for _, test := range tests { + t.Run(test.url, func(t *testing.T) { + u, err := url.Parse(test.url) + require.Nil(t, err) + + request := &gus.Request{URL: u} + response := handler(context.Background(), request) + + if response == nil { + assert.Equal(t, test.status, gemini.StatusNotFound) + return + } else { + assert.Equal(t, test.status, response.Status) + } + + if test.meta != "" { + assert.Equal(t, test.meta, response.Meta) + } + if test.body != "" { + body, err := io.ReadAll(response.Body) + require.Nil(t, err) + assert.Equal(t, test.body, string(body)) + } + }) + } +} + +func TestDirectoryListing(t *testing.T) { + handler := fs.DirectoryListing(os.DirFS("testdata"), nil) + + tests := []struct { + url string + status gus.Status + meta string + body string + }{ + { + url: "gemini://localhost/", + status: gemini.StatusSuccess, + meta: "text/gemini", + body: "# (root)\n\n=> a/\n=> d/\n=> ../\n", + }, + { + url: "gemini://localhost/d", + status: gemini.StatusTemporaryRedirect, + meta: "gemini://localhost/d/", + }, + { + url: "gemini://localhost/d/", + status: gemini.StatusSuccess, + meta: "text/gemini", + body: "# d\n\n=> index.gmi\n=> ../\n", + }, + { + url: "gemini://localhost/a/", + status: gemini.StatusSuccess, + meta: "text/gemini", + body: "# a\n\n=> b\n=> c.html\n=> ../\n", + }, + } + + for _, test := range tests { + t.Run(test.url, func(t *testing.T) { + u, err := url.Parse(test.url) + require.Nil(t, err) + + request := &gus.Request{URL: u} + response := handler(context.Background(), request) + + if response == nil { + assert.Equal(t, test.status, gemini.StatusNotFound) + return + } else { + assert.Equal(t, test.status, response.Status) + } + + if test.meta != "" { + assert.Equal(t, test.meta, response.Meta) + } + if test.body != "" { + body, err := io.ReadAll(response.Body) + require.Nil(t, err) + assert.Equal(t, test.body, string(body)) + } + }) + } +} -- cgit v1.2.3