diff options
Diffstat (limited to 'contrib/fs/file_test.go')
-rw-r--r-- | contrib/fs/file_test.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/contrib/fs/file_test.go b/contrib/fs/file_test.go new file mode 100644 index 0000000..4f371c7 --- /dev/null +++ b/contrib/fs/file_test.go @@ -0,0 +1,80 @@ +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 TestFileHandler(t *testing.T) { + handler := fs.FileHandler(os.DirFS("testdata")) + + tests := []struct { + url string + status gus.Status + meta string + body string + }{ + { + url: "gemini://localhost/d", + status: gemini.StatusNotFound, + }, + { + url: "gemini://localhost/d/", + status: gemini.StatusNotFound, + }, + { + url: "gemini://localhost/d/index.gmi", + status: gemini.StatusSuccess, + meta: "text/gemini", + body: "# This is d\n", + }, + { + url: "gemini://localhost/a/b", + status: gemini.StatusSuccess, + meta: "application/octet-stream", + body: "this is file b\n", + }, + { + url: "gemini://localhost/a/c.html", + status: gemini.StatusSuccess, + meta: "text/html; charset=utf-8", + body: "", + }, + } + + 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)) + } + }) + } +} |