package hugolib import ( "bytes" "fmt" "github.com/spf13/hugo/source" "html/template" "strings" "testing" ) const ( TEMPLATE_TITLE = "{{ .Title }}" PAGE_SIMPLE_TITLE = `--- title: simple template --- content` TEMPLATE_MISSING_FUNC = "{{ .Title | funcdoesnotexists }}" TEMPLATE_FUNC = "{{ .Title | urlize }}" TEMPLATE_CONTENT = "{{ .Content }}" TEMPLATE_DATE = "{{ .Date }}" INVALID_TEMPLATE_FORMAT_DATE = "{{ .Date.Format time.RFC3339 }}" TEMPLATE_WITH_URL = "Going" PAGE_URL_SPECIFIED = `--- title: simple template url: "mycategory/my-whatever-content/" --- content` PAGE_WITH_MD = `--- title: page with md --- # heading 1 text ## heading 2 more text ` ) func pageMust(p *Page, err error) *Page { if err != nil { panic(err) } return p } func TestDegenerateRenderThingMissingTemplate(t *testing.T) { p, _ := ReadFrom(strings.NewReader(PAGE_SIMPLE_TITLE), "content/a/file.md") s := new(Site) s.prepTemplates() _, err := s.RenderThing(p, "foobar") if err == nil { t.Errorf("Expected err to be returned when missing the template.") } } func TestAddInvalidTemplate(t *testing.T) { s := new(Site) s.prepTemplates() err := s.addTemplate("missing", TEMPLATE_MISSING_FUNC) if err == nil { t.Fatalf("Expecting the template to return an error") } } func matchRender(t *testing.T, s *Site, p *Page, tmplName string, expected string) { content, err := s.RenderThing(p, tmplName) if err != nil { t.Fatalf("Unable to render template.") } if string(content.Bytes()) != expected { t.Fatalf("Content did not match expected: %s. got: %s", expected, content) } } func TestRenderThing(t *testing.T) { tests := []struct { content string template string expected string }{ {PAGE_SIMPLE_TITLE, TEMPLATE_TITLE, "simple template"}, {PAGE_SIMPLE_TITLE, TEMPLATE_FUNC, "simple-template"}, {PAGE_WITH_MD, TEMPLATE_CONTENT, "

heading 1

\n\n

text

\n\n

heading 2

\n\n

more text

\n"}, {SIMPLE_PAGE_RFC3339_DATE, TEMPLATE_DATE, "2013-05-17 16:59:30 +0000 UTC"}, } s := new(Site) s.prepTemplates() for i, test := range tests { p, err := ReadFrom(strings.NewReader(test.content), "content/a/file.md") if err != nil { t.Fatalf("Error parsing buffer: %s", err) } templateName := fmt.Sprintf("foobar%d", i) err = s.addTemplate(templateName, test.template) if err != nil { t.Fatalf("Unable to add template") } p.Content = template.HTML(p.Content) html, err2 := s.RenderThing(p, templateName) if err2 != nil { t.Errorf("Unable to render html: %s", err) } if string(html.Bytes()) != test.expected { t.Errorf("Content does not match.\nExpected\n\t'%q'\ngot\n\t'%q'", test.expected, html) } } } func TestRenderThingOrDefault(t *testing.T) { tests := []struct { content string missing bool template string expected string }{ {PAGE_SIMPLE_TITLE, true, TEMPLATE_TITLE, "simple template"}, {PAGE_SIMPLE_TITLE, true, TEMPLATE_FUNC, "simple-template"}, {PAGE_SIMPLE_TITLE, false, TEMPLATE_TITLE, "simple template"}, {PAGE_SIMPLE_TITLE, false, TEMPLATE_FUNC, "simple-template"}, } s := new(Site) s.prepTemplates() for i, test := range tests { p, err := ReadFrom(strings.NewReader(PAGE_SIMPLE_TITLE), "content/a/file.md") if err != nil { t.Fatalf("Error parsing buffer: %s", err) } templateName := fmt.Sprintf("default%d", i) err = s.addTemplate(templateName, test.template) if err != nil { t.Fatalf("Unable to add template") } var html *bytes.Buffer var err2 error if test.missing { html, err2 = s.RenderThingOrDefault(p, "missing", templateName) } else { html, err2 = s.RenderThingOrDefault(p, templateName, "missing_default") } if err2 != nil { t.Errorf("Unable to render html: %s", err) } if string(html.Bytes()) != test.expected { t.Errorf("Content does not match. Expected '%s', got '%s'", test.expected, html) } } } func TestSetOutFile(t *testing.T) { tests := []struct { doc string content string expectedOutFile string expectedSection string }{ {"content/a/file.md", PAGE_URL_SPECIFIED, "mycategory/my-whatever-content/index.html", "a"}, {"content/b/file.md", SIMPLE_PAGE, "b/file.html", "b"}, {"a/file.md", SIMPLE_PAGE, "a/file.html", "a"}, {"file.md", SIMPLE_PAGE, "file.html", ""}, } if true { return } for _, test := range tests { var err error s := &Site{ Config: Config{ContentDir: "content"}, } p := pageMust(ReadFrom(strings.NewReader(test.content), s.Config.GetAbsPath(test.doc))) if err = s.setUrlPath(p); err != nil { t.Fatalf("Unable to set urlpath: %s", err) } expected := test.expectedOutFile if p.OutFile != expected { t.Errorf("%s => p.OutFile expected: '%s', got: '%s'", test.doc, expected, p.OutFile) } if p.Section != test.expectedSection { t.Errorf("%s => p.Section expected: %s, got: %s", test.doc, test.expectedSection, p.Section) } } } func TestSkipRender(t *testing.T) { files := make(map[string][]byte) target := &InMemoryTarget{files: files} sources := []source.ByteSource{ {"sect/doc1.html", []byte("---\nmarkup: markdown\n---\n# title\nsome *content*"), "sect"}, {"sect/doc2.html", []byte("more content"), "sect"}, {"sect/doc3.md", []byte("# doc3\n*some* content"), "sect"}, {"sect/doc4.md", []byte("---\ntitle: doc4\n---\n# doc4\n*some content*"), "sect"}, {"sect/doc5.html", []byte("{{ template \"head\" }}body5"), "sect"}, {"doc7.html", []byte("doc7 content"), ""}, } s := &Site{ Target: target, Config: Config{BaseUrl: "http://auth/bub/"}, Source: &source.InMemorySource{sources}, } s.initializeSiteInfo() s.prepTemplates() must(s.addTemplate("_default/single.html", "{{.Content}}")) must(s.addTemplate("head", "")) if err := s.CreatePages(); err != nil { t.Fatalf("Unable to create pages: %s", err) } if err := s.BuildSiteMeta(); err != nil { t.Fatalf("Unable to build site metadata: %s", err) } if err := s.RenderPages(); err != nil { t.Fatalf("Unable to render pages. %s", err) } tests := []struct { doc string expected string }{ {"sect/doc1.html", "

title

\n\n

some content

\n"}, {"sect/doc2.html", "more content"}, {"sect/doc3.html", "

doc3

\n\n

some content

\n"}, {"sect/doc4.html", "

doc4

\n\n

some content

\n"}, {"sect/doc5.html", "body5"}, {"./doc7.html", "doc7 content"}, } for _, test := range tests { content, ok := target.files[test.doc] if !ok { t.Fatalf("Did not find %s in target. %v", test.doc, target.files) } if !bytes.Equal(content, []byte(test.expected)) { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, string(content)) } } } func TestAbsUrlify(t *testing.T) { files := make(map[string][]byte) target := &InMemoryTarget{files: files} sources := []source.ByteSource{ {"sect/doc1.html", []byte("link"), "sect"}, {"content/blue/doc2.html", []byte("---\nf: t\n---\nmore content"), "blue"}, } s := &Site{ Target: target, Config: Config{BaseUrl: "http://auth/bub/"}, Source: &source.InMemorySource{sources}, } s.initializeSiteInfo() s.prepTemplates() must(s.addTemplate("blue/single.html", TEMPLATE_WITH_URL)) if err := s.CreatePages(); err != nil { t.Fatalf("Unable to create pages: %s", err) } if err := s.BuildSiteMeta(); err != nil { t.Fatalf("Unable to build site metadata: %s", err) } if err := s.RenderPages(); err != nil { t.Fatalf("Unable to render pages. %s", err) } tests := []struct { file, expected string }{ {"content/blue/doc2.html", "Going"}, {"sect/doc1.html", "link"}, } for _, test := range tests { content, ok := target.files[test.file] if !ok { t.Fatalf("Unable to locate rendered content: %s", test.file) } expected := test.expected if string(content) != expected { t.Errorf("AbsUrlify content expected:\n%q\ngot\n%q", expected, string(content)) } } }