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