func createMultiTestSitesForConfig(t *testing.T, siteConfig testSiteConfig, configTemplate, configSuffix string) *HugoSites { configContent := createConfig(t, siteConfig, configTemplate) // Add some layouts if err := afero.WriteFile(hugofs.Source(), filepath.Join("layouts", "_default/single.html"), []byte("Single: {{ .Title }}|{{ i18n \"hello\" }}|{{.Lang}}|{{ .Content }}"), 0755); err != nil { t.Fatalf("Failed to write layout file: %s", err) } if err := afero.WriteFile(hugofs.Source(), filepath.Join("layouts", "_default/list.html"), []byte("{{ $p := .Paginator }}List Page {{ $p.PageNumber }}: {{ .Title }}|{{ i18n \"hello\" }}|{{ .Permalink }}"), 0755); err != nil { t.Fatalf("Failed to write layout file: %s", err) } if err := afero.WriteFile(hugofs.Source(), filepath.Join("layouts", "index.html"), []byte("{{ $p := .Paginator }}Home Page {{ $p.PageNumber }}: {{ .Title }}|{{ .IsHome }}|{{ i18n \"hello\" }}|{{ .Permalink }}|{{ .Site.Data.hugo.slogan }}"), 0755); err != nil { t.Fatalf("Failed to write layout file: %s", err) } // Add a shortcode if err := afero.WriteFile(hugofs.Source(), filepath.Join("layouts", "shortcodes", "shortcode.html"), []byte("Shortcode: {{ i18n \"hello\" }}"), 0755); err != nil { t.Fatalf("Failed to write layout file: %s", err) } // Add some language files if err := afero.WriteFile(hugofs.Source(), filepath.Join("i18n", "en.yaml"), []byte(` - id: hello translation: "Hello" `), 0755); err != nil { t.Fatalf("Failed to write language file: %s", err) } if err := afero.WriteFile(hugofs.Source(), filepath.Join("i18n", "fr.yaml"), []byte(` - id: hello translation: "Bonjour" `), 0755); err != nil { t.Fatalf("Failed to write language file: %s", err) } // Sources sources := []source.ByteSource{ {Name: filepath.FromSlash("sect/doc1.en.md"), Content: []byte(`--- title: doc1 slug: doc1-slug tags: - tag1 publishdate: "2000-01-01" --- # doc1 *some "content"* {{< shortcode >}} NOTE: slug should be used as URL `)}, {Name: filepath.FromSlash("sect/doc1.fr.md"), Content: []byte(`--- title: doc1 plaques: - frtag1 - frtag2 publishdate: "2000-01-04" --- # doc1 *quelque "contenu"* {{< shortcode >}} NOTE: should be in the 'en' Page's 'Translations' field. NOTE: date is after "doc3" `)}, {Name: filepath.FromSlash("sect/doc2.en.md"), Content: []byte(`--- title: doc2 publishdate: "2000-01-02" --- # doc2 *some content* NOTE: without slug, "doc2" should be used, without ".en" as URL `)}, {Name: filepath.FromSlash("sect/doc3.en.md"), Content: []byte(`--- title: doc3 publishdate: "2000-01-03" tags: - tag2 - tag1 url: /superbob --- # doc3 *some content* NOTE: third 'en' doc, should trigger pagination on home page. `)}, {Name: filepath.FromSlash("sect/doc4.md"), Content: []byte(`--- title: doc4 plaques: - frtag1 publishdate: "2000-01-05" --- # doc4 *du contenu francophone* NOTE: should use the defaultContentLanguage and mark this doc as 'fr'. NOTE: doesn't have any corresponding translation in 'en' `)}, {Name: filepath.FromSlash("other/doc5.fr.md"), Content: []byte(`--- title: doc5 publishdate: "2000-01-06" --- # doc5 *autre contenu francophone* NOTE: should use the "permalinks" configuration with :filename `)}, // Add some for the stats {Name: filepath.FromSlash("stats/expired.fr.md"), Content: []byte(`--- title: expired publishdate: "2000-01-06" expiryDate: "2001-01-06" --- # Expired `)}, {Name: filepath.FromSlash("stats/future.fr.md"), Content: []byte(`--- title: future publishdate: "2100-01-06" --- # Future `)}, {Name: filepath.FromSlash("stats/expired.en.md"), Content: []byte(`--- title: expired publishdate: "2000-01-06" expiryDate: "2001-01-06" --- # Expired `)}, {Name: filepath.FromSlash("stats/future.en.md"), Content: []byte(`--- title: future publishdate: "2100-01-06" --- # Future `)}, {Name: filepath.FromSlash("stats/draft.en.md"), Content: []byte(`--- title: expired publishdate: "2000-01-06" draft: true --- # Draft `)}, {Name: filepath.FromSlash("stats/tax.nn.md"), Content: []byte(`--- title: Tax NN publishdate: "2000-01-06" weight: 1001 lag: - Sogndal --- # Tax NN `)}, {Name: filepath.FromSlash("stats/tax.nb.md"), Content: []byte(`--- title: Tax NB publishdate: "2000-01-06" weight: 1002 lag: - Sogndal --- # Tax NB `)}, } configFile := "multilangconfig." + configSuffix writeSource(t, configFile, configContent) if err := LoadGlobalConfig("", configFile); err != nil { t.Fatalf("Failed to load config: %s", err) } // Hugo support using ByteSource's directly (for testing), // but to make it more real, we write them to the mem file system. for _, s := range sources { if err := afero.WriteFile(hugofs.Source(), filepath.Join("content", s.Name), s.Content, 0755); err != nil { t.Fatalf("Failed to write file: %s", err) } } // Add some data writeSource(t, "data/hugo.toml", "slogan = \"Hugo Rocks!\"") sites, err := NewHugoSitesFromConfiguration() if err != nil { t.Fatalf("Failed to create sites: %s", err) } if len(sites.Sites) != 4 { t.Fatalf("Got %d sites", len(sites.Sites)) } return sites }
func TestAddTemplateFileWithMaster(t *testing.T) { if !isAtLeastGo16() { t.Skip("This test only runs on Go >= 1.6") } for i, this := range []struct { masterTplContent string overlayTplContent string writeSkipper int expect interface{} }{ {`A{{block "main" .}}C{{end}}C`, `{{define "main"}}B{{end}}`, 0, "ABC"}, {`A{{block "main" .}}C{{end}}C{{block "sub" .}}D{{end}}E`, `{{define "main"}}B{{end}}`, 0, "ABCDE"}, {`A{{block "main" .}}C{{end}}C{{block "sub" .}}D{{end}}E`, `{{define "main"}}B{{end}}{{define "sub"}}Z{{end}}`, 0, "ABCZE"}, {`tpl`, `tpl`, 1, false}, {`tpl`, `tpl`, 2, false}, {`{{.0.E}}`, `tpl`, 0, false}, {`tpl`, `{{.0.E}}`, 0, false}, } { hugofs.SourceFs = afero.NewMemMapFs() templ := New() overlayTplName := "ot" masterTplName := "mt" finalTplName := "tp" if this.writeSkipper != 1 { afero.WriteFile(hugofs.SourceFs, masterTplName, []byte(this.masterTplContent), 0644) } if this.writeSkipper != 2 { afero.WriteFile(hugofs.SourceFs, overlayTplName, []byte(this.overlayTplContent), 0644) } err := templ.AddTemplateFileWithMaster(finalTplName, overlayTplName, masterTplName) if b, ok := this.expect.(bool); ok && !b { if err == nil { t.Errorf("[%d] AddTemplateFileWithMaster didn't return an expected error", i) } } else { if err != nil { t.Errorf("[%d] AddTemplateFileWithMaster failed: %s", i, err) continue } resultTpl := templ.Lookup(finalTplName) if resultTpl == nil { t.Errorf("[%d] AddTemplateFileWithMaster: Result template not found", i) continue } var b bytes.Buffer err := resultTpl.Execute(&b, nil) if err != nil { t.Errorf("[%d] AddTemplateFileWithMaster execute failed: %s", i, err) continue } resultContent := b.String() if resultContent != this.expect { t.Errorf("[%d] AddTemplateFileWithMaster got \n%s but expected \n%v", i, resultContent, this.expect) } } } }
func writeSource(t *testing.T, filename, content string) { if err := afero.WriteFile(hugofs.Source(), filepath.FromSlash(filename), []byte(content), 0755); err != nil { t.Fatalf("Failed to write file: %s", err) } }
func MustWriteFile(fs afero.Fs, path string, data string) { error := afero.WriteFile(fs, path, []byte(data), 0644) if error != nil { panic(error) } }