pages_language_merge_test.go (6335B)
1 // Copyright 2019 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 hugolib 15 16 import ( 17 "fmt" 18 "testing" 19 20 qt "github.com/frankban/quicktest" 21 "github.com/gohugoio/hugo/resources/resource" 22 ) 23 24 // TODO(bep) move and rewrite in resource/page. 25 26 func TestMergeLanguages(t *testing.T) { 27 t.Parallel() 28 c := qt.New(t) 29 30 b := newTestSiteForLanguageMerge(t, 30) 31 b.CreateSites() 32 33 b.Build(BuildCfg{SkipRender: true}) 34 35 h := b.H 36 37 enSite := h.Sites[0] 38 frSite := h.Sites[1] 39 nnSite := h.Sites[2] 40 41 c.Assert(len(enSite.RegularPages()), qt.Equals, 31) 42 c.Assert(len(frSite.RegularPages()), qt.Equals, 6) 43 c.Assert(len(nnSite.RegularPages()), qt.Equals, 12) 44 45 for i := 0; i < 2; i++ { 46 mergedNN := nnSite.RegularPages().MergeByLanguage(enSite.RegularPages()) 47 c.Assert(len(mergedNN), qt.Equals, 31) 48 for i := 1; i <= 31; i++ { 49 expectedLang := "en" 50 if i == 2 || i%3 == 0 || i == 31 { 51 expectedLang = "nn" 52 } 53 p := mergedNN[i-1] 54 c.Assert(p.Language().Lang, qt.Equals, expectedLang) 55 } 56 } 57 58 mergedFR := frSite.RegularPages().MergeByLanguage(enSite.RegularPages()) 59 c.Assert(len(mergedFR), qt.Equals, 31) 60 for i := 1; i <= 31; i++ { 61 expectedLang := "en" 62 if i%5 == 0 { 63 expectedLang = "fr" 64 } 65 p := mergedFR[i-1] 66 c.Assert(p.Language().Lang, qt.Equals, expectedLang) 67 } 68 69 firstNN := nnSite.RegularPages()[0] 70 c.Assert(len(firstNN.Sites()), qt.Equals, 4) 71 c.Assert(firstNN.Sites().First().Language().Lang, qt.Equals, "en") 72 73 nnBundle := nnSite.getPage("page", "bundle") 74 enBundle := enSite.getPage("page", "bundle") 75 76 c.Assert(len(enBundle.Resources()), qt.Equals, 6) 77 c.Assert(len(nnBundle.Resources()), qt.Equals, 2) 78 79 var ri any = nnBundle.Resources() 80 81 // This looks less ugly in the templates ... 82 mergedNNResources := ri.(resource.ResourcesLanguageMerger).MergeByLanguage(enBundle.Resources()) 83 c.Assert(len(mergedNNResources), qt.Equals, 6) 84 85 unchanged, err := nnSite.RegularPages().MergeByLanguageInterface(nil) 86 c.Assert(err, qt.IsNil) 87 c.Assert(unchanged, deepEqualsPages, nnSite.RegularPages()) 88 } 89 90 func TestMergeLanguagesTemplate(t *testing.T) { 91 t.Parallel() 92 93 b := newTestSiteForLanguageMerge(t, 15) 94 b.WithTemplates("home.html", ` 95 {{ $pages := .Site.RegularPages }} 96 {{ .Scratch.Set "pages" $pages }} 97 {{ $enSite := index .Sites 0 }} 98 {{ $frSite := index .Sites 1 }} 99 {{ if eq .Language.Lang "nn" }}: 100 {{ $nnBundle := .Site.GetPage "page" "bundle" }} 101 {{ $enBundle := $enSite.GetPage "page" "bundle" }} 102 {{ .Scratch.Set "pages" ($pages | lang.Merge $frSite.RegularPages| lang.Merge $enSite.RegularPages) }} 103 {{ .Scratch.Set "pages2" (sort ($nnBundle.Resources | lang.Merge $enBundle.Resources) "Title") }} 104 {{ end }} 105 {{ $pages := .Scratch.Get "pages" }} 106 {{ $pages2 := .Scratch.Get "pages2" }} 107 Pages1: {{ range $i, $p := $pages }}{{ add $i 1 }}: {{ .File.Path }} {{ .Language.Lang }} | {{ end }} 108 Pages2: {{ range $i, $p := $pages2 }}{{ add $i 1 }}: {{ .Title }} {{ .Language.Lang }} | {{ end }} 109 {{ $nil := resources.Get "asdfasdfasdf" }} 110 Pages3: {{ $frSite.RegularPages | lang.Merge $nil }} 111 Pages4: {{ $nil | lang.Merge $frSite.RegularPages }} 112 113 114 `, 115 "shortcodes/shortcode.html", "MyShort", 116 "shortcodes/lingo.html", "MyLingo", 117 ) 118 119 b.CreateSites() 120 b.Build(BuildCfg{}) 121 122 b.AssertFileContent("public/nn/index.html", "Pages1: 1: p1.md en | 2: p2.nn.md nn | 3: p3.nn.md nn | 4: p4.md en | 5: p5.fr.md fr | 6: p6.nn.md nn | 7: p7.md en | 8: p8.md en | 9: p9.nn.md nn | 10: p10.fr.md fr | 11: p11.md en | 12: p12.nn.md nn | 13: p13.md en | 14: p14.md en | 15: p15.nn.md nn") 123 b.AssertFileContent("public/nn/index.html", "Pages2: 1: doc100 en | 2: doc101 nn | 3: doc102 nn | 4: doc103 en | 5: doc104 en | 6: doc105 en") 124 b.AssertFileContent("public/nn/index.html", ` 125 Pages3: Pages(3) 126 Pages4: Pages(3) 127 `) 128 } 129 130 func newTestSiteForLanguageMerge(t testing.TB, count int) *sitesBuilder { 131 contentTemplate := `--- 132 title: doc%d 133 weight: %d 134 date: "2018-02-28" 135 --- 136 # doc 137 *some "content"* 138 139 {{< shortcode >}} 140 141 {{< lingo >}} 142 ` 143 144 builder := newTestSitesBuilder(t).WithDefaultMultiSiteConfig() 145 146 // We need some content with some missing translations. 147 // "en" is the main language, so add some English content + some Norwegian (nn, nynorsk) content. 148 var contentPairs []string 149 for i := 1; i <= count; i++ { 150 content := fmt.Sprintf(contentTemplate, i, i) 151 contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.md", i), content}...) 152 if i == 2 || i%3 == 0 { 153 // Add page 2,3, 6, 9 ... to both languages 154 contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.nn.md", i), content}...) 155 } 156 if i%5 == 0 { 157 // Add some French content, too. 158 contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.fr.md", i), content}...) 159 } 160 } 161 162 // See https://github.com/gohugoio/hugo/issues/4644 163 // Add a bundles 164 j := 100 165 contentPairs = append(contentPairs, []string{"bundle/index.md", fmt.Sprintf(contentTemplate, j, j)}...) 166 for i := 0; i < 6; i++ { 167 contentPairs = append(contentPairs, []string{fmt.Sprintf("bundle/pb%d.md", i), fmt.Sprintf(contentTemplate, i+j, i+j)}...) 168 } 169 contentPairs = append(contentPairs, []string{"bundle/index.nn.md", fmt.Sprintf(contentTemplate, j, j)}...) 170 for i := 1; i < 3; i++ { 171 contentPairs = append(contentPairs, []string{fmt.Sprintf("bundle/pb%d.nn.md", i), fmt.Sprintf(contentTemplate, i+j, i+j)}...) 172 } 173 174 builder.WithContent(contentPairs...) 175 return builder 176 } 177 178 func BenchmarkMergeByLanguage(b *testing.B) { 179 const count = 100 180 181 // newTestSiteForLanguageMerge creates count+1 pages. 182 builder := newTestSiteForLanguageMerge(b, count-1) 183 builder.CreateSites() 184 builder.Build(BuildCfg{SkipRender: true}) 185 h := builder.H 186 187 enSite := h.Sites[0] 188 nnSite := h.Sites[2] 189 190 for i := 0; i < b.N; i++ { 191 merged := nnSite.RegularPages().MergeByLanguage(enSite.RegularPages()) 192 if len(merged) != count { 193 b.Fatal("Count mismatch") 194 } 195 } 196 }