github.com/olliephillips/hugo@v0.42.2/helpers/url_test.go (about)

     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  	"fmt"
    18  	"strings"
    19  	"testing"
    20  
    21  	"github.com/gohugoio/hugo/hugofs"
    22  	"github.com/gohugoio/hugo/langs"
    23  	"github.com/stretchr/testify/assert"
    24  	"github.com/stretchr/testify/require"
    25  )
    26  
    27  func TestURLize(t *testing.T) {
    28  
    29  	v := newTestCfg()
    30  	l := langs.NewDefaultLanguage(v)
    31  	p, _ := NewPathSpec(hugofs.NewMem(v), l)
    32  
    33  	tests := []struct {
    34  		input    string
    35  		expected string
    36  	}{
    37  		{"  foo bar  ", "foo-bar"},
    38  		{"foo.bar/foo_bar-foo", "foo.bar/foo_bar-foo"},
    39  		{"foo,bar:foobar", "foobarfoobar"},
    40  		{"foo/bar.html", "foo/bar.html"},
    41  		{"трям/трям", "%D1%82%D1%80%D1%8F%D0%BC/%D1%82%D1%80%D1%8F%D0%BC"},
    42  		{"100%-google", "100-google"},
    43  	}
    44  
    45  	for _, test := range tests {
    46  		output := p.URLize(test.input)
    47  		if output != test.expected {
    48  			t.Errorf("Expected %#v, got %#v\n", test.expected, output)
    49  		}
    50  	}
    51  }
    52  
    53  func TestAbsURL(t *testing.T) {
    54  	for _, defaultInSubDir := range []bool{true, false} {
    55  		for _, addLanguage := range []bool{true, false} {
    56  			for _, m := range []bool{true, false} {
    57  				for _, l := range []string{"en", "fr"} {
    58  					doTestAbsURL(t, defaultInSubDir, addLanguage, m, l)
    59  				}
    60  			}
    61  		}
    62  	}
    63  }
    64  
    65  func doTestAbsURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool, lang string) {
    66  	v := newTestCfg()
    67  	v.Set("multilingual", multilingual)
    68  	v.Set("defaultContentLanguage", "en")
    69  	v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
    70  
    71  	tests := []struct {
    72  		input    string
    73  		baseURL  string
    74  		expected string
    75  	}{
    76  		{"/test/foo", "http://base/", "http://base/MULTItest/foo"},
    77  		{"/" + lang + "/test/foo", "http://base/", "http://base/" + lang + "/test/foo"},
    78  		{"", "http://base/ace/", "http://base/ace/MULTI"},
    79  		{"/test/2/foo/", "http://base", "http://base/MULTItest/2/foo/"},
    80  		{"http://abs", "http://base/", "http://abs"},
    81  		{"schema://abs", "http://base/", "schema://abs"},
    82  		{"//schemaless", "http://base/", "//schemaless"},
    83  		{"test/2/foo/", "http://base/path", "http://base/path/MULTItest/2/foo/"},
    84  		{lang + "/test/2/foo/", "http://base/path", "http://base/path/" + lang + "/test/2/foo/"},
    85  		{"/test/2/foo/", "http://base/path", "http://base/MULTItest/2/foo/"},
    86  		{"http//foo", "http://base/path", "http://base/path/MULTIhttp/foo"},
    87  	}
    88  
    89  	for _, test := range tests {
    90  		v.Set("baseURL", test.baseURL)
    91  		v.Set("contentDir", "content")
    92  		l := langs.NewLanguage(lang, v)
    93  		p, _ := NewPathSpec(hugofs.NewMem(v), l)
    94  
    95  		output := p.AbsURL(test.input, addLanguage)
    96  		expected := test.expected
    97  		if multilingual && addLanguage {
    98  			if !defaultInSubDir && lang == "en" {
    99  				expected = strings.Replace(expected, "MULTI", "", 1)
   100  			} else {
   101  				expected = strings.Replace(expected, "MULTI", lang+"/", 1)
   102  			}
   103  
   104  		} else {
   105  			expected = strings.Replace(expected, "MULTI", "", 1)
   106  		}
   107  		if output != expected {
   108  			t.Fatalf("Expected %#v, got %#v\n", expected, output)
   109  		}
   110  	}
   111  }
   112  
   113  func TestIsAbsURL(t *testing.T) {
   114  	for i, this := range []struct {
   115  		a string
   116  		b bool
   117  	}{
   118  		{"http://gohugo.io", true},
   119  		{"https://gohugo.io", true},
   120  		{"//gohugo.io", true},
   121  		{"http//gohugo.io", false},
   122  		{"/content", false},
   123  		{"content", false},
   124  	} {
   125  		require.True(t, IsAbsURL(this.a) == this.b, fmt.Sprintf("Test %d", i))
   126  	}
   127  }
   128  
   129  func TestRelURL(t *testing.T) {
   130  	for _, defaultInSubDir := range []bool{true, false} {
   131  		for _, addLanguage := range []bool{true, false} {
   132  			for _, m := range []bool{true, false} {
   133  				for _, l := range []string{"en", "fr"} {
   134  					doTestRelURL(t, defaultInSubDir, addLanguage, m, l)
   135  				}
   136  			}
   137  		}
   138  	}
   139  }
   140  
   141  func doTestRelURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool, lang string) {
   142  	v := newTestCfg()
   143  	v.Set("multilingual", multilingual)
   144  	v.Set("defaultContentLanguage", "en")
   145  	v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
   146  
   147  	tests := []struct {
   148  		input    string
   149  		baseURL  string
   150  		canonify bool
   151  		expected string
   152  	}{
   153  		{"/test/foo", "http://base/", false, "MULTI/test/foo"},
   154  		{"/" + lang + "/test/foo", "http://base/", false, "/" + lang + "/test/foo"},
   155  		{lang + "/test/foo", "http://base/", false, "/" + lang + "/test/foo"},
   156  		{"test.css", "http://base/sub", false, "/subMULTI/test.css"},
   157  		{"test.css", "http://base/sub", true, "MULTI/test.css"},
   158  		{"/test/", "http://base/", false, "MULTI/test/"},
   159  		{"/test/", "http://base/sub/", false, "/subMULTI/test/"},
   160  		{"/test/", "http://base/sub/", true, "MULTI/test/"},
   161  		{"", "http://base/ace/", false, "/aceMULTI/"},
   162  		{"", "http://base/ace", false, "/aceMULTI"},
   163  		{"http://abs", "http://base/", false, "http://abs"},
   164  		{"//schemaless", "http://base/", false, "//schemaless"},
   165  	}
   166  
   167  	for i, test := range tests {
   168  		v.Set("baseURL", test.baseURL)
   169  		v.Set("canonifyURLs", test.canonify)
   170  		l := langs.NewLanguage(lang, v)
   171  		p, _ := NewPathSpec(hugofs.NewMem(v), l)
   172  
   173  		output := p.RelURL(test.input, addLanguage)
   174  
   175  		expected := test.expected
   176  		if multilingual && addLanguage {
   177  			if !defaultInSubDir && lang == "en" {
   178  				expected = strings.Replace(expected, "MULTI", "", 1)
   179  			} else {
   180  				expected = strings.Replace(expected, "MULTI", "/"+lang, 1)
   181  			}
   182  		} else {
   183  			expected = strings.Replace(expected, "MULTI", "", 1)
   184  		}
   185  
   186  		if output != expected {
   187  			t.Errorf("[%d][%t] Expected %#v, got %#v\n", i, test.canonify, expected, output)
   188  		}
   189  	}
   190  }
   191  
   192  func TestSanitizeURL(t *testing.T) {
   193  	tests := []struct {
   194  		input    string
   195  		expected string
   196  	}{
   197  		{"http://foo.bar/", "http://foo.bar"},
   198  		{"http://foo.bar", "http://foo.bar"},          // issue #1105
   199  		{"http://foo.bar/zoo/", "http://foo.bar/zoo"}, // issue #931
   200  	}
   201  
   202  	for i, test := range tests {
   203  		o1 := SanitizeURL(test.input)
   204  		o2 := SanitizeURLKeepTrailingSlash(test.input)
   205  
   206  		expected2 := test.expected
   207  
   208  		if strings.HasSuffix(test.input, "/") && !strings.HasSuffix(expected2, "/") {
   209  			expected2 += "/"
   210  		}
   211  
   212  		if o1 != test.expected {
   213  			t.Errorf("[%d] 1: Expected %#v, got %#v\n", i, test.expected, o1)
   214  		}
   215  		if o2 != expected2 {
   216  			t.Errorf("[%d] 2: Expected %#v, got %#v\n", i, expected2, o2)
   217  		}
   218  	}
   219  }
   220  
   221  func TestMakePermalink(t *testing.T) {
   222  	type test struct {
   223  		host, link, output string
   224  	}
   225  
   226  	data := []test{
   227  		{"http://abc.com/foo", "post/bar", "http://abc.com/foo/post/bar"},
   228  		{"http://abc.com/foo/", "post/bar", "http://abc.com/foo/post/bar"},
   229  		{"http://abc.com", "post/bar", "http://abc.com/post/bar"},
   230  		{"http://abc.com", "bar", "http://abc.com/bar"},
   231  		{"http://abc.com/foo/bar", "post/bar", "http://abc.com/foo/bar/post/bar"},
   232  		{"http://abc.com/foo/bar", "post/bar/", "http://abc.com/foo/bar/post/bar/"},
   233  	}
   234  
   235  	for i, d := range data {
   236  		output := MakePermalink(d.host, d.link).String()
   237  		if d.output != output {
   238  			t.Errorf("Test #%d failed. Expected %q got %q", i, d.output, output)
   239  		}
   240  	}
   241  }
   242  
   243  func TestURLPrep(t *testing.T) {
   244  	type test struct {
   245  		ugly   bool
   246  		input  string
   247  		output string
   248  	}
   249  
   250  	data := []test{
   251  		{false, "/section/name.html", "/section/name/"},
   252  		{true, "/section/name/index.html", "/section/name.html"},
   253  	}
   254  
   255  	for i, d := range data {
   256  		v := newTestCfg()
   257  		v.Set("uglyURLs", d.ugly)
   258  		l := langs.NewDefaultLanguage(v)
   259  		p, _ := NewPathSpec(hugofs.NewMem(v), l)
   260  
   261  		output := p.URLPrep(d.input)
   262  		if d.output != output {
   263  			t.Errorf("Test #%d failed. Expected %q got %q", i, d.output, output)
   264  		}
   265  	}
   266  
   267  }
   268  
   269  func TestAddContextRoot(t *testing.T) {
   270  	tests := []struct {
   271  		baseURL  string
   272  		url      string
   273  		expected string
   274  	}{
   275  		{"http://example.com/sub/", "/foo", "/sub/foo"},
   276  		{"http://example.com/sub/", "/foo/index.html", "/sub/foo/index.html"},
   277  		{"http://example.com/sub1/sub2", "/foo", "/sub1/sub2/foo"},
   278  		{"http://example.com", "/foo", "/foo"},
   279  		// cannot guess that the context root is already added int the example below
   280  		{"http://example.com/sub/", "/sub/foo", "/sub/sub/foo"},
   281  		{"http://example.com/тря", "/трям/", "/тря/трям/"},
   282  		{"http://example.com", "/", "/"},
   283  		{"http://example.com/bar", "//", "/bar/"},
   284  	}
   285  
   286  	for _, test := range tests {
   287  		output := AddContextRoot(test.baseURL, test.url)
   288  		if output != test.expected {
   289  			t.Errorf("Expected %#v, got %#v\n", test.expected, output)
   290  		}
   291  	}
   292  }
   293  
   294  func TestPretty(t *testing.T) {
   295  	assert.Equal(t, PrettifyURLPath("/section/name.html"), "/section/name/index.html")
   296  	assert.Equal(t, PrettifyURLPath("/section/sub/name.html"), "/section/sub/name/index.html")
   297  	assert.Equal(t, PrettifyURLPath("/section/name/"), "/section/name/index.html")
   298  	assert.Equal(t, PrettifyURLPath("/section/name/index.html"), "/section/name/index.html")
   299  	assert.Equal(t, PrettifyURLPath("/index.html"), "/index.html")
   300  	assert.Equal(t, PrettifyURLPath("/name.xml"), "/name/index.xml")
   301  	assert.Equal(t, PrettifyURLPath("/"), "/")
   302  	assert.Equal(t, PrettifyURLPath(""), "/")
   303  	assert.Equal(t, PrettifyURL("/section/name.html"), "/section/name")
   304  	assert.Equal(t, PrettifyURL("/section/sub/name.html"), "/section/sub/name")
   305  	assert.Equal(t, PrettifyURL("/section/name/"), "/section/name")
   306  	assert.Equal(t, PrettifyURL("/section/name/index.html"), "/section/name")
   307  	assert.Equal(t, PrettifyURL("/index.html"), "/")
   308  	assert.Equal(t, PrettifyURL("/name.xml"), "/name/index.xml")
   309  	assert.Equal(t, PrettifyURL("/"), "/")
   310  	assert.Equal(t, PrettifyURL(""), "/")
   311  }
   312  
   313  func TestUgly(t *testing.T) {
   314  	assert.Equal(t, Uglify("/section/name.html"), "/section/name.html")
   315  	assert.Equal(t, Uglify("/section/sub/name.html"), "/section/sub/name.html")
   316  	assert.Equal(t, Uglify("/section/name/"), "/section/name.html")
   317  	assert.Equal(t, Uglify("/section/name/index.html"), "/section/name.html")
   318  	assert.Equal(t, Uglify("/index.html"), "/index.html")
   319  	assert.Equal(t, Uglify("/name.xml"), "/name.xml")
   320  	assert.Equal(t, Uglify("/"), "/")
   321  	assert.Equal(t, Uglify(""), "/")
   322  }