hugolib: Test cleaning #1
This commit is contained in:
parent
af67ad8af1
commit
debd3663dd
6 changed files with 479 additions and 585 deletions
|
@ -19,12 +19,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/deps"
|
"github.com/gohugoio/hugo/deps"
|
||||||
jww "github.com/spf13/jwalterweatherman"
|
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -327,7 +322,7 @@ func doTestDataDirImpl(t *testing.T, dd dataDir, expected interface{}, configKey
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
logger = jww.NewNotepad(jww.LevelWarn, jww.LevelWarn, os.Stdout, ioutil.Discard, t.Name(), log.Ldate|log.Ltime)
|
logger = newErrorLogger()
|
||||||
depsCfg = deps.DepsCfg{Fs: fs, Cfg: cfg, Logger: logger}
|
depsCfg = deps.DepsCfg{Fs: fs, Cfg: cfg, Logger: logger}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,21 +1,21 @@
|
||||||
package hugolib
|
package hugolib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/spf13/afero"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMultihosts(t *testing.T) {
|
func TestMultihosts(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
var multiSiteTOMLConfigTemplate = `
|
assert := require.New(t)
|
||||||
|
|
||||||
|
var configTemplate = `
|
||||||
paginate = 1
|
paginate = 1
|
||||||
disablePathToLower = true
|
disablePathToLower = true
|
||||||
defaultContentLanguage = "{{ .DefaultContentLanguage }}"
|
defaultContentLanguage = "fr"
|
||||||
defaultContentLanguageInSubdir = {{ .DefaultContentLanguageInSubdir }}
|
defaultContentLanguageInSubdir = false
|
||||||
staticDir = ["s1", "s2"]
|
staticDir = ["s1", "s2"]
|
||||||
|
|
||||||
[permalinks]
|
[permalinks]
|
||||||
|
@ -48,18 +48,12 @@ languageName = "Nynorsk"
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
siteConfig := testSiteConfig{Running: true, Fs: afero.NewMemMapFs(), DefaultContentLanguage: "fr", DefaultContentLanguageInSubdir: false}
|
b := newMultiSiteTestDefaultBuilder(t).WithConfig("toml", configTemplate)
|
||||||
sites := createMultiTestSites(t, siteConfig, multiSiteTOMLConfigTemplate)
|
b.CreateSites().Build(BuildCfg{})
|
||||||
fs := sites.Fs
|
|
||||||
th := testHelper{sites.Cfg, fs, t}
|
|
||||||
assert := require.New(t)
|
|
||||||
cfg := BuildCfg{}
|
|
||||||
err := sites.Build(cfg)
|
|
||||||
assert.NoError(err)
|
|
||||||
|
|
||||||
th.assertFileContent("public/en/sect/doc1-slug/index.html", "Hello")
|
b.AssertFileContent("public/en/sect/doc1-slug/index.html", "Hello")
|
||||||
|
|
||||||
s1 := sites.Sites[0]
|
s1 := b.H.Sites[0]
|
||||||
|
|
||||||
assert.Equal([]string{"s1", "s2", "ens1", "ens2"}, s1.StaticDirs())
|
assert.Equal([]string{"s1", "s2", "ens1", "ens2"}, s1.StaticDirs())
|
||||||
|
|
||||||
|
@ -78,26 +72,26 @@ languageName = "Nynorsk"
|
||||||
assert.NotNil(pageWithURLInFrontMatter)
|
assert.NotNil(pageWithURLInFrontMatter)
|
||||||
assert.Equal("/superbob", pageWithURLInFrontMatter.URL())
|
assert.Equal("/superbob", pageWithURLInFrontMatter.URL())
|
||||||
assert.Equal("/docs/superbob/", pageWithURLInFrontMatter.RelPermalink())
|
assert.Equal("/docs/superbob/", pageWithURLInFrontMatter.RelPermalink())
|
||||||
th.assertFileContent("public/en/superbob/index.html", "doc3|Hello|en")
|
b.AssertFileContent("public/en/superbob/index.html", "doc3|Hello|en")
|
||||||
|
|
||||||
// check alias:
|
// check alias:
|
||||||
th.assertFileContent("public/en/al/alias1/index.html", `content="0; url=https://example.com/docs/superbob/"`)
|
b.AssertFileContent("public/en/al/alias1/index.html", `content="0; url=https://example.com/docs/superbob/"`)
|
||||||
th.assertFileContent("public/en/al/alias2/index.html", `content="0; url=https://example.com/docs/superbob/"`)
|
b.AssertFileContent("public/en/al/alias2/index.html", `content="0; url=https://example.com/docs/superbob/"`)
|
||||||
|
|
||||||
s2 := sites.Sites[1]
|
s2 := b.H.Sites[1]
|
||||||
assert.Equal([]string{"s1", "s2", "frs1", "frs2"}, s2.StaticDirs())
|
assert.Equal([]string{"s1", "s2", "frs1", "frs2"}, s2.StaticDirs())
|
||||||
|
|
||||||
s2h := s2.getPage(KindHome)
|
s2h := s2.getPage(KindHome)
|
||||||
assert.Equal("https://example.fr/", s2h.Permalink())
|
assert.Equal("https://example.fr/", s2h.Permalink())
|
||||||
|
|
||||||
th.assertFileContentStraight("public/fr/index.html", "French Home Page")
|
b.AssertFileContent("public/fr/index.html", "French Home Page")
|
||||||
th.assertFileContentStraight("public/en/index.html", "Default Home Page")
|
b.AssertFileContent("public/en/index.html", "Default Home Page")
|
||||||
|
|
||||||
// Check paginators
|
// Check paginators
|
||||||
th.assertFileContent("public/en/page/1/index.html", `refresh" content="0; url=https://example.com/docs/"`)
|
b.AssertFileContent("public/en/page/1/index.html", `refresh" content="0; url=https://example.com/docs/"`)
|
||||||
th.assertFileContent("public/nn/page/1/index.html", `refresh" content="0; url=https://example.no/"`)
|
b.AssertFileContent("public/nn/page/1/index.html", `refresh" content="0; url=https://example.no/"`)
|
||||||
th.assertFileContent("public/en/sect/page/2/index.html", "List Page 2", "Hello", "https://example.com/docs/sect/", "\"/docs/sect/page/3/")
|
b.AssertFileContent("public/en/sect/page/2/index.html", "List Page 2", "Hello", "https://example.com/docs/sect/", "\"/docs/sect/page/3/")
|
||||||
th.assertFileContent("public/fr/sect/page/2/index.html", "List Page 2", "Bonjour", "https://example.fr/sect/")
|
b.AssertFileContent("public/fr/sect/page/2/index.html", "List Page 2", "Bonjour", "https://example.fr/sect/")
|
||||||
|
|
||||||
// Check bundles
|
// Check bundles
|
||||||
|
|
||||||
|
@ -108,7 +102,7 @@ languageName = "Nynorsk"
|
||||||
logoEn := bundleEn.Resources.GetByPrefix("logo")
|
logoEn := bundleEn.Resources.GetByPrefix("logo")
|
||||||
require.NotNil(t, logoEn)
|
require.NotNil(t, logoEn)
|
||||||
require.Equal(t, "/docs/bundles/b1/logo.png", logoEn.RelPermalink())
|
require.Equal(t, "/docs/bundles/b1/logo.png", logoEn.RelPermalink())
|
||||||
require.Contains(t, readFileFromFs(t, fs.Destination, filepath.FromSlash("public/en/bundles/b1/logo.png")), "PNG Data")
|
b.AssertFileContent("public/en/bundles/b1/logo.png", "PNG Data")
|
||||||
|
|
||||||
bundleFr := s2.getPage(KindPage, "bundles/b1/index.md")
|
bundleFr := s2.getPage(KindPage, "bundles/b1/index.md")
|
||||||
require.NotNil(t, bundleFr)
|
require.NotNil(t, bundleFr)
|
||||||
|
@ -117,6 +111,6 @@ languageName = "Nynorsk"
|
||||||
logoFr := bundleFr.Resources.GetByPrefix("logo")
|
logoFr := bundleFr.Resources.GetByPrefix("logo")
|
||||||
require.NotNil(t, logoFr)
|
require.NotNil(t, logoFr)
|
||||||
require.Equal(t, "/bundles/b1/logo.png", logoFr.RelPermalink())
|
require.Equal(t, "/bundles/b1/logo.png", logoFr.RelPermalink())
|
||||||
require.Contains(t, readFileFromFs(t, fs.Destination, filepath.FromSlash("public/fr/bundles/b1/logo.png")), "PNG Data")
|
b.AssertFileContent("public/fr/bundles/b1/logo.png", "PNG Data")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,7 @@ func TestPageBundlerCaptureSymlinks(t *testing.T) {
|
||||||
sourceSpec := source.NewSourceSpec(cfg, fs)
|
sourceSpec := source.NewSourceSpec(cfg, fs)
|
||||||
|
|
||||||
fileStore := &storeFilenames{}
|
fileStore := &storeFilenames{}
|
||||||
logger := newWarningLogger()
|
logger := newErrorLogger()
|
||||||
c := newCapturer(logger, sourceSpec, fileStore, nil, filepath.Join(workDir, contentDir))
|
c := newCapturer(logger, sourceSpec, fileStore, nil, filepath.Join(workDir, contentDir))
|
||||||
|
|
||||||
assert.NoError(c.capture())
|
assert.NoError(c.capture())
|
||||||
|
|
|
@ -301,7 +301,7 @@ func TestPageBundlerSiteWitSymbolicLinksInContent(t *testing.T) {
|
||||||
assert := require.New(t)
|
assert := require.New(t)
|
||||||
cfg, fs, workDir := newTestBundleSymbolicSources(t)
|
cfg, fs, workDir := newTestBundleSymbolicSources(t)
|
||||||
|
|
||||||
s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Cfg: cfg, Logger: newWarningLogger()}, BuildCfg{})
|
s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Cfg: cfg, Logger: newErrorLogger()}, BuildCfg{})
|
||||||
|
|
||||||
th := testHelper{s.Cfg, s.Fs, t}
|
th := testHelper{s.Cfg, s.Fs, t}
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,11 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"text/template"
|
||||||
|
|
||||||
jww "github.com/spf13/jwalterweatherman"
|
jww "github.com/spf13/jwalterweatherman"
|
||||||
|
|
||||||
|
@ -24,6 +26,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/hugofs"
|
"github.com/gohugoio/hugo/hugofs"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,8 +37,14 @@ type sitesBuilder struct {
|
||||||
Fs *hugofs.Fs
|
Fs *hugofs.Fs
|
||||||
T testing.TB
|
T testing.TB
|
||||||
|
|
||||||
|
// Aka the Hugo server mode.
|
||||||
|
running bool
|
||||||
|
|
||||||
H *HugoSites
|
H *HugoSites
|
||||||
|
|
||||||
|
// Default toml
|
||||||
|
configFormat string
|
||||||
|
|
||||||
// We will add some default if not set.
|
// We will add some default if not set.
|
||||||
templatesAdded bool
|
templatesAdded bool
|
||||||
i18nAdded bool
|
i18nAdded bool
|
||||||
|
@ -47,11 +56,31 @@ func newTestSitesBuilder(t testing.TB) *sitesBuilder {
|
||||||
v := viper.New()
|
v := viper.New()
|
||||||
fs := hugofs.NewMem(v)
|
fs := hugofs.NewMem(v)
|
||||||
|
|
||||||
return &sitesBuilder{T: t, Fs: fs}
|
return &sitesBuilder{T: t, Fs: fs, configFormat: "toml"}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sitesBuilder) WithTOMLConfig(conf string) *sitesBuilder {
|
func (s *sitesBuilder) Running() *sitesBuilder {
|
||||||
writeSource(s.T, s.Fs, "config.toml", conf)
|
s.running = true
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sitesBuilder) WithConfigTemplate(data interface{}, format, configTemplate string) *sitesBuilder {
|
||||||
|
if format == "" {
|
||||||
|
format = "toml"
|
||||||
|
}
|
||||||
|
|
||||||
|
templ, err := template.New("test").Parse(configTemplate)
|
||||||
|
if err != nil {
|
||||||
|
s.T.Fatal("Template parse failed:", err)
|
||||||
|
}
|
||||||
|
var b bytes.Buffer
|
||||||
|
templ.Execute(&b, data)
|
||||||
|
return s.WithConfig(format, b.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sitesBuilder) WithConfig(format, conf string) *sitesBuilder {
|
||||||
|
writeSource(s.T, s.Fs, "config."+format, conf)
|
||||||
|
s.configFormat = format
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,12 +142,19 @@ paginatePath = "side"
|
||||||
lag = "lag"
|
lag = "lag"
|
||||||
`
|
`
|
||||||
|
|
||||||
return s.WithTOMLConfig(defaultMultiSiteConfig)
|
return s.WithConfig("toml", defaultMultiSiteConfig)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sitesBuilder) WithContent(filenameContent ...string) *sitesBuilder {
|
func (s *sitesBuilder) WithContent(filenameContent ...string) *sitesBuilder {
|
||||||
s.contentAdded = true
|
s.contentAdded = true
|
||||||
|
return s.WithContentAdded(filenameContent...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sitesBuilder) WithContentAdded(filenameContent ...string) *sitesBuilder {
|
||||||
|
if len(filenameContent)%2 != 0 {
|
||||||
|
s.Fatalf("expect filenameContent in pairs")
|
||||||
|
}
|
||||||
for i := 0; i < len(filenameContent); i += 2 {
|
for i := 0; i < len(filenameContent); i += 2 {
|
||||||
filename, content := filenameContent[i], filenameContent[i+1]
|
filename, content := filenameContent[i], filenameContent[i+1]
|
||||||
writeSource(s.T, s.Fs, filepath.Join("content", filename), content)
|
writeSource(s.T, s.Fs, filepath.Join("content", filename), content)
|
||||||
|
@ -127,7 +163,14 @@ func (s *sitesBuilder) WithContent(filenameContent ...string) *sitesBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sitesBuilder) WithTemplates(filenameContent ...string) *sitesBuilder {
|
func (s *sitesBuilder) WithTemplates(filenameContent ...string) *sitesBuilder {
|
||||||
|
if len(filenameContent)%2 != 0 {
|
||||||
|
s.Fatalf("expect filenameContent in pairs")
|
||||||
|
}
|
||||||
s.templatesAdded = true
|
s.templatesAdded = true
|
||||||
|
return s.WithTemplatesAdded(filenameContent...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sitesBuilder) WithTemplatesAdded(filenameContent ...string) *sitesBuilder {
|
||||||
for i := 0; i < len(filenameContent); i += 2 {
|
for i := 0; i < len(filenameContent); i += 2 {
|
||||||
filename, content := filenameContent[i], filenameContent[i+1]
|
filename, content := filenameContent[i], filenameContent[i+1]
|
||||||
writeSource(s.T, s.Fs, filepath.Join("layouts", filename), content)
|
writeSource(s.T, s.Fs, filepath.Join("layouts", filename), content)
|
||||||
|
@ -150,14 +193,14 @@ func (s *sitesBuilder) CreateSites() *sitesBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.Cfg == nil {
|
if s.Cfg == nil {
|
||||||
cfg, err := LoadConfig(s.Fs.Source, "", "config.toml")
|
cfg, err := LoadConfig(s.Fs.Source, "", "config."+s.configFormat)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.T.Fatalf("Failed to load config: %s", err)
|
s.T.Fatalf("Failed to load config: %s", err)
|
||||||
}
|
}
|
||||||
s.Cfg = cfg
|
s.Cfg = cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
sites, err := NewHugoSites(deps.DepsCfg{Fs: s.Fs, Cfg: s.Cfg})
|
sites, err := NewHugoSites(deps.DepsCfg{Fs: s.Fs, Cfg: s.Cfg, Running: s.running})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.T.Fatalf("Failed to create sites: %s", err)
|
s.T.Fatalf("Failed to create sites: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -243,11 +286,22 @@ date: "2018-02-28"
|
||||||
writeSource(t, fs, filepath.FromSlash("content/sect/doc1.nn.md"), contentTemplate)
|
writeSource(t, fs, filepath.FromSlash("content/sect/doc1.nn.md"), contentTemplate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *sitesBuilder) Fatalf(format string, args ...interface{}) {
|
||||||
|
Fatalf(s.T, format, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fatalf(t testing.TB, format string, args ...interface{}) {
|
||||||
|
trace := strings.Join(assert.CallerInfo(), "\n\r\t\t\t")
|
||||||
|
format = format + "\n%s"
|
||||||
|
args = append(args, trace)
|
||||||
|
t.Fatalf(format, args...)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *sitesBuilder) AssertFileContent(filename string, matches ...string) {
|
func (s *sitesBuilder) AssertFileContent(filename string, matches ...string) {
|
||||||
content := readDestination(s.T, s.Fs, filename)
|
content := readDestination(s.T, s.Fs, filename)
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
if !strings.Contains(content, match) {
|
if !strings.Contains(content, match) {
|
||||||
s.T.Fatalf("No match for %q in content for %s\n%q", match, filename, content)
|
s.Fatalf("No match for %q in content for %s\n%q", match, filename, content)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,7 +311,7 @@ func (s *sitesBuilder) AssertFileContentRe(filename string, matches ...string) {
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
r := regexp.MustCompile(match)
|
r := regexp.MustCompile(match)
|
||||||
if !r.MatchString(content) {
|
if !r.MatchString(content) {
|
||||||
s.T.Fatalf("No match for %q in content for %s\n%q", match, filename, content)
|
s.Fatalf("No match for %q in content for %s\n%q", match, filename, content)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,14 +331,6 @@ func (th testHelper) assertFileContent(filename string, matches ...string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(bep) better name for this. It does no magic replacements depending on defaultontentLanguageInSubDir.
|
|
||||||
func (th testHelper) assertFileContentStraight(filename string, matches ...string) {
|
|
||||||
content := readDestination(th.T, th.Fs, filename)
|
|
||||||
for _, match := range matches {
|
|
||||||
require.True(th.T, strings.Contains(content, match), fmt.Sprintf("File no match for\n%q in\n%q:\n%s", strings.Replace(match, "%", "%%", -1), filename, strings.Replace(content, "%", "%%", -1)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (th testHelper) assertFileContentRegexp(filename string, matches ...string) {
|
func (th testHelper) assertFileContentRegexp(filename string, matches ...string) {
|
||||||
filename = th.replaceDefaultContentLanguageValue(filename)
|
filename = th.replaceDefaultContentLanguageValue(filename)
|
||||||
content := readDestination(th.T, th.Fs, filename)
|
content := readDestination(th.T, th.Fs, filename)
|
||||||
|
@ -359,14 +405,14 @@ func newTestSite(t testing.TB, configKeyValues ...interface{}) *Site {
|
||||||
s, err := NewSiteForCfg(d)
|
s, err := NewSiteForCfg(d)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create Site: %s", err)
|
Fatalf(t, "Failed to create Site: %s", err)
|
||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTestSitesFromConfig(t testing.TB, afs afero.Fs, tomlConfig string, layoutPathContentPairs ...string) (testHelper, *HugoSites) {
|
func newTestSitesFromConfig(t testing.TB, afs afero.Fs, tomlConfig string, layoutPathContentPairs ...string) (testHelper, *HugoSites) {
|
||||||
if len(layoutPathContentPairs)%2 != 0 {
|
if len(layoutPathContentPairs)%2 != 0 {
|
||||||
t.Fatalf("Layouts must be provided in pairs")
|
Fatalf(t, "Layouts must be provided in pairs")
|
||||||
}
|
}
|
||||||
|
|
||||||
writeToFs(t, afs, "config.toml", tomlConfig)
|
writeToFs(t, afs, "config.toml", tomlConfig)
|
||||||
|
|
Loading…
Add table
Reference in a new issue