github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/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  	"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  }