Files
oddmu/view_test.go
Alex Schroeder 81f2dc3ace Fix handling of id query parameter
With the id query parameter, the viewHandler actually doesn't require
a page. Therefore, all the calls to makeHandler(viewHandler, true)
were changed to makeHandler(viewHandler, false). The code of
makeHandler was rewritten so that r.ParseForm only called for GET
requests such as not to confuse dropHandler.
2024-03-05 09:44:58 +01:00

150 lines
6.0 KiB
Go

package main
import (
"github.com/stretchr/testify/assert"
"net/http"
"net/url"
"os"
"testing"
)
func TestRootHandler(t *testing.T) {
HTTPRedirectTo(t, rootHandler, "GET", "/", nil, "/view/index")
}
// relies on index.md in the current directory!
func TestViewHandler(t *testing.T) {
assert.Contains(t,
assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/index", nil),
"Welcome to Oddµ")
}
func TestViewHandlerDir(t *testing.T) {
cleanup(t, "testdata/dir")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/", nil, "/view/index")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata", nil, "/view/testdata/index")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/", nil, "/view/testdata/index")
assert.NoError(t, os.Mkdir("testdata/dir", 0755))
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir", nil, "/view/testdata/dir/index")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir/", nil, "/view/testdata/dir/index")
assert.NoError(t, os.Mkdir("testdata/dir/dir", 0755))
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir", nil, "/view/testdata/dir/index")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir/", nil, "/view/testdata/dir/index")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir/dir", nil, "/view/testdata/dir/dir/index")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir/dir/", nil, "/view/testdata/dir/dir/index")
assert.NoError(t, os.WriteFile("testdata/dir/dir.md", []byte(`# Blackbird
The oven hums and
the music plays, coffee smells
blackbirds sing outside
`), 0644))
assert.Contains(t, assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/testdata/dir/dir", nil), "<h1>Blackbird</h1>")
assert.Contains(t, assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/testdata/dir/dir.md", nil), "# Blackbird")
HTTPRedirectTo(t, makeHandler(viewHandler, false), "GET", "/view/testdata/dir/dir/", nil, "/view/testdata/dir/dir/index")
}
// relies on index.md in the current directory!
func TestViewHandlerWithId(t *testing.T) {
data := make(url.Values)
data.Set("id", "index")
assert.Contains(t,
assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/", data),
"Welcome to Oddµ")
}
func TestPageTitleWithAmp(t *testing.T) {
cleanup(t, "testdata/amp")
p := &Page{Name: "testdata/amp/Rock & Roll", Body: []byte("Dancing")}
p.save()
assert.Contains(t,
assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/testdata/amp/Rock%20%26%20Roll", nil),
"Rock &amp; Roll")
p = &Page{Name: "testdata/amp/Rock & Roll", Body: []byte("# Sex & Drugs & Rock'n'Roll\nOh no!")}
p.save()
assert.Contains(t,
assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/testdata/amp/Rock%20%26%20Roll", nil),
"Sex &amp; Drugs")
}
func TestPageTitleWithQuestionMark(t *testing.T) {
cleanup(t, "testdata/q")
p := &Page{Name: "testdata/q/How about no?", Body: []byte("No means no")}
p.save()
body := assert.HTTPBody(makeHandler(viewHandler, false), "GET", "/view/testdata/q/How%20about%20no%3F", nil)
assert.Contains(t, body, "No means no")
assert.Contains(t, body, "<a href=\"/edit/testdata/q/How%20about%20no%3F\" accesskey=\"e\">Edit</a>")
}
func TestFileLastModified(t *testing.T) {
cleanup(t, "testdata/file-mod")
assert.NoError(t, os.Mkdir("testdata/file-mod", 0755))
assert.NoError(t, os.WriteFile("testdata/file-mod/now.txt", []byte(`
A spider sitting
Unmoving and still
In the autumn chill
`), 0644))
fi, err := os.Stat("testdata/file-mod/now.txt")
assert.NoError(t, err)
h := makeHandler(viewHandler, false)
assert.Equal(t, []string{fi.ModTime().UTC().Format(http.TimeFormat)},
HTTPHeaders(h, "GET", "/view/testdata/file-mod/now.txt", nil, "Last-Modified"))
HTTPStatusCodeIfModifiedSince(t, h, "/view/testdata/file-mod/now.txt", fi.ModTime())
}
func TestForbidden(t *testing.T) {
assert.HTTPStatusCode(t, makeHandler(viewHandler, false), "GET", "/view/", nil, http.StatusFound)
assert.HTTPStatusCode(t, makeHandler(viewHandler, false), "GET", "/view/.", nil, http.StatusForbidden)
assert.HTTPStatusCode(t, makeHandler(viewHandler, false), "GET", "/view/.htaccess", nil, http.StatusForbidden)
assert.HTTPStatusCode(t, makeHandler(viewHandler, false), "GET", "/view/.git/description", nil, http.StatusForbidden)
}
func TestPageLastModified(t *testing.T) {
cleanup(t, "testdata/page-mod")
p := &Page{Name: "testdata/page-mod/now", Body: []byte(`
The sky glows softly
Sadly, the birds are quiet
I like spring better
`)}
p.save()
fi, err := os.Stat("testdata/page-mod/now.md")
assert.NoError(t, err)
h := makeHandler(viewHandler, false)
assert.Equal(t, []string{fi.ModTime().UTC().Format(http.TimeFormat)},
HTTPHeaders(h, "GET", "/view/testdata/page-mod/now", nil, "Last-Modified"))
HTTPStatusCodeIfModifiedSince(t, h, "/view/testdata/page-mod/now", fi.ModTime())
}
func TestPageHead(t *testing.T) {
cleanup(t, "testdata/head")
p := &Page{Name: "testdata/head/peace", Body: []byte(`
No urgent typing
No todos, no list, no queue.
Just me and the birds.
`)}
p.save()
fi, err := os.Stat("testdata/head/peace.md")
assert.NoError(t, err)
h := makeHandler(viewHandler, false)
assert.Equal(t, []string(nil),
HTTPHeaders(h, "HEAD", "/view/testdata/head/war", nil, "Last-Modified"))
assert.Equal(t, []string(nil),
HTTPHeaders(h, "GET", "/view/testdata/head/war", nil, "Last-Modified"))
assert.Equal(t, []string{fi.ModTime().UTC().Format(http.TimeFormat)},
HTTPHeaders(h, "HEAD", "/view/testdata/head/peace", nil, "Last-Modified"))
assert.Equal(t, "",
assert.HTTPBody(h, "HEAD", "/view/testdata/head/peace", nil))
}
func TestMimeType(t *testing.T) {
assert.Equal(t, []string{"text/markdown; charset=utf-8"},
HTTPHeaders(makeHandler(viewHandler, false), "GET", "/view/index.md", nil, "Content-Type"))
assert.Equal(t, []string{"text/css; charset=utf-8"},
HTTPHeaders(makeHandler(viewHandler, false), "GET", "/view/themes/alexschroeder.ch/oddmu.css", nil, "Content-Type"))
}