// Copyright 2016 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package hugolib import ( "fmt" "path/filepath" "testing" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" "github.com/stretchr/testify/require" ) /* This file will test the "making everything a page" transition. See https://github.com/spf13/hugo/issues/2297 */ func TestNodesAsPage(t *testing.T) { //jww.SetStdoutThreshold(jww.LevelDebug) jww.SetStdoutThreshold(jww.LevelFatal) nodePageFeatureFlag = true defer toggleNodePageFeatureFlag() /* Will have to decide what to name the node content files, but: Home page should have: Content, shortcode support Metadata (title, dates etc.) Params Taxonomies (categories, tags) */ testCommonResetState() writeLayoutsForNodeAsPageTests(t) writeNodePagesForNodeAsPageTests("", t) // Add some regular pages for i := 1; i <= 4; i++ { sect := "sect1" if i > 2 { sect = "sect2" } writeSource(t, filepath.Join("content", sect, fmt.Sprintf("regular%d.md", i)), fmt.Sprintf(`--- title: Page %02d categories: [ "Hugo", "Web" ] --- Content Page %02d `, i, i)) } viper.Set("paginate", 1) viper.Set("title", "Hugo Rocks") viper.Set("rssURI", "customrss.xml") s := newSiteDefaultLang() if err := buildAndRenderSite(s); err != nil { t.Fatalf("Failed to build site: %s", err) } assertFileContent(t, filepath.Join("public", "index.html"), false, "Index Title: Home Sweet Home!", "Home Content!", "# Pages: 4") assertFileContent(t, filepath.Join("public", "sect1", "regular1", "index.html"), false, "Single Title: Page 01", "Content Page 01") h := s.owner nodes := h.findAllPagesByNodeType(NodeHome) require.Len(t, nodes, 1) home := nodes[0] require.True(t, home.IsHome()) require.True(t, home.IsNode()) require.False(t, home.IsPage()) pages := h.findAllPagesByNodeType(NodePage) require.Len(t, pages, 4) first := pages[0] require.False(t, first.IsHome()) require.False(t, first.IsNode()) require.True(t, first.IsPage()) first.Paginator() // Check Home paginator assertFileContent(t, filepath.Join("public", "page", "2", "index.html"), false, "Pag: Page 02") // Check Sections assertFileContent(t, filepath.Join("public", "sect1", "index.html"), false, "Section Title: Section", "Section1 Content!") assertFileContent(t, filepath.Join("public", "sect2", "index.html"), false, "Section Title: Section", "Section2 Content!") // Check Sections paginator assertFileContent(t, filepath.Join("public", "sect1", "page", "2", "index.html"), false, "Pag: Page 02") sections := h.findAllPagesByNodeType(NodeSection) require.Len(t, sections, 2) // Check taxonomy lists assertFileContent(t, filepath.Join("public", "categories", "hugo", "index.html"), false, "Taxonomy Title: Taxonomy Hugo", "Taxonomy Hugo Content!") assertFileContent(t, filepath.Join("public", "categories", "web", "index.html"), false, "Taxonomy Title: Taxonomy Web", "Taxonomy Web Content!") // Check taxonomy list paginator assertFileContent(t, filepath.Join("public", "categories", "hugo", "page", "2", "index.html"), false, "Taxonomy Title: Taxonomy Hugo", "Pag: Page 02") // Check taxonomy terms assertFileContent(t, filepath.Join("public", "categories", "index.html"), false, "Taxonomy Terms Title: Taxonomy Term Categories", "Taxonomy Term Categories Content!", "k/v: hugo") // There are no pages to paginate over in the taxonomy terms. // RSS assertFileContent(t, filepath.Join("public", "customrss.xml"), false, "Recent content in Home Sweet Home! on Hugo Rocks", " 2 { sect = "sect2" } writeSource(t, filepath.Join("content", sect, fmt.Sprintf("regular%d.md", i)), fmt.Sprintf(`--- title: Page %02d categories: [ "Hugo", "Web" ] --- Content Page %02d `, i, i)) } viper.Set("paginate", 1) viper.Set("title", "Hugo Rocks!") viper.Set("rssURI", "customrss.xml") s := newSiteDefaultLang() if err := buildAndRenderSite(s); err != nil { t.Fatalf("Failed to build site: %s", err) } // Home page homePages := s.findIndexNodesByNodeType(NodeHome) require.Len(t, homePages, 1) homePage := homePages[0] require.Len(t, homePage.Data["Pages"], 4) assertFileContent(t, filepath.Join("public", "index.html"), false, "Index Title: Hugo Rocks!") // Taxonomy list assertFileContent(t, filepath.Join("public", "categories", "hugo", "index.html"), false, "Taxonomy Title: Hugo") // Taxonomy terms assertFileContent(t, filepath.Join("public", "categories", "index.html"), false, "Taxonomy Terms Title: Categories") // Sections assertFileContent(t, filepath.Join("public", "sect1", "index.html"), false, "Section Title: Sect1s") assertFileContent(t, filepath.Join("public", "sect2", "index.html"), false, "Section Title: Sect2s") // RSS assertFileContent(t, filepath.Join("public", "customrss.xml"), false, "Recent content in Hugo Rocks! on Hugo Rocks!", " 2 { sect = "sect2" } writeSource(t, filepath.Join("content", sect, fmt.Sprintf("regular%d.%s.md", i, lang)), fmt.Sprintf(`--- title: Page %02d categories: [ "Hugo", "Web" ] --- Content Page %02d `, i, i)) } } // Only write node pages for the English side of the fence writeNodePagesForNodeAsPageTests("en", t) if err := LoadGlobalConfig("", "config.toml"); err != nil { t.Fatalf("Failed to load config: %s", err) } sites, err := NewHugoSitesFromConfiguration() if err != nil { t.Fatalf("Failed to create sites: %s", err) } if len(sites.Sites) != 2 { t.Fatalf("Got %d sites", len(sites.Sites)) } err = sites.Build(BuildCfg{}) if err != nil { t.Fatalf("Failed to build sites: %s", err) } // The en language has content pages // TODO(bep) np alias URL check assertFileContent(t, filepath.Join("public", "nn", "index.html"), true, "Index Title: Hugo på norsk") assertFileContent(t, filepath.Join("public", "en", "index.html"), true, "Index Title: Home Sweet Home!", "Content!") // Taxonomy list assertFileContent(t, filepath.Join("public", "nn", "categories", "hugo", "index.html"), true, "Taxonomy Title: Hugo") assertFileContent(t, filepath.Join("public", "en", "categories", "hugo", "index.html"), true, "Taxonomy Title: Taxonomy Hugo") // Taxonomy terms assertFileContent(t, filepath.Join("public", "nn", "categories", "index.html"), true, "Taxonomy Terms Title: Categories") assertFileContent(t, filepath.Join("public", "en", "categories", "index.html"), true, "Taxonomy Terms Title: Taxonomy Term Categories") // Sections assertFileContent(t, filepath.Join("public", "nn", "sect1", "index.html"), true, "Section Title: Sect1s") assertFileContent(t, filepath.Join("public", "nn", "sect2", "index.html"), true, "Section Title: Sect2s") assertFileContent(t, filepath.Join("public", "en", "sect1", "index.html"), true, "Section Title: Section1") assertFileContent(t, filepath.Join("public", "en", "sect2", "index.html"), true, "Section Title: Section2") // RSS assertFileContent(t, filepath.Join("public", "nn", "customrss.xml"), true, "Recent content in Hugo på norsk on Hugo på norsk", "