github.com/neohugo/neohugo@v0.123.8/hugolib/pages_language_merge_test.go (about)

     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/neohugo/neohugo/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.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/neohugo/neohugo/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  }