// 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)
/* 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", "