summaryrefslogtreecommitdiffstats
path: root/hugolib/alias_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/alias_test.go')
-rw-r--r--hugolib/alias_test.go156
1 files changed, 156 insertions, 0 deletions
diff --git a/hugolib/alias_test.go b/hugolib/alias_test.go
new file mode 100644
index 000000000..a1736e7e8
--- /dev/null
+++ b/hugolib/alias_test.go
@@ -0,0 +1,156 @@
+// Copyright 2019 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 (
+ "path/filepath"
+ "runtime"
+ "testing"
+
+ "github.com/gohugoio/hugo/common/loggers"
+
+ qt "github.com/frankban/quicktest"
+)
+
+const pageWithAlias = `---
+title: Has Alias
+aliases: ["/foo/bar/", "rel"]
+---
+For some moments the old man did not reply. He stood with bowed head, buried in deep thought. But at last he spoke.
+`
+
+const pageWithAliasMultipleOutputs = `---
+title: Has Alias for HTML and AMP
+aliases: ["/foo/bar/"]
+outputs: ["HTML", "AMP", "JSON"]
+---
+For some moments the old man did not reply. He stood with bowed head, buried in deep thought. But at last he spoke.
+`
+
+const basicTemplate = "<html><body>{{.Content}}</body></html>"
+const aliasTemplate = "<html><body>ALIASTEMPLATE</body></html>"
+
+func TestAlias(t *testing.T) {
+ t.Parallel()
+ c := qt.New(t)
+
+ tests := []struct {
+ fileSuffix string
+ urlPrefix string
+ urlSuffix string
+ settings map[string]interface{}
+ }{
+ {"/index.html", "http://example.com", "/", map[string]interface{}{"baseURL": "http://example.com"}},
+ {"/index.html", "http://example.com", "/", map[string]interface{}{"baseURL": "http://example.com", "canonifyURLs": true}},
+ {"/index.html", "../..", "/", map[string]interface{}{"relativeURLs": true}},
+ {".html", "", ".html", map[string]interface{}{"uglyURLs": true}},
+ }
+
+ for _, test := range tests {
+ b := newTestSitesBuilder(t)
+ b.WithSimpleConfigFileAndSettings(test.settings).WithContent("blog/page.md", pageWithAlias)
+ b.CreateSites().Build(BuildCfg{})
+
+ c.Assert(len(b.H.Sites), qt.Equals, 1)
+ c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 1)
+
+ // the real page
+ b.AssertFileContent("public/blog/page"+test.fileSuffix, "For some moments the old man")
+ // the alias redirectors
+ b.AssertFileContent("public/foo/bar"+test.fileSuffix, "<meta http-equiv=\"refresh\" content=\"0; url="+test.urlPrefix+"/blog/page"+test.urlSuffix+"\" />")
+ b.AssertFileContent("public/blog/rel"+test.fileSuffix, "<meta http-equiv=\"refresh\" content=\"0; url="+test.urlPrefix+"/blog/page"+test.urlSuffix+"\" />")
+ }
+}
+
+func TestAliasMultipleOutputFormats(t *testing.T) {
+ t.Parallel()
+
+ c := qt.New(t)
+
+ b := newTestSitesBuilder(t)
+ b.WithSimpleConfigFile().WithContent("blog/page.md", pageWithAliasMultipleOutputs)
+
+ b.WithTemplates(
+ "_default/single.html", basicTemplate,
+ "_default/single.amp.html", basicTemplate,
+ "_default/single.json", basicTemplate)
+
+ b.CreateSites().Build(BuildCfg{})
+
+ // the real pages
+ b.AssertFileContent("public/blog/page/index.html", "For some moments the old man")
+ b.AssertFileContent("public/amp/blog/page/index.html", "For some moments the old man")
+ b.AssertFileContent("public/blog/page/index.json", "For some moments the old man")
+
+ // the alias redirectors
+ b.AssertFileContent("public/foo/bar/index.html", "<meta http-equiv=\"refresh\" content=\"0; ")
+ b.AssertFileContent("public/amp/foo/bar/index.html", "<meta http-equiv=\"refresh\" content=\"0; ")
+ c.Assert(b.CheckExists("public/foo/bar/index.json"), qt.Equals, false)
+}
+
+func TestAliasTemplate(t *testing.T) {
+ t.Parallel()
+
+ b := newTestSitesBuilder(t)
+ b.WithSimpleConfigFile().WithContent("page.md", pageWithAlias).WithTemplatesAdded("alias.html", aliasTemplate)
+
+ b.CreateSites().Build(BuildCfg{})
+
+ // the real page
+ b.AssertFileContent("public/page/index.html", "For some moments the old man")
+ // the alias redirector
+ b.AssertFileContent("public/foo/bar/index.html", "ALIASTEMPLATE")
+}
+
+func TestTargetPathHTMLRedirectAlias(t *testing.T) {
+ h := newAliasHandler(nil, loggers.NewErrorLogger(), false)
+
+ errIsNilForThisOS := runtime.GOOS != "windows"
+
+ tests := []struct {
+ value string
+ expected string
+ errIsNil bool
+ }{
+ {"", "", false},
+ {"s", filepath.FromSlash("s/index.html"), true},
+ {"/", "", false},
+ {"alias 1", filepath.FromSlash("alias 1/index.html"), true},
+ {"alias 2/", filepath.FromSlash("alias 2/index.html"), true},
+ {"alias 3.html", "alias 3.html", true},
+ {"alias4.html", "alias4.html", true},
+ {"/alias 5.html", "alias 5.html", true},
+ {"/трям.html", "трям.html", true},
+ {"../../../../tmp/passwd", "", false},
+ {"/foo/../../../../tmp/passwd", filepath.FromSlash("tmp/passwd/index.html"), true},
+ {"foo/../../../../tmp/passwd", "", false},
+ {"C:\\Windows", filepath.FromSlash("C:\\Windows/index.html"), errIsNilForThisOS},
+ {"/trailing-space /", filepath.FromSlash("trailing-space /index.html"), errIsNilForThisOS},
+ {"/trailing-period./", filepath.FromSlash("trailing-period./index.html"), errIsNilForThisOS},
+ {"/tab\tseparated/", filepath.FromSlash("tab\tseparated/index.html"), errIsNilForThisOS},
+ {"/chrome/?p=help&ctx=keyboard#topic=3227046", filepath.FromSlash("chrome/?p=help&ctx=keyboard#topic=3227046/index.html"), errIsNilForThisOS},
+ {"/LPT1/Printer/", filepath.FromSlash("LPT1/Printer/index.html"), errIsNilForThisOS},
+ }
+
+ for _, test := range tests {
+ path, err := h.targetPathAlias(test.value)
+ if (err == nil) != test.errIsNil {
+ t.Errorf("Expected err == nil => %t, got: %t. err: %s", test.errIsNil, err == nil, err)
+ continue
+ }
+ if err == nil && path != test.expected {
+ t.Errorf("Expected: %q, got: %q", test.expected, path)
+ }
+ }
+}