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.GeminiFileHandler(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)) } }) } }