func TestRobotsTXTOutput(t *testing.T) { testCommonResetState() hugofs.InitMemFs() viper.Set("baseurl", "http://auth/bub/") viper.Set("enableRobotsTXT", true) s := &Site{ Source: &source.InMemorySource{ByteSource: weightedSources}, Language: helpers.NewDefaultLanguage(), } if err := buildAndRenderSite(s, "robots.txt", robotTxtTemplate); err != nil { t.Fatalf("Failed to build site: %s", err) } robotsFile, err := hugofs.Destination().Open("public/robots.txt") if err != nil { t.Fatalf("Unable to locate: robots.txt") } robots := helpers.ReaderToBytes(robotsFile) if !bytes.HasPrefix(robots, []byte("User-agent: Googlebot")) { t.Errorf("Robots file should start with 'User-agentL Googlebot'. %s", robots) } }
func TestRSSOutput(t *testing.T) { viper.Set("baseurl", "http://auth/bub/") hugofs.DestinationFS = new(afero.MemMapFs) s := &Site{ Source: &source.InMemorySource{ByteSource: WEIGHTED_SOURCES}, } s.initializeSiteInfo() s.prepTemplates() // Add an rss.xml template to invoke the rss build. s.addTemplate("rss.xml", RSS_TEMPLATE) 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.RenderHomePage(); err != nil { t.Fatalf("Unable to RenderHomePage: %s", err) } file, err := hugofs.DestinationFS.Open("index.xml") if err != nil { t.Fatalf("Unable to locate: %s", "index.xml") } rss := helpers.ReaderToBytes(file) if !bytes.HasPrefix(rss, []byte("<?xml")) { t.Errorf("rss feed should start with <?xml. %s", rss) } }
func TestSkipRender(t *testing.T) { 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("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.ReaderToBytes(file) 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) { 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.ReaderToBytes(file) expected := test.expected if !canonify { expected = strings.Replace(expected, viper.GetString("baseurl"), "", -1) } if string(content) != expected { t.Errorf("AbsUrlify content expected:\n%q\ngot\n%q", expected, string(content)) } } } }
func TestSitemapOutput(t *testing.T) { viper.Reset() defer viper.Reset() hugofs.DestinationFS = new(afero.MemMapFs) viper.Set("baseurl", "http://auth/bub/") s := &Site{ Source: &source.InMemorySource{ByteSource: WEIGHTED_SOURCES}, } s.initializeSiteInfo() s.prepTemplates() s.addTemplate("sitemap.xml", SITEMAP_TEMPLATE) 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.RenderHomePage(); err != nil { t.Fatalf("Unable to RenderHomePage: %s", err) } if err := s.RenderSitemap(); err != nil { t.Fatalf("Unable to RenderSitemap: %s", err) } if err := s.RenderRobotsTXT(); err != nil { t.Fatalf("Unable to RenderRobotsTXT :%s", err) } sitemapFile, err := hugofs.DestinationFS.Open("sitemap.xml") if err != nil { t.Fatalf("Unable to locate: sitemap.xml") } sitemap := helpers.ReaderToBytes(sitemapFile) if !bytes.HasPrefix(sitemap, []byte("<?xml")) { t.Errorf("Sitemap file should start with <?xml. %s", sitemap) } }
func TestRobotsTXTOutput(t *testing.T) { viper.Reset() defer viper.Reset() hugofs.DestinationFS = new(afero.MemMapFs) viper.Set("baseurl", "http://auth/bub/") s := &Site{ Source: &source.InMemorySource{ByteSource: WEIGHTED_SOURCES}, } s.initializeSiteInfo() s.prepTemplates() s.addTemplate("robots.txt", ROBOTSTXT_TEMPLATE) 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.RenderHomePage(); err != nil { t.Fatalf("Unable to RenderHomePage: %s", err) } if err := s.RenderSitemap(); err != nil { t.Fatalf("Unable to RenderSitemap: %s", err) } if err := s.RenderRobotsTXT(); err != nil { t.Fatalf("Unable to RenderRobotsTXT :%s", err) } robotsFile, err := hugofs.DestinationFS.Open("robots.txt") if err != nil { t.Fatalf("Unable to locate: robots.txt") } robots := helpers.ReaderToBytes(robotsFile) if !bytes.HasPrefix(robots, []byte("User-agent: Googlebot")) { t.Errorf("Robots file should start with 'User-agentL Googlebot'. %s", robots) } }
func TestRobotsTXTOutput(t *testing.T) { viper.Reset() defer viper.Reset() hugofs.InitMemFs() viper.Set("baseurl", "http://auth/bub/") viper.Set("enableRobotsTXT", true) s := &Site{ Source: &source.InMemorySource{ByteSource: weightedSources}, } s.initializeSiteInfo() s.prepTemplates("robots.txt", robotTxtTemplate) 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.renderHomePage(); err != nil { t.Fatalf("Unable to RenderHomePage: %s", err) } if err := s.renderSitemap(); err != nil { t.Fatalf("Unable to RenderSitemap: %s", err) } if err := s.renderRobotsTXT(); err != nil { t.Fatalf("Unable to RenderRobotsTXT :%s", err) } robotsFile, err := hugofs.Destination().Open("robots.txt") if err != nil { t.Fatalf("Unable to locate: robots.txt") } robots := helpers.ReaderToBytes(robotsFile) if !bytes.HasPrefix(robots, []byte("User-agent: Googlebot")) { t.Errorf("Robots file should start with 'User-agentL Googlebot'. %s", robots) } }
func TestRSSOutput(t *testing.T) { viper.Reset() defer viper.Reset() rssURI := "customrss.xml" viper.Set("baseurl", "http://auth/bub/") viper.Set("RSSUri", rssURI) hugofs.InitMemFs() s := &Site{ Source: &source.InMemorySource{ByteSource: weightedSources}, } s.initializeSiteInfo() s.prepTemplates("rss.xml", rssTemplate) 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.renderHomePage(); err != nil { t.Fatalf("Unable to RenderHomePage: %s", err) } file, err := hugofs.Destination().Open(rssURI) if err != nil { t.Fatalf("Unable to locate: %s", rssURI) } rss := helpers.ReaderToBytes(file) if !bytes.HasPrefix(rss, []byte("<?xml")) { t.Errorf("rss feed should start with <?xml. %s", rss) } }
func doTest404ShouldAlwaysHaveUglyUrls(t *testing.T, uglyURLs bool) { viper.Set("verbose", true) viper.Set("baseurl", "http://auth/bub") viper.Set("DisableSitemap", false) viper.Set("DisableRSS", false) 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")) must(s.addTemplate("_default/single.html", "{{.Content}}")) must(s.addTemplate("404.html", "Page Not Found")) // 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"}, {filepath.FromSlash(expectedPagePath), "\n\n<h1 id=\"title:5d74edbb89ef198cd37882b687940cda\">title</h1>\n\n<p>some <em>content</em></p>\n"}, {filepath.FromSlash("404.html"), "Page Not Found"}, {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 _, 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.ReaderToBytes(file) if !bytes.Equal(content, []byte(test.expected)) { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, string(content)) } } }
func (f *File) Bytes() []byte { return helpers.ReaderToBytes(f.Contents) }