summaryrefslogtreecommitdiffstats
path: root/hugolib/hugo_themes_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/hugo_themes_test.go')
-rw-r--r--hugolib/hugo_themes_test.go268
1 files changed, 268 insertions, 0 deletions
diff --git a/hugolib/hugo_themes_test.go b/hugolib/hugo_themes_test.go
new file mode 100644
index 000000000..05bfaa692
--- /dev/null
+++ b/hugolib/hugo_themes_test.go
@@ -0,0 +1,268 @@
+// Copyright 2018 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"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/gohugoio/hugo/common/loggers"
+)
+
+func TestThemesGraph(t *testing.T) {
+ t.Parallel()
+
+ const (
+ themeStandalone = `
+title = "Theme Standalone"
+[params]
+v1 = "v1s"
+v2 = "v2s"
+`
+ themeCyclic = `
+title = "Theme Cyclic"
+theme = "theme3"
+[params]
+v1 = "v1c"
+v2 = "v2c"
+`
+ theme1 = `
+title = "Theme #1"
+theme = "themeStandalone"
+[params]
+v2 = "v21"
+`
+
+ theme2 = `
+title = "Theme #2"
+theme = "theme1"
+[params]
+v1 = "v12"
+`
+
+ theme3 = `
+title = "Theme #3"
+theme = ["theme2", "themeStandalone", "themeCyclic"]
+[params]
+v1 = "v13"
+v2 = "v24"
+`
+
+ theme4 = `
+title = "Theme #4"
+theme = "theme3"
+[params]
+v1 = "v14"
+v2 = "v24"
+`
+
+ site1 = `
+ theme = "theme4"
+
+ [params]
+ v1 = "site"
+`
+ site2 = `
+ theme = ["theme2", "themeStandalone"]
+`
+ )
+
+ var (
+ testConfigs = []struct {
+ siteConfig string
+
+ // The name of theme somewhere in the middle to write custom key/files.
+ offset string
+
+ check func(b *sitesBuilder)
+ }{
+ {site1, "theme3", func(b *sitesBuilder) {
+
+ // site1: theme4 theme3 theme2 theme1 themeStandalone themeCyclic
+
+ // Check data
+ // theme3 should win the offset competition
+ b.AssertFileContent("public/index.html", "theme1o::[offset][v]theme3", "theme4o::[offset][v]theme3", "themeStandaloneo::[offset][v]theme3")
+ b.AssertFileContent("public/index.html", "nproject::[inner][other]project|[project][other]project|[theme][other]theme4|[theme1][other]theme1")
+ b.AssertFileContent("public/index.html", "ntheme::[inner][other]theme4|[theme][other]theme4|[theme1][other]theme1|[theme2][other]theme2|[theme3][other]theme3")
+ b.AssertFileContent("public/index.html", "theme1::[inner][other]project|[project][other]project|[theme][other]theme1|[theme1][other]theme1|")
+ b.AssertFileContent("public/index.html", "theme4::[inner][other]project|[project][other]project|[theme][other]theme4|[theme4][other]theme4|")
+
+ // Check layouts
+ b.AssertFileContent("public/index.html", "partial ntheme: theme4", "partial theme2o: theme3")
+
+ // Check i18n
+ b.AssertFileContent("public/index.html", "i18n: project theme4")
+
+ // Check static files
+ // TODO(bep) static files not currently part of the build b.AssertFileContent("public/nproject.txt", "TODO")
+
+ // Check site params
+ b.AssertFileContent("public/index.html", "v1::site", "v2::v24")
+ }},
+ {site2, "", func(b *sitesBuilder) {
+
+ // site2: theme2 theme1 themeStandalone
+ b.AssertFileContent("public/index.html", "nproject::[inner][other]project|[project][other]project|[theme][other]theme2|[theme1][other]theme1|[theme2][other]theme2|[themeStandalone][other]themeStandalone|")
+ b.AssertFileContent("public/index.html", "ntheme::[inner][other]theme2|[theme][other]theme2|[theme1][other]theme1|[theme2][other]theme2|[themeStandalone][other]themeStandalone|")
+ b.AssertFileContent("public/index.html", "i18n: project theme2")
+ b.AssertFileContent("public/index.html", "partial ntheme: theme2")
+
+ // Params only set in themes
+ b.AssertFileContent("public/index.html", "v1::v12", "v2::v21")
+
+ }},
+ }
+
+ themeConfigs = []struct {
+ name string
+ config string
+ }{
+ {"themeStandalone", themeStandalone},
+ {"themeCyclic", themeCyclic},
+ {"theme1", theme1},
+ {"theme2", theme2},
+ {"theme3", theme3},
+ {"theme4", theme4},
+ }
+ )
+
+ for i, testConfig := range testConfigs {
+ t.Log(fmt.Sprintf("Test %d", i))
+ b := newTestSitesBuilder(t).WithLogger(loggers.NewErrorLogger())
+ b.WithConfigFile("toml", testConfig.siteConfig)
+
+ for _, tc := range themeConfigs {
+ var variationsNameBase = []string{"nproject", "ntheme", tc.name}
+
+ themeRoot := filepath.Join("themes", tc.name)
+ b.WithSourceFile(filepath.Join(themeRoot, "config.toml"), tc.config)
+
+ b.WithSourceFile(filepath.Join("layouts", "partials", "m.html"), `{{- range $k, $v := . }}{{ $k }}::{{ template "printv" $v }}
+{{ end }}
+{{ define "printv" }}
+{{- $tp := printf "%T" . -}}
+{{- if (strings.HasSuffix $tp "map[string]interface {}") -}}
+{{- range $k, $v := . }}[{{ $k }}]{{ template "printv" $v }}{{ end -}}
+{{- else -}}
+{{- . }}|
+{{- end -}}
+{{ end }}
+`)
+
+ for _, nameVariaton := range variationsNameBase {
+ roots := []string{"", themeRoot}
+
+ for _, root := range roots {
+ name := tc.name
+ if root == "" {
+ name = "project"
+ }
+
+ if nameVariaton == "ntheme" && name == "project" {
+ continue
+ }
+
+ // static
+ b.WithSourceFile(filepath.Join(root, "static", nameVariaton+".txt"), name)
+
+ // layouts
+ if i == 1 {
+ b.WithSourceFile(filepath.Join(root, "layouts", "partials", "theme2o.html"), "Not Set")
+ }
+ b.WithSourceFile(filepath.Join(root, "layouts", "partials", nameVariaton+".html"), name)
+ if root != "" && testConfig.offset == tc.name {
+ for _, tc2 := range themeConfigs {
+ b.WithSourceFile(filepath.Join(root, "layouts", "partials", tc2.name+"o.html"), name)
+ }
+ }
+
+ // i18n + data
+
+ var dataContent string
+ if root == "" {
+ dataContent = fmt.Sprintf(`
+[%s]
+other = %q
+
+[inner]
+other = %q
+
+`, name, name, name)
+ } else {
+ dataContent = fmt.Sprintf(`
+[%s]
+other = %q
+
+[inner]
+other = %q
+
+[theme]
+other = %q
+
+`, name, name, name, name)
+ }
+
+ b.WithSourceFile(filepath.Join(root, "data", nameVariaton+".toml"), dataContent)
+ b.WithSourceFile(filepath.Join(root, "i18n", "en.toml"), dataContent)
+
+ // If an offset is set, duplicate a data key with a winner in the middle.
+ if root != "" && testConfig.offset == tc.name {
+ for _, tc2 := range themeConfigs {
+ dataContent := fmt.Sprintf(`
+[offset]
+v = %q
+`, tc.name)
+ b.WithSourceFile(filepath.Join(root, "data", tc2.name+"o.toml"), dataContent)
+ }
+ }
+ }
+
+ }
+
+ }
+
+ for _, themeConfig := range themeConfigs {
+ b.WithSourceFile(filepath.Join("themes", "config.toml"), themeConfig.config)
+ }
+
+ b.WithContent(filepath.Join("content", "page.md"), `---
+title: "Page"
+---
+
+`)
+
+ homeTpl := `
+data: {{ partial "m" .Site.Data }}
+i18n: {{ i18n "inner" }} {{ i18n "theme" }}
+partial ntheme: {{ partial "ntheme" . }}
+partial theme2o: {{ partial "theme2o" . }}
+params: {{ partial "m" .Site.Params }}
+
+`
+
+ b.WithTemplates(filepath.Join("layouts", "home.html"), homeTpl)
+
+ b.Build(BuildCfg{})
+
+ var _ = os.Stdout
+
+ // printFs(b.H.Deps.BaseFs.LayoutsFs, "", os.Stdout)
+ testConfig.check(b)
+
+ }
+
+}