package render_test import ( "bytes" "html/template" "net/http/httptest" "strings" "testing" "time" "sneak.berlin/go/simplexcalc/internal/database" "sneak.berlin/go/simplexcalc/internal/globals" "sneak.berlin/go/simplexcalc/internal/render" "sneak.berlin/go/simplexcalc/templates" ) func newRenderer(t *testing.T) *render.Renderer { t.Helper() r, err := render.New(nil, render.Params{ Globals: &globals.Globals{ Appname: "simplexcalc", Version: "test", Buildarch: "amd64", }, }) if err != nil { t.Fatalf("compiling templates: %v", err) } return r } // TestEveryEmbeddedPageCompiles is the reason New parses everything at // startup: a template that does not compile must be a process that does // not start, and this is what proves the set is complete rather than // just non-empty. func TestEveryEmbeddedPageCompiles(t *testing.T) { t.Parallel() r := newRenderer(t) embedded, err := templates.FS.ReadDir(".") if err != nil { t.Fatalf("reading embedded templates: %v", err) } want := 0 for _, e := range embedded { if !e.IsDir() && strings.HasSuffix(e.Name(), ".html") && e.Name() != "base.html" { want++ } } if want == 0 { t.Fatal("no page templates were embedded, so this test proves nothing") } if got := len(r.Names()); got != want { t.Errorf("compiled %d pages (%v), embedded %d", got, r.Names(), want) } } // TestIndexRendersEmbeddedContent renders the page the service serves // at /, with real data, and checks that the base document, both // partials and the page body all made it into one response. func TestIndexRendersEmbeddedContent(t *testing.T) { t.Parallel() r := newRenderer(t) data := render.IndexPage{ Page: r.NewPage(template.HTML(``)), WidgetCount: 1, Widgets: []database.Widget{ { ID: "abc", Name: "a widget", SizeBytes: 4096, CreatedAt: time.Now().Add(-time.Hour), }, }, } var buf bytes.Buffer err := r.Execute(&buf, "index.html", data) if err != nil { t.Fatalf("rendering index: %v", err) } out := buf.String() for _, want := range []string{ "", // base document `href="/static/css/style.css"`, // base document links the embedded asset "