summaryrefslogtreecommitdiffhomepage
path: root/output/layout_base_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'output/layout_base_test.go')
-rw-r--r--output/layout_base_test.go168
1 files changed, 168 insertions, 0 deletions
diff --git a/output/layout_base_test.go b/output/layout_base_test.go
new file mode 100644
index 000000000..b78f31352
--- /dev/null
+++ b/output/layout_base_test.go
@@ -0,0 +1,168 @@
+// Copyright 2017-present 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 output
+
+import (
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestLayoutBase(t *testing.T) {
+
+ var (
+ workingDir = "/sites/mysite/"
+ themeDir = "/themes/mytheme/"
+ layoutBase1 = "layouts"
+ layoutPath1 = "_default/single.html"
+ layoutPathAmp = "_default/single.amp.html"
+ layoutPathJSON = "_default/single.json"
+ )
+
+ for _, this := range []struct {
+ name string
+ d TemplateLookupDescriptor
+ needsBase bool
+ basePathMatchStrings string
+ expect TemplateNames
+ }{
+ {"No base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1}, false, "",
+ TemplateNames{
+ Name: "_default/single.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.html",
+ }},
+ {"Base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1}, true, "",
+ TemplateNames{
+ Name: "_default/single.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.html",
+ MasterFilename: "/sites/mysite/layouts/_default/single-baseof.html",
+ }},
+ {"Base in theme", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1, ThemeDir: themeDir}, true,
+ "mytheme/layouts/_default/baseof.html",
+ TemplateNames{
+ Name: "_default/single.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.html",
+ MasterFilename: "/themes/mytheme/layouts/_default/baseof.html",
+ }},
+ {"Template in theme, base in theme", TemplateLookupDescriptor{TemplateDir: themeDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1, ThemeDir: themeDir}, true,
+ "mytheme/layouts/_default/baseof.html",
+ TemplateNames{
+ Name: "_default/single.html",
+ OverlayFilename: "/themes/mytheme/layouts/_default/single.html",
+ MasterFilename: "/themes/mytheme/layouts/_default/baseof.html",
+ }},
+ {"Template in theme, base in site", TemplateLookupDescriptor{TemplateDir: themeDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1, ThemeDir: themeDir}, true,
+ "/sites/mysite/layouts/_default/baseof.html",
+ TemplateNames{
+ Name: "_default/single.html",
+ OverlayFilename: "/themes/mytheme/layouts/_default/single.html",
+ MasterFilename: "/sites/mysite/layouts/_default/baseof.html",
+ }},
+ {"Template in site, base in theme", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1, ThemeDir: themeDir}, true,
+ "/themes/mytheme",
+ TemplateNames{
+ Name: "_default/single.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.html",
+ MasterFilename: "/themes/mytheme/layouts/_default/single-baseof.html",
+ }},
+ {"With prefix, base in theme", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPath1,
+ ThemeDir: themeDir, Prefix: "someprefix"}, true,
+ "mytheme/layouts/_default/baseof.html",
+ TemplateNames{
+ Name: "someprefix/_default/single.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.html",
+ MasterFilename: "/themes/mytheme/layouts/_default/baseof.html",
+ }},
+ {"Partial", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: "partials/menu.html"}, true,
+ "mytheme/layouts/_default/baseof.html",
+ TemplateNames{
+ Name: "partials/menu.html",
+ OverlayFilename: "/sites/mysite/layouts/partials/menu.html",
+ }},
+ {"AMP, no base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathAmp}, false, "",
+ TemplateNames{
+ Name: "_default/single.amp.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.amp.html",
+ }},
+ {"JSON, no base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathJSON}, false, "",
+ TemplateNames{
+ Name: "_default/single.json",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.json",
+ }},
+ {"AMP with base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathAmp}, true, "single-baseof.html|single-baseof.amp.html",
+ TemplateNames{
+ Name: "_default/single.amp.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.amp.html",
+ MasterFilename: "/sites/mysite/layouts/_default/single-baseof.amp.html",
+ }},
+ {"AMP with no match in base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathAmp}, true, "single-baseof.html",
+ TemplateNames{
+ Name: "_default/single.amp.html",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.amp.html",
+ // There is a single-baseof.html, but that makes no sense.
+ MasterFilename: "",
+ }},
+
+ {"JSON with base", TemplateLookupDescriptor{TemplateDir: workingDir, WorkingDir: workingDir, LayoutDir: layoutBase1, RelPath: layoutPathJSON}, true, "single-baseof.json",
+ TemplateNames{
+ Name: "_default/single.json",
+ OverlayFilename: "/sites/mysite/layouts/_default/single.json",
+ MasterFilename: "/sites/mysite/layouts/_default/single-baseof.json",
+ }},
+ } {
+ t.Run(this.name, func(t *testing.T) {
+
+ this.basePathMatchStrings = filepath.FromSlash(this.basePathMatchStrings)
+
+ fileExists := func(filename string) (bool, error) {
+ stringsToMatch := strings.Split(this.basePathMatchStrings, "|")
+ for _, s := range stringsToMatch {
+ if strings.Contains(filename, s) {
+ return true, nil
+ }
+
+ }
+ return false, nil
+ }
+
+ needsBase := func(filename string, subslices [][]byte) (bool, error) {
+ return this.needsBase, nil
+ }
+
+ this.d.OutputFormats = Formats{AMPFormat, HTMLFormat, RSSFormat, JSONFormat}
+ this.d.WorkingDir = filepath.FromSlash(this.d.WorkingDir)
+ this.d.LayoutDir = filepath.FromSlash(this.d.LayoutDir)
+ this.d.RelPath = filepath.FromSlash(this.d.RelPath)
+ this.d.ContainsAny = needsBase
+ this.d.FileExists = fileExists
+
+ this.expect.MasterFilename = filepath.FromSlash(this.expect.MasterFilename)
+ this.expect.OverlayFilename = filepath.FromSlash(this.expect.OverlayFilename)
+
+ if strings.Contains(this.d.RelPath, "json") {
+ // currently the only plain text templates in this test.
+ this.expect.Name = "_text/" + this.expect.Name
+ }
+
+ id, err := CreateTemplateNames(this.d)
+
+ require.NoError(t, err)
+ require.Equal(t, this.expect, id, this.name)
+
+ })
+ }
+
+}