hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

url_test.go (7671B)

    1 // Copyright 2015 The Hugo Authors. All rights reserved.
    2 //
    3 // Licensed under the Apache License, Version 2.0 (the "License");
    4 // you may not use this file except in compliance with the License.
    5 // You may obtain a copy of the License at
    6 // http://www.apache.org/licenses/LICENSE-2.0
    7 //
    8 // Unless required by applicable law or agreed to in writing, software
    9 // distributed under the License is distributed on an "AS IS" BASIS,
   10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   11 // See the License for the specific language governing permissions and
   12 // limitations under the License.
   13 
   14 package helpers
   15 
   16 import (
   17 	"strings"
   18 	"testing"
   19 
   20 	qt "github.com/frankban/quicktest"
   21 	"github.com/gohugoio/hugo/hugofs"
   22 	"github.com/gohugoio/hugo/langs"
   23 )
   24 
   25 func TestURLize(t *testing.T) {
   26 	v := newTestCfg()
   27 	l := langs.NewDefaultLanguage(v)
   28 	p, _ := NewPathSpec(hugofs.NewMem(v), l, nil)
   29 
   30 	tests := []struct {
   31 		input    string
   32 		expected string
   33 	}{
   34 		{"  foo bar  ", "foo-bar"},
   35 		{"foo.bar/foo_bar-foo", "foo.bar/foo_bar-foo"},
   36 		{"foo,bar:foobar", "foobarfoobar"},
   37 		{"foo/bar.html", "foo/bar.html"},
   38 		{"трям/трям", "%D1%82%D1%80%D1%8F%D0%BC/%D1%82%D1%80%D1%8F%D0%BC"},
   39 		{"100%-google", "100-google"},
   40 	}
   41 
   42 	for _, test := range tests {
   43 		output := p.URLize(test.input)
   44 		if output != test.expected {
   45 			t.Errorf("Expected %#v, got %#v\n", test.expected, output)
   46 		}
   47 	}
   48 }
   49 
   50 func TestAbsURL(t *testing.T) {
   51 	for _, defaultInSubDir := range []bool{true, false} {
   52 		for _, addLanguage := range []bool{true, false} {
   53 			for _, m := range []bool{true, false} {
   54 				for _, l := range []string{"en", "fr"} {
   55 					doTestAbsURL(t, defaultInSubDir, addLanguage, m, l)
   56 				}
   57 			}
   58 		}
   59 	}
   60 }
   61 
   62 func doTestAbsURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool, lang string) {
   63 	c := qt.New(t)
   64 	v := newTestCfg()
   65 	v.Set("multilingual", multilingual)
   66 	v.Set("defaultContentLanguage", "en")
   67 	v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
   68 
   69 	tests := []struct {
   70 		input    string
   71 		baseURL  string
   72 		expected string
   73 	}{
   74 		// Issue 9994
   75 		{"foo/bar", "https://example.org/foo/", "https://example.org/foo/MULTIfoo/bar"},
   76 		{"/foo/bar", "https://example.org/foo/", "https://example.org/MULTIfoo/bar"},
   77 
   78 		{"/test/foo", "http://base/", "http://base/MULTItest/foo"},
   79 		{"/" + lang + "/test/foo", "http://base/", "http://base/" + lang + "/test/foo"},
   80 		{"", "http://base/ace/", "http://base/ace/MULTI"},
   81 		{"/test/2/foo/", "http://base", "http://base/MULTItest/2/foo/"},
   82 		{"http://abs", "http://base/", "http://abs"},
   83 		{"schema://abs", "http://base/", "schema://abs"},
   84 		{"//schemaless", "http://base/", "//schemaless"},
   85 		{"test/2/foo/", "http://base/path", "http://base/path/MULTItest/2/foo/"},
   86 		{lang + "/test/2/foo/", "http://base/path", "http://base/path/" + lang + "/test/2/foo/"},
   87 		{"/test/2/foo/", "http://base/path", "http://base/MULTItest/2/foo/"},
   88 		{"http//foo", "http://base/path", "http://base/path/MULTIhttp/foo"},
   89 	}
   90 
   91 	if multilingual && addLanguage && defaultInSubDir {
   92 		newTests := []struct {
   93 			input    string
   94 			baseURL  string
   95 			expected string
   96 		}{
   97 			{lang + "test", "http://base/", "http://base/" + lang + "/" + lang + "test"},
   98 			{"/" + lang + "test", "http://base/", "http://base/" + lang + "/" + lang + "test"},
   99 		}
  100 
  101 		tests = append(tests, newTests...)
  102 
  103 	}
  104 
  105 	for _, test := range tests {
  106 		v.Set("baseURL", test.baseURL)
  107 		v.Set("contentDir", "content")
  108 		l := langs.NewLanguage(lang, v)
  109 		p, _ := NewPathSpec(hugofs.NewMem(v), l, nil)
  110 
  111 		output := p.AbsURL(test.input, addLanguage)
  112 		expected := test.expected
  113 		if multilingual && addLanguage {
  114 			if !defaultInSubDir && lang == "en" {
  115 				expected = strings.Replace(expected, "MULTI", "", 1)
  116 			} else {
  117 				expected = strings.Replace(expected, "MULTI", lang+"/", 1)
  118 			}
  119 		} else {
  120 			expected = strings.Replace(expected, "MULTI", "", 1)
  121 		}
  122 
  123 		c.Assert(output, qt.Equals, expected)
  124 	}
  125 }
  126 
  127 func TestRelURL(t *testing.T) {
  128 	for _, defaultInSubDir := range []bool{true, false} {
  129 		for _, addLanguage := range []bool{true, false} {
  130 			for _, m := range []bool{true, false} {
  131 				for _, l := range []string{"en", "fr"} {
  132 					doTestRelURL(t, defaultInSubDir, addLanguage, m, l)
  133 				}
  134 			}
  135 		}
  136 	}
  137 }
  138 
  139 func doTestRelURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool, lang string) {
  140 	c := qt.New(t)
  141 	v := newTestCfg()
  142 	v.Set("multilingual", multilingual)
  143 	v.Set("defaultContentLanguage", "en")
  144 	v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
  145 
  146 	tests := []struct {
  147 		input    string
  148 		baseURL  string
  149 		canonify bool
  150 		expected string
  151 	}{
  152 
  153 		// Issue 9994
  154 		{"/foo/bar", "https://example.org/foo/", false, "MULTI/foo/bar"},
  155 		{"foo/bar", "https://example.org/foo/", false, "/fooMULTI/foo/bar"},
  156 
  157 		{"/test/foo", "http://base/", false, "MULTI/test/foo"},
  158 		{"/" + lang + "/test/foo", "http://base/", false, "/" + lang + "/test/foo"},
  159 		{lang + "/test/foo", "http://base/", false, "/" + lang + "/test/foo"},
  160 		{"test.css", "http://base/sub", false, "/subMULTI/test.css"},
  161 		{"test.css", "http://base/sub", true, "MULTI/test.css"},
  162 		{"/test/", "http://base/", false, "MULTI/test/"},
  163 		{"test/", "http://base/sub/", false, "/subMULTI/test/"},
  164 		{"/test/", "http://base/sub/", true, "MULTI/test/"},
  165 		{"", "http://base/ace/", false, "/aceMULTI/"},
  166 		{"", "http://base/ace", false, "/aceMULTI"},
  167 		{"http://abs", "http://base/", false, "http://abs"},
  168 		{"//schemaless", "http://base/", false, "//schemaless"},
  169 	}
  170 
  171 	if multilingual && addLanguage && defaultInSubDir {
  172 		newTests := []struct {
  173 			input    string
  174 			baseURL  string
  175 			canonify bool
  176 			expected string
  177 		}{
  178 			{lang + "test", "http://base/", false, "/" + lang + "/" + lang + "test"},
  179 			{"/" + lang + "test", "http://base/", false, "/" + lang + "/" + lang + "test"},
  180 		}
  181 		tests = append(tests, newTests...)
  182 	}
  183 
  184 	for i, test := range tests {
  185 		v.Set("baseURL", test.baseURL)
  186 		v.Set("canonifyURLs", test.canonify)
  187 		l := langs.NewLanguage(lang, v)
  188 		p, _ := NewPathSpec(hugofs.NewMem(v), l, nil)
  189 
  190 		output := p.RelURL(test.input, addLanguage)
  191 
  192 		expected := test.expected
  193 		if multilingual && addLanguage {
  194 			if !defaultInSubDir && lang == "en" {
  195 				expected = strings.Replace(expected, "MULTI", "", 1)
  196 			} else {
  197 				expected = strings.Replace(expected, "MULTI", "/"+lang, 1)
  198 			}
  199 		} else {
  200 			expected = strings.Replace(expected, "MULTI", "", 1)
  201 		}
  202 
  203 		c.Assert(output, qt.Equals, expected, qt.Commentf("[%d] %s", i, test.input))
  204 
  205 	}
  206 }
  207 
  208 func TestSanitizeURL(t *testing.T) {
  209 	tests := []struct {
  210 		input    string
  211 		expected string
  212 	}{
  213 		{"http://foo.bar/", "http://foo.bar"},
  214 		{"http://foo.bar", "http://foo.bar"},          // issue #1105
  215 		{"http://foo.bar/zoo/", "http://foo.bar/zoo"}, // issue #931
  216 	}
  217 
  218 	for i, test := range tests {
  219 		o1 := SanitizeURL(test.input)
  220 		o2 := SanitizeURLKeepTrailingSlash(test.input)
  221 
  222 		expected2 := test.expected
  223 
  224 		if strings.HasSuffix(test.input, "/") && !strings.HasSuffix(expected2, "/") {
  225 			expected2 += "/"
  226 		}
  227 
  228 		if o1 != test.expected {
  229 			t.Errorf("[%d] 1: Expected %#v, got %#v\n", i, test.expected, o1)
  230 		}
  231 		if o2 != expected2 {
  232 			t.Errorf("[%d] 2: Expected %#v, got %#v\n", i, expected2, o2)
  233 		}
  234 	}
  235 }
  236 
  237 func TestURLPrep(t *testing.T) {
  238 	type test struct {
  239 		ugly   bool
  240 		input  string
  241 		output string
  242 	}
  243 
  244 	data := []test{
  245 		{false, "/section/name.html", "/section/name/"},
  246 		{true, "/section/name/index.html", "/section/name.html"},
  247 	}
  248 
  249 	for i, d := range data {
  250 		v := newTestCfg()
  251 		v.Set("uglyURLs", d.ugly)
  252 		l := langs.NewDefaultLanguage(v)
  253 		p, _ := NewPathSpec(hugofs.NewMem(v), l, nil)
  254 
  255 		output := p.URLPrep(d.input)
  256 		if d.output != output {
  257 			t.Errorf("Test #%d failed. Expected %q got %q", i, d.output, output)
  258 		}
  259 	}
  260 }