github.com/olliephillips/hugo@v0.42.2/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  
    84  func TestMergeLanguagesTemplate(t *testing.T) {
    85  	t.Parallel()
    86  
    87  	b := newTestSiteForLanguageMerge(t, 15)
    88  	b.WithTemplates("home.html", `
    89  {{ $pages := .Site.RegularPages }}
    90  {{ .Scratch.Set "pages" $pages }}
    91  {{ if eq .Lang "nn" }}:
    92  {{ $enSite := index .Sites 0 }}
    93  {{ $frSite := index .Sites 1 }}
    94  {{ $nnBundle := .Site.GetPage "page" "bundle" }}
    95  {{ $enBundle := $enSite.GetPage "page" "bundle" }}
    96  {{ .Scratch.Set "pages" ($pages | lang.Merge $frSite.RegularPages| lang.Merge $enSite.RegularPages) }}
    97  {{ .Scratch.Set "pages2" (sort ($nnBundle.Resources | lang.Merge $enBundle.Resources) "Title") }}
    98  {{ end }}
    99  {{ $pages := .Scratch.Get "pages" }}
   100  {{ $pages2 := .Scratch.Get "pages2" }}
   101  Pages1: {{ range $i, $p := $pages }}{{ add $i 1 }}: {{ .Path }} {{ .Lang }} | {{ end }}
   102  Pages2: {{ range $i, $p := $pages2 }}{{ add $i 1 }}: {{ .Title }} {{ .Lang }} | {{ end }}
   103  
   104  `,
   105  		"shortcodes/shortcode.html", "MyShort",
   106  		"shortcodes/lingo.html", "MyLingo",
   107  	)
   108  
   109  	b.CreateSites()
   110  	b.Build(BuildCfg{})
   111  
   112  	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")
   113  	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")
   114  }
   115  
   116  func newTestSiteForLanguageMerge(t testing.TB, count int) *sitesBuilder {
   117  	contentTemplate := `---
   118  title: doc%d
   119  weight: %d
   120  date: "2018-02-28"
   121  ---
   122  # doc
   123  *some "content"*
   124  
   125  {{< shortcode >}}
   126  
   127  {{< lingo >}}
   128  `
   129  
   130  	builder := newTestSitesBuilder(t).WithDefaultMultiSiteConfig()
   131  
   132  	// We need some content with some missing translations.
   133  	// "en" is the main language, so add some English content + some Norwegian (nn, nynorsk) content.
   134  	var contentPairs []string
   135  	for i := 1; i <= count; i++ {
   136  		content := fmt.Sprintf(contentTemplate, i, i)
   137  		contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.md", i), content}...)
   138  		if i == 2 || i%3 == 0 {
   139  			// Add page 2,3, 6, 9 ... to both languages
   140  			contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.nn.md", i), content}...)
   141  		}
   142  		if i%5 == 0 {
   143  			// Add some French content, too.
   144  			contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.fr.md", i), content}...)
   145  		}
   146  	}
   147  
   148  	// See https://github.com/gohugoio/hugo/issues/4644
   149  	// Add a bundles
   150  	j := 100
   151  	contentPairs = append(contentPairs, []string{"bundle/index.md", fmt.Sprintf(contentTemplate, j, j)}...)
   152  	for i := 0; i < 6; i++ {
   153  		contentPairs = append(contentPairs, []string{fmt.Sprintf("bundle/pb%d.md", i), fmt.Sprintf(contentTemplate, i+j, i+j)}...)
   154  	}
   155  	contentPairs = append(contentPairs, []string{"bundle/index.nn.md", fmt.Sprintf(contentTemplate, j, j)}...)
   156  	for i := 1; i < 3; i++ {
   157  		contentPairs = append(contentPairs, []string{fmt.Sprintf("bundle/pb%d.nn.md", i), fmt.Sprintf(contentTemplate, i+j, i+j)}...)
   158  	}
   159  
   160  	builder.WithContent(contentPairs...)
   161  	return builder
   162  }
   163  
   164  func BenchmarkMergeByLanguage(b *testing.B) {
   165  	const count = 100
   166  
   167  	builder := newTestSiteForLanguageMerge(b, count)
   168  	builder.CreateSites()
   169  	builder.Build(BuildCfg{SkipRender: true})
   170  	h := builder.H
   171  
   172  	enSite := h.Sites[0]
   173  	nnSite := h.Sites[2]
   174  
   175  	for i := 0; i < b.N; i++ {
   176  		merged := nnSite.RegularPages.MergeByLanguage(enSite.RegularPages)
   177  		if len(merged) != count {
   178  			b.Fatal("Count mismatch")
   179  		}
   180  	}
   181  }