package service_test
import (
"io"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/dubyte/dir2opds/internal/service"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestHandler(t *testing.T) {
// pre-setup
nowFn := service.TimeNow
defer func() {
service.TimeNow = nowFn
}()
tests := map[string]struct {
input string
want string
WantedContentType string
}{
"feed (dir of dirs )": {input: "/", want: feed, WantedContentType: "application/atom+xml;profile=opds-catalog;kind=navigation"},
"acquisitionFeed(dir of files)": {input: "/mybook", want: acquisitionFeed, WantedContentType: "application/atom+xml;profile=opds-catalog;kind=acquisition"},
"servingAFile": {input: "/mybook/mybook.txt", want: "Fixture", WantedContentType: "text/plain; charset=utf-8"},
"serving file with spaces": {input: "/mybook/mybook%20copy.txt", want: "Fixture", WantedContentType: "text/plain; charset=utf-8"},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
// setup
s := service.OPDS{"testdata", "", "", ""}
w := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, tc.input, nil)
service.TimeNow = func() time.Time {
return time.Date(2020, 05, 25, 00, 00, 00, 0, time.UTC)
}
// act
err := s.Handler(w, req)
require.NoError(t, err)
// post act
resp := w.Result()
body, err := io.ReadAll(resp.Body)
require.NoError(t, err)
// verify
assert.Equal(t, 200, resp.StatusCode)
assert.Equal(t, tc.WantedContentType, resp.Header.Get("Content-Type"))
assert.Equal(t, tc.want, string(body))
})
}
}
var feed = `
Catalog in /
/
2020-05-25T00:00:00+00:00
emptyFolder
/emptyFolder
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
mybook
/mybook
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
new folder
/new folder
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
`
var acquisitionFeed = `
Catalog in /mybook
/mybook
2020-05-25T00:00:00+00:00
mybook copy.epub
/mybookmybook copy.epub
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
mybook copy.txt
/mybookmybook copy.txt
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
mybook.epub
/mybookmybook.epub
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
mybook.pdf
/mybookmybook.pdf
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
mybook.txt
/mybookmybook.txt
2020-05-25T00:00:00+00:00
2020-05-25T00:00:00+00:00
`