func TestRenderThingOrDefault(t *testing.T) { tests := []struct { content string missing bool template string expected string }{ {PAGE_SIMPLE_TITLE, true, TEMPLATE_TITLE, HTML("simple template")}, {PAGE_SIMPLE_TITLE, true, TEMPLATE_FUNC, HTML("simple-template")}, {PAGE_SIMPLE_TITLE, false, TEMPLATE_TITLE, HTML("simple template")}, {PAGE_SIMPLE_TITLE, false, TEMPLATE_FUNC, HTML("simple-template")}, } hugofs.DestinationFS = new(afero.MemMapFs) s := &Site{} templatePrep(s) for i, test := range tests { p, err := NewPageFrom(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 err2 error if test.missing { err2 = s.renderAndWritePage("name", "out", p, "missing", templateName) } else { err2 = s.renderAndWritePage("name", "out", p, templateName, "missing_default") } if err2 != nil { t.Errorf("Unable to render html: %s", err) } file, err := hugofs.DestinationFS.Open(filepath.FromSlash("out/index.html")) if err != nil { t.Errorf("Unable to open html: %s", err) } if helpers.ReaderToString(file) != test.expected { t.Errorf("Content does not match. Expected '%s', got '%s'", test.expected, helpers.ReaderToString(file)) } } }
func TestDefaultHandler(t *testing.T) { viper.Reset() defer viper.Reset() hugofs.DestinationFS = new(afero.MemMapFs) sources := []source.ByteSource{ {filepath.FromSlash("sect/doc1.html"), []byte("---\nmarkup: markdown\n---\n# title\nsome *content*")}, {filepath.FromSlash("sect/doc2.html"), []byte("<!doctype html><html><body>more content</body></html>")}, {filepath.FromSlash("sect/doc3.md"), []byte("# doc3\n*some* content")}, {filepath.FromSlash("sect/doc4.md"), []byte("---\ntitle: doc4\n---\n# doc4\n*some content*")}, {filepath.FromSlash("sect/doc3/img1.png"), []byte("‰PNG ��� IHDR����������:~›U��� IDATWcø��ZMoñ����IEND®B`‚")}, {filepath.FromSlash("sect/img2.gif"), []byte("GIF89a��€��ÿÿÿ���,�������D�;")}, {filepath.FromSlash("sect/img2.spf"), []byte("****FAKE-FILETYPE****")}, {filepath.FromSlash("doc7.html"), []byte("<html><body>doc7 content</body></html>")}, {filepath.FromSlash("sect/doc8.html"), []byte("---\nmarkup: md\n---\n# title\nsome *content*")}, } viper.Set("DefaultExtension", "html") viper.Set("verbose", true) s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, Targets: targetList{Page: &target.PagePub{UglyURLs: true}}, } s.initializeSiteInfo() // From site_test.go templatePrep(s) must(s.addTemplate("_default/single.html", "{{.Content}}")) must(s.addTemplate("head", "<head><script src=\"script.js\"></script></head>")) must(s.addTemplate("head_abs", "<head><script src=\"/script.js\"></script></head>")) // From site_test.go createAndRenderPages(t, s) tests := []struct { doc string expected string }{ {filepath.FromSlash("sect/doc1.html"), "\n\n<h1 id=\"title:5d74edbb89ef198cd37882b687940cda\">title</h1>\n\n<p>some <em>content</em></p>\n"}, {filepath.FromSlash("sect/doc2.html"), "<!doctype html><html><body>more content</body></html>"}, {filepath.FromSlash("sect/doc3.html"), "\n\n<h1 id=\"doc3:28c75a9e2162b8eccda73a1ab9ce80b4\">doc3</h1>\n\n<p><em>some</em> content</p>\n"}, {filepath.FromSlash("sect/doc3/img1.png"), string([]byte("‰PNG ��� IHDR����������:~›U��� IDATWcø��ZMoñ����IEND®B`‚"))}, {filepath.FromSlash("sect/img2.gif"), string([]byte("GIF89a��€��ÿÿÿ���,�������D�;"))}, {filepath.FromSlash("sect/img2.spf"), string([]byte("****FAKE-FILETYPE****"))}, {filepath.FromSlash("doc7.html"), "<html><body>doc7 content</body></html>"}, {filepath.FromSlash("sect/doc8.html"), "\n\n<h1 id=\"title:0ae308ad73e2f37bd09874105281b5d8\">title</h1>\n\n<p>some <em>content</em></p>\n"}, } for _, test := range tests { file, err := hugofs.DestinationFS.Open(test.doc) if err != nil { t.Fatalf("Did not find %s in target.", test.doc) } content := helpers.ReaderToString(file) if content != test.expected { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, content) } } }
func TestAbsUrlify(t *testing.T) { viper.Reset() defer viper.Reset() viper.Set("DefaultExtension", "html") hugofs.DestinationFS = new(afero.MemMapFs) sources := []source.ByteSource{ {filepath.FromSlash("sect/doc1.html"), []byte("<!doctype html><html><head></head><body><a href=\"#frag1\">link</a></body></html>")}, {filepath.FromSlash("content/blue/doc2.html"), []byte("---\nf: t\n---\n<!doctype html><html><body>more content</body></html>")}, } for _, canonify := range []bool{true, false} { viper.Set("CanonifyURLs", canonify) viper.Set("BaseURL", "http://auth/bub") s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, Targets: targetList{Page: &target.PagePub{UglyURLs: true}}, } t.Logf("Rendering with BaseURL %q and CanonifyURLs set %v", viper.GetString("baseURL"), canonify) s.initializeSiteInfo() templatePrep(s) must(s.addTemplate("blue/single.html", TEMPLATE_WITH_URL_ABS)) 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", "<a href=\"http://auth/bub/foobar.jpg\">Going</a>"}, {"sect/doc1.html", "<!doctype html><html><head></head><body><a href=\"#frag1\">link</a></body></html>"}, } for _, test := range tests { file, err := hugofs.DestinationFS.Open(filepath.FromSlash(test.file)) if err != nil { t.Fatalf("Unable to locate rendered content: %s", test.file) } content := helpers.ReaderToString(file) expected := test.expected if !canonify { expected = strings.Replace(expected, viper.GetString("baseurl"), "", -1) } if content != expected { t.Errorf("AbsUrlify content expected:\n%q\ngot\n%q", expected, content) } } } }
func TestSkipRender(t *testing.T) { viper.Reset() defer viper.Reset() hugofs.DestinationFS = new(afero.MemMapFs) sources := []source.ByteSource{ {filepath.FromSlash("sect/doc1.html"), []byte("---\nmarkup: markdown\n---\n# title\nsome *content*")}, {filepath.FromSlash("sect/doc2.html"), []byte("<!doctype html><html><body>more content</body></html>")}, {filepath.FromSlash("sect/doc3.md"), []byte("# doc3\n*some* content")}, {filepath.FromSlash("sect/doc4.md"), []byte("---\ntitle: doc4\n---\n# doc4\n*some content*")}, {filepath.FromSlash("sect/doc5.html"), []byte("<!doctype html><html>{{ template \"head\" }}<body>body5</body></html>")}, {filepath.FromSlash("sect/doc6.html"), []byte("<!doctype html><html>{{ template \"head_abs\" }}<body>body5</body></html>")}, {filepath.FromSlash("doc7.html"), []byte("<html><body>doc7 content</body></html>")}, {filepath.FromSlash("sect/doc8.html"), []byte("---\nmarkup: md\n---\n# title\nsome *content*")}, } viper.Set("DefaultExtension", "html") viper.Set("verbose", true) viper.Set("CanonifyURLs", true) viper.Set("baseurl", "http://auth/bub") s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, Targets: targetList{Page: &target.PagePub{UglyURLs: true}}, } s.initializeSiteInfo() templatePrep(s) must(s.addTemplate("_default/single.html", "{{.Content}}")) must(s.addTemplate("head", "<head><script src=\"script.js\"></script></head>")) must(s.addTemplate("head_abs", "<head><script src=\"/script.js\"></script></head>")) createAndRenderPages(t, s) tests := []struct { doc string expected string }{ {filepath.FromSlash("sect/doc1.html"), "\n\n<h1 id=\"title:5d74edbb89ef198cd37882b687940cda\">title</h1>\n\n<p>some <em>content</em></p>\n"}, {filepath.FromSlash("sect/doc2.html"), "<!doctype html><html><body>more content</body></html>"}, {filepath.FromSlash("sect/doc3.html"), "\n\n<h1 id=\"doc3:28c75a9e2162b8eccda73a1ab9ce80b4\">doc3</h1>\n\n<p><em>some</em> content</p>\n"}, {filepath.FromSlash("sect/doc4.html"), "\n\n<h1 id=\"doc4:f8e6806123f341b8975509637645a4d3\">doc4</h1>\n\n<p><em>some content</em></p>\n"}, {filepath.FromSlash("sect/doc5.html"), "<!doctype html><html><head><script src=\"script.js\"></script></head><body>body5</body></html>"}, {filepath.FromSlash("sect/doc6.html"), "<!doctype html><html><head><script src=\"http://auth/bub/script.js\"></script></head><body>body5</body></html>"}, {filepath.FromSlash("doc7.html"), "<html><body>doc7 content</body></html>"}, {filepath.FromSlash("sect/doc8.html"), "\n\n<h1 id=\"title:0ae308ad73e2f37bd09874105281b5d8\">title</h1>\n\n<p>some <em>content</em></p>\n"}, } for _, test := range tests { file, err := hugofs.DestinationFS.Open(test.doc) if err != nil { t.Fatalf("Did not find %s in target.", test.doc) } content := helpers.ReaderToString(file) if content != test.expected { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, content) } } }
func doTestSectionNaming(t *testing.T, canonify, uglify, pluralize bool) { hugofs.DestinationFS = new(afero.MemMapFs) viper.Reset() defer viper.Reset() viper.Set("baseurl", "http://auth/sub/") viper.Set("DefaultExtension", "html") viper.Set("UglyURLs", uglify) viper.Set("PluralizeListTitles", pluralize) viper.Set("CanonifyURLs", canonify) var expectedPathSuffix string if uglify { expectedPathSuffix = ".html" } else { expectedPathSuffix = "/index.html" } sources := []source.ByteSource{ {filepath.FromSlash("sect/doc1.html"), []byte("doc1")}, {filepath.FromSlash("Fish and Chips/doc2.html"), []byte("doc2")}, {filepath.FromSlash("ラーメン/doc3.html"), []byte("doc3")}, } s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, Targets: targetList{Page: &target.PagePub{UglyURLs: uglify}}, } s.initializeSiteInfo() templatePrep(s) must(s.addTemplate("_default/single.html", "{{.Content}}")) must(s.addTemplate("_default/list.html", "{{ .Title }}")) createAndRenderPages(t, s) s.RenderSectionLists() tests := []struct { doc string pluralAware bool expected string }{ {filepath.FromSlash(fmt.Sprintf("sect/doc1%s", expectedPathSuffix)), false, "doc1"}, {filepath.FromSlash(fmt.Sprintf("sect%s", expectedPathSuffix)), true, "Sect"}, {filepath.FromSlash(fmt.Sprintf("fish-and-chips/doc2%s", expectedPathSuffix)), false, "doc2"}, {filepath.FromSlash(fmt.Sprintf("fish-and-chips%s", expectedPathSuffix)), true, "Fish and Chips"}, {filepath.FromSlash(fmt.Sprintf("ラーメン/doc3%s", expectedPathSuffix)), false, "doc3"}, {filepath.FromSlash(fmt.Sprintf("ラーメン%s", expectedPathSuffix)), true, "ラーメン"}, } for _, test := range tests { file, err := hugofs.DestinationFS.Open(test.doc) if err != nil { t.Fatalf("Did not find %s in target: %s", test.doc, err) } content := helpers.ReaderToString(file) if test.pluralAware && pluralize { test.expected = inflect.Pluralize(test.expected) } if content != test.expected { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, content) } } }
func doTest404ShouldAlwaysHaveUglyUrls(t *testing.T, uglyURLs bool) { viper.Reset() defer viper.Reset() viper.Set("DefaultExtension", "html") viper.Set("verbose", true) viper.Set("baseurl", "http://auth/bub") viper.Set("DisableSitemap", false) viper.Set("DisableRSS", false) viper.Set("RSSUri", "index.xml") viper.Set("UglyURLs", uglyURLs) sources := []source.ByteSource{ {filepath.FromSlash("sect/doc1.html"), []byte("---\nmarkup: markdown\n---\n# title\nsome *content*")}, } s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, Targets: targetList{Page: &target.PagePub{UglyURLs: uglyURLs}}, } s.initializeSiteInfo() templatePrep(s) must(s.addTemplate("index.html", "Home Sweet Home. IsHome={{ .IsHome }}")) must(s.addTemplate("_default/single.html", "{{.Content}} IsHome={{ .IsHome }}")) must(s.addTemplate("404.html", "Page Not Found. IsHome={{ .IsHome }}")) // make sure the XML files also end up with ugly urls must(s.addTemplate("rss.xml", "<root>RSS</root>")) must(s.addTemplate("sitemap.xml", "<root>SITEMAP</root>")) createAndRenderPages(t, s) s.RenderHomePage() s.RenderSitemap() var expectedPagePath string if uglyURLs { expectedPagePath = "sect/doc1.html" } else { expectedPagePath = "sect/doc1/index.html" } tests := []struct { doc string expected string }{ {filepath.FromSlash("index.html"), "Home Sweet Home. IsHome=true"}, {filepath.FromSlash(expectedPagePath), "\n\n<h1 id=\"title:5d74edbb89ef198cd37882b687940cda\">title</h1>\n\n<p>some <em>content</em></p>\n IsHome=false"}, {filepath.FromSlash("404.html"), "Page Not Found. IsHome=false"}, {filepath.FromSlash("index.xml"), "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n<root>RSS</root>"}, {filepath.FromSlash("sitemap.xml"), "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n<root>SITEMAP</root>"}, } for _, p := range s.Pages { assert.False(t, p.IsHome) } for _, test := range tests { file, err := hugofs.DestinationFS.Open(test.doc) if err != nil { t.Fatalf("Did not find %s in target: %s", test.doc, err) } content := helpers.ReaderToString(file) if content != test.expected { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, content) } } }
func doTestCrossrefs(t *testing.T, relative, uglyUrls bool) { viper.Reset() defer viper.Reset() baseUrl := "http://foo/bar" viper.Set("DefaultExtension", "html") viper.Set("baseurl", baseUrl) viper.Set("UglyURLs", uglyUrls) viper.Set("verbose", true) var refShortcode string var expectedBase string var expectedUrlSuffix string var expectedPathSuffix string if relative { refShortcode = "relref" expectedBase = "/bar" } else { refShortcode = "ref" expectedBase = baseUrl } if uglyUrls { expectedUrlSuffix = ".html" expectedPathSuffix = ".html" } else { expectedUrlSuffix = "/" expectedPathSuffix = "/index.html" } sources := []source.ByteSource{ {filepath.FromSlash("sect/doc1.md"), []byte(fmt.Sprintf(`Ref 2: {{< %s "sect/doc2.md" >}}`, refShortcode))}, // Issue #1148: Make sure that no P-tags is added around shortcodes. {filepath.FromSlash("sect/doc2.md"), []byte(fmt.Sprintf(`**Ref 1:** {{< %s "sect/doc1.md" >}} THE END.`, refShortcode))}, } s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, Targets: targetList{Page: &target.PagePub{UglyURLs: uglyUrls}}, } s.initializeSiteInfo() templatePrep(s) must(s.addTemplate("_default/single.html", "{{.Content}}")) createAndRenderPages(t, s) tests := []struct { doc string expected string }{ {filepath.FromSlash(fmt.Sprintf("sect/doc1%s", expectedPathSuffix)), fmt.Sprintf("<p>Ref 2: %s/sect/doc2%s</p>\n", expectedBase, expectedUrlSuffix)}, {filepath.FromSlash(fmt.Sprintf("sect/doc2%s", expectedPathSuffix)), fmt.Sprintf("<p><strong>Ref 1:</strong></p>\n\n%s/sect/doc1%s\n\n<p>THE END.</p>\n", expectedBase, expectedUrlSuffix)}, } for _, test := range tests { file, err := hugofs.DestinationFS.Open(test.doc) if err != nil { t.Fatalf("Did not find %s in target: %s", test.doc, err) } content := helpers.ReaderToString(file) if content != test.expected { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, content) } } }
func (f *File) String() string { return helpers.ReaderToString(f.Contents) }