URI: 
       pages_language_merge_test.go - hugo - [fork] hugo port for 9front
  HTML git clone https://git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
       pages_language_merge_test.go (6340B)
       ---
            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 range 2 {
           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().Default().Language().Lang, qt.Equals, "en")
           72 
           73         nnBundle := nnSite.getPageOldVersion("page", "bundle")
           74         enBundle := enSite.getPageOldVersion("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 := range 6 {
          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 }