summaryrefslogtreecommitdiffstats
path: root/hugolib/config_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/config_test.go')
-rw-r--r--hugolib/config_test.go577
1 files changed, 242 insertions, 335 deletions
diff --git a/hugolib/config_test.go b/hugolib/config_test.go
index 37605b4c2..169674acb 100644
--- a/hugolib/config_test.go
+++ b/hugolib/config_test.go
@@ -21,59 +21,241 @@ import (
"testing"
"github.com/gohugoio/hugo/config"
-
- "github.com/gohugoio/hugo/media"
- "github.com/google/go-cmp/cmp"
+ "github.com/gohugoio/hugo/config/allconfig"
qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/common/maps"
"github.com/spf13/afero"
)
+func TestLoadConfigLanguageParamsOverrideIssue10620(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+disableKinds = ["taxonomy", "term", "RSS", "sitemap", "robotsTXT", "page", "setion"]
+title = "Base Title"
+staticDir = "mystatic"
+[params]
+[params.comments]
+color = "blue"
+title = "Default Comments Title"
+[languages]
+[languages.en]
+title = "English Title"
+[languages.en.params.comments]
+title = "English Comments Title"
+
+
+
+`
+ b := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ enSite := b.H.Sites[0]
+ b.Assert(enSite.Title(), qt.Equals, "English Title")
+ b.Assert(enSite.Home().Title(), qt.Equals, "English Title")
+ b.Assert(enSite.Params(), qt.DeepEquals, maps.Params{
+ "comments": maps.Params{
+ "color": "blue",
+ "title": "English Comments Title",
+ },
+ },
+ )
+
+}
+
func TestLoadConfig(t *testing.T) {
- c := qt.New(t)
+ t.Run("2 languages", func(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+disableKinds = ["taxonomy", "term", "RSS", "sitemap", "robotsTXT", "page", "setion"]
+title = "Base Title"
+staticDir = "mystatic"
+[params]
+p1 = "p1base"
+p2 = "p2base"
+[languages]
+[languages.en]
+title = "English Title"
+[languages.en.params]
+myparam = "enParamValue"
+p1 = "p1en"
+weight = 1
+[languages.sv]
+title = "Svensk Title"
+staticDir = "mysvstatic"
+weight = 2
+[languages.sv.params]
+myparam = "svParamValue"
- loadConfig := func(c *qt.C, configContent string, fromDir bool) config.Provider {
- mm := afero.NewMemMapFs()
- filename := "config.toml"
- descriptor := ConfigSourceDescriptor{Fs: mm}
- if fromDir {
- filename = filepath.Join("config", "_default", filename)
- descriptor.AbsConfigDir = "config"
- }
- writeToFs(t, mm, filename, configContent)
- cfg, _, err := LoadConfig(descriptor)
- c.Assert(err, qt.IsNil)
- return cfg
- }
- c.Run("Basic", func(c *qt.C) {
- c.Parallel()
- // Add a random config variable for testing.
- // side = page in Norwegian.
- cfg := loadConfig(c, `PaginatePath = "side"`, false)
- c.Assert(cfg.GetString("paginatePath"), qt.Equals, "side")
+`
+ b := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ enSite := b.H.Sites[0]
+ svSite := b.H.Sites[1]
+ b.Assert(enSite.Title(), qt.Equals, "English Title")
+ b.Assert(enSite.Home().Title(), qt.Equals, "English Title")
+ b.Assert(enSite.Params()["myparam"], qt.Equals, "enParamValue")
+ b.Assert(enSite.Params()["p1"], qt.Equals, "p1en")
+ b.Assert(enSite.Params()["p2"], qt.Equals, "p2base")
+ b.Assert(svSite.Params()["p1"], qt.Equals, "p1base")
+ b.Assert(enSite.conf.StaticDir[0], qt.Equals, "mystatic")
+
+ b.Assert(svSite.Title(), qt.Equals, "Svensk Title")
+ b.Assert(svSite.Home().Title(), qt.Equals, "Svensk Title")
+ b.Assert(svSite.Params()["myparam"], qt.Equals, "svParamValue")
+ b.Assert(svSite.conf.StaticDir[0], qt.Equals, "mysvstatic")
+
})
- // Issue #8763
- for _, fromDir := range []bool{false, true} {
- testName := "Taxonomy overrides"
- if fromDir {
- testName += " from dir"
- }
- c.Run(testName, func(c *qt.C) {
- c.Parallel()
- cfg := loadConfig(c, `[taxonomies]
-appellation = "appellations"
-vigneron = "vignerons"`, fromDir)
-
- c.Assert(cfg.Get("taxonomies"), qt.DeepEquals, maps.Params{
- "appellation": "appellations",
- "vigneron": "vignerons",
- })
- })
- }
+ t.Run("disable default language", func(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+disableKinds = ["taxonomy", "term", "RSS", "sitemap", "robotsTXT", "page", "setion"]
+title = "Base Title"
+defaultContentLanguage = "sv"
+disableLanguages = ["sv"]
+[languages.en]
+weight = 1
+[languages.sv]
+weight = 2
+`
+ b, err := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).BuildE()
+
+ b.Assert(err, qt.IsNotNil)
+ b.Assert(err.Error(), qt.Contains, "cannot disable default content language")
+
+ })
+
+ t.Run("no internal config from outside", func(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+[internal]
+running = true
+`
+ b := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ b.Assert(b.H.Conf.Running(), qt.Equals, false)
+
+ })
+
+ t.Run("env overrides", func(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+disableKinds = ["taxonomy", "term", "RSS", "sitemap", "robotsTXT", "page", "setion"]
+title = "Base Title"
+[params]
+p1 = "p1base"
+p2 = "p2base"
+[params.pm2]
+pm21 = "pm21base"
+pm22 = "pm22base"
+-- layouts/index.html --
+p1: {{ .Site.Params.p1 }}
+p2: {{ .Site.Params.p2 }}
+pm21: {{ .Site.Params.pm2.pm21 }}
+pm22: {{ .Site.Params.pm2.pm22 }}
+pm31: {{ .Site.Params.pm3.pm31 }}
+
+
+
+`
+ b := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ Environ: []string{"HUGO_PARAMS_P2=p2env", "HUGO_PARAMS_PM2_PM21=pm21env", "HUGO_PARAMS_PM3_PM31=pm31env"},
+ },
+ ).Build()
+
+ b.AssertFileContent("public/index.html", "p1: p1base\np2: p2env\npm21: pm21env\npm22: pm22base\npm31: pm31env")
+
+ })
+
+}
+
+func TestLoadConfigThemeLanguage(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- /hugo.toml --
+baseURL = "https://example.com"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = true
+theme = "mytheme"
+[languages]
+[languages.en]
+title = "English Title"
+weight = 1
+[languages.sv]
+weight = 2
+-- themes/mytheme/hugo.toml --
+[params]
+p1 = "p1base"
+[languages]
+[languages.en]
+title = "English Title Theme"
+[languages.en.params]
+p2 = "p2en"
+[languages.en.params.sub]
+sub1 = "sub1en"
+[languages.sv]
+title = "Svensk Title Theme"
+-- layouts/index.html --
+title: {{ .Title }}|
+p1: {{ .Site.Params.p1 }}|
+p2: {{ .Site.Params.p2 }}|
+sub: {{ .Site.Params.sub }}|
+`
+ b := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ b.AssertFileContent("public/en/index.html", `
+title: English Title|
+p1: p1base
+p2: p2en
+sub: map[sub1:sub1en]
+`)
+
}
func TestLoadMultiConfig(t *testing.T) {
@@ -84,7 +266,7 @@ func TestLoadMultiConfig(t *testing.T) {
// Add a random config variable for testing.
// side = page in Norwegian.
configContentBase := `
- DontChange = "same"
+ Paginate = 32
PaginatePath = "side"
`
configContentSub := `
@@ -96,11 +278,13 @@ func TestLoadMultiConfig(t *testing.T) {
writeToFs(t, mm, "override.toml", configContentSub)
- cfg, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Filename: "base.toml,override.toml"})
+ all, err := allconfig.LoadConfig(allconfig.ConfigSourceDescriptor{Fs: mm, Filename: "base.toml,override.toml"})
c.Assert(err, qt.IsNil)
+ cfg := all.Base
+
+ c.Assert(cfg.PaginatePath, qt.Equals, "top")
+ c.Assert(cfg.Paginate, qt.Equals, 32)
- c.Assert(cfg.GetString("paginatePath"), qt.Equals, "top")
- c.Assert(cfg.GetString("DontChange"), qt.Equals, "same")
}
func TestLoadConfigFromThemes(t *testing.T) {
@@ -229,12 +413,9 @@ name = "menu-theme"
c.Run("Merge default", func(c *qt.C) {
b := buildForStrategy(c, "")
- got := b.Cfg.Get("").(maps.Params)
-
- // Issue #8866
- b.Assert(b.Cfg.Get("disableKinds"), qt.IsNil)
+ got := b.Configs.Base
- b.Assert(got["params"], qt.DeepEquals, maps.Params{
+ b.Assert(got.Params, qt.DeepEquals, maps.Params{
"b": maps.Params{
"b1": "b1 main",
"c": maps.Params{
@@ -248,100 +429,16 @@ name = "menu-theme"
"p1": "p1 main",
})
- b.Assert(got["mediatypes"], qt.DeepEquals, maps.Params{
- "text/m2": maps.Params{
- "suffixes": []any{
- "m2theme",
- },
- },
- "text/m1": maps.Params{
- "suffixes": []any{
- "m1main",
- },
- },
- })
-
- var eq = qt.CmpEquals(
- cmp.Comparer(func(m1, m2 media.Type) bool {
- if m1.SubType != m2.SubType {
- return false
- }
- return m1.FirstSuffix == m2.FirstSuffix
- }),
- )
-
- mediaTypes := b.H.Sites[0].mediaTypesConfig
- m1, _ := mediaTypes.GetByType("text/m1")
- m2, _ := mediaTypes.GetByType("text/m2")
-
- b.Assert(got["outputformats"], eq, maps.Params{
- "o1": maps.Params{
- "mediatype": m1,
- "basename": "o1main",
- },
- "o2": maps.Params{
- "basename": "o2theme",
- "mediatype": m2,
- },
- })
-
- b.Assert(got["languages"], qt.DeepEquals, maps.Params{
- "en": maps.Params{
- "languagename": "English",
- "params": maps.Params{
- "pl2": "p2-en-theme",
- "pl1": "p1-en-main",
- },
- "menus": maps.Params{
- "main": []any{
- map[string]any{
- "name": "menu-lang-en-main",
- },
- },
- "theme": []any{
- map[string]any{
- "name": "menu-lang-en-theme",
- },
- },
- },
- },
- "nb": maps.Params{
- "languagename": "Norsk",
- "params": maps.Params{
- "top": "top-nb-theme",
- "pl1": "p1-nb-main",
- "pl2": "p2-nb-theme",
- },
- "menus": maps.Params{
- "main": []any{
- map[string]any{
- "name": "menu-lang-nb-main",
- },
- },
- "theme": []any{
- map[string]any{
- "name": "menu-lang-nb-theme",
- },
- },
- "top": []any{
- map[string]any{
- "name": "menu-lang-nb-top",
- },
- },
- },
- },
- })
-
- c.Assert(got["baseurl"], qt.Equals, "https://example.com/")
+ c.Assert(got.BaseURL, qt.Equals, "https://example.com/")
})
c.Run("Merge shallow", func(c *qt.C) {
b := buildForStrategy(c, fmt.Sprintf("_merge=%q", "shallow"))
- got := b.Cfg.Get("").(maps.Params)
+ got := b.Configs.Base.Params
// Shallow merge, only add new keys to params.
- b.Assert(got["params"], qt.DeepEquals, maps.Params{
+ b.Assert(got, qt.DeepEquals, maps.Params{
"p1": "p1 main",
"b": maps.Params{
"b1": "b1 main",
@@ -360,59 +457,13 @@ name = "menu-theme"
"[params]\np1 = \"p1 theme\"\n",
)
- got := b.Cfg.Get("").(maps.Params)
+ got := b.Configs.Base.Params
- b.Assert(got["params"], qt.DeepEquals, maps.Params{
+ b.Assert(got, qt.DeepEquals, maps.Params{
"p1": "p1 theme",
})
})
- c.Run("Merge language no menus or params in project", func(c *qt.C) {
- b := buildForConfig(
- c,
- `
-theme = "test-theme"
-baseURL = "https://example.com/"
-
-[languages]
-[languages.en]
-languageName = "English"
-
-`,
- `
-[languages]
-[languages.en]
-languageName = "EnglishTheme"
-
-[languages.en.params]
-p1="themep1"
-
-[[languages.en.menus.main]]
-name = "menu-theme"
-`,
- )
-
- got := b.Cfg.Get("").(maps.Params)
-
- b.Assert(got["languages"], qt.DeepEquals,
- maps.Params{
- "en": maps.Params{
- "languagename": "English",
- "menus": maps.Params{
- "main": []any{
- map[string]any{
- "name": "menu-theme",
- },
- },
- },
- "params": maps.Params{
- "p1": "themep1",
- },
- },
- },
- )
- })
-
// Issue #8724
for _, mergeStrategy := range []string{"none", "shallow"} {
c.Run(fmt.Sprintf("Merge with sitemap config in theme, mergestrategy %s", mergeStrategy), func(c *qt.C) {
@@ -428,22 +479,14 @@ name = "menu-theme"
"baseURL=\"http://example.com\"\n"+fmt.Sprintf(smapConfigTempl, "monthly"),
)
- got := b.Cfg.Get("").(maps.Params)
+ got := b.Configs.Base
if mergeStrategy == "none" {
- b.Assert(got["sitemap"], qt.DeepEquals, maps.Params{
- "priority": int(-1),
- "filename": "sitemap.xml",
- })
+ b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "", Priority: -1, Filename: "sitemap.xml"})
b.AssertFileContent("public/sitemap.xml", "schemas/sitemap")
} else {
- b.Assert(got["sitemap"], qt.DeepEquals, maps.Params{
- "priority": int(-1),
- "filename": "sitemap.xml",
- "changefreq": "monthly",
- })
-
+ b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "monthly", Priority: -1, Filename: "sitemap.xml"})
b.AssertFileContent("public/sitemap.xml", "<changefreq>monthly</changefreq>")
}
@@ -494,7 +537,7 @@ t3 = "tv3p"
b.Build(BuildCfg{})
- got := b.Cfg.Get("params").(maps.Params)
+ got := b.Configs.Base.Params
b.Assert(got, qt.DeepEquals, maps.Params{
"t3": "tv3p",
@@ -523,7 +566,7 @@ privacyEnhanced = true
b.WithConfigFile("toml", tomlConfig)
b.Build(BuildCfg{SkipRender: true})
- c.Assert(b.H.Sites[0].Info.Config().Privacy.YouTube.PrivacyEnhanced, qt.Equals, true)
+ c.Assert(b.H.Sites[0].Config().Privacy.YouTube.PrivacyEnhanced, qt.Equals, true)
}
func TestLoadConfigModules(t *testing.T) {
@@ -607,7 +650,7 @@ path="n4"
b.Build(BuildCfg{})
- modulesClient := b.H.Paths.ModulesClient
+ modulesClient := b.H.Configs.ModulesClient
var graphb bytes.Buffer
modulesClient.Graph(&graphb)
@@ -621,142 +664,6 @@ project n4
c.Assert(graphb.String(), qt.Equals, expected)
}
-func TestLoadConfigWithOsEnvOverrides(t *testing.T) {
- c := qt.New(t)
-
- baseConfig := `
-
-theme = "mytheme"
-environment = "production"
-enableGitInfo = true
-intSlice = [5,7,9]
-floatSlice = [3.14, 5.19]
-stringSlice = ["a", "b"]
-
-[outputFormats]
-[outputFormats.ofbase]
-mediaType = "text/plain"
-
-[params]
-paramWithNoEnvOverride="nooverride"
-[params.api_config]
-api_key="default_key"
-another_key="default another_key"
-
-[imaging]
-anchor = "smart"
-quality = 75
-`
-
- newB := func(t testing.TB) *sitesBuilder {
- b := newTestSitesBuilder(t).WithConfigFile("toml", baseConfig)
-
- b.WithSourceFile("themes/mytheme/config.toml", `
-
-[outputFormats]
-[outputFormats.oftheme]
-mediaType = "text/plain"
-[outputFormats.ofbase]
-mediaType = "application/xml"
-
-[params]
-[params.mytheme_section]
-theme_param="themevalue"
-theme_param_nooverride="nooverride"
-[params.mytheme_section2]
-theme_param="themevalue2"
-
-`)
-
- return b
- }
-
- c.Run("Variations", func(c *qt.C) {
-
- b := newB(c)
-
- b.WithEnviron(
- "HUGO_ENVIRONMENT", "test",
- "HUGO_NEW", "new", // key not in config.toml
- "HUGO_ENABLEGITINFO", "false",
- "HUGO_IMAGING_ANCHOR", "top",
- "HUGO_IMAGING_RESAMPLEFILTER", "CatmullRom",
- "HUGO_STRINGSLICE", `["c", "d"]`,
- "HUGO_INTSLICE", `[5, 8, 9]`,
- "HUGO_FLOATSLICE", `[5.32]`,
- // Issue #7829
- "HUGOxPARAMSxAPI_CONFIGxAPI_KEY", "new_key",
- // Delimiters are case sensitive.
- "HUGOxPARAMSxAPI_CONFIGXANOTHER_KEY", "another_key",
- // Issue #8346
- "HUGOxPARAMSxMYTHEME_SECTIONxTHEME_PARAM", "themevalue_changed",
- "HUGOxPARAMSxMYTHEME_SECTION2xTHEME_PARAM", "themevalue2_changed",
- "HUGO_PARAMS_EMPTY", ``,
- "HUGO_PARAMS_HTML", `<a target="_blank" />`,
- // Issue #8618
- "HUGO_SERVICES_GOOGLEANALYTICS_ID", `gaid`,
- "HUGO_PARAMS_A_B_C", "abc",
- )
-
- b.Build(BuildCfg{})
-
- cfg := b.H.Cfg
- s := b.H.Sites[0]
- scfg := s.siteConfigConfig.Services
-
- c.Assert(cfg.Get("environment"), qt.Equals, "test")
- c.Assert(cfg.GetBool("enablegitinfo"), qt.Equals, false)
- c.Assert(cfg.Get("new"), qt.Equals, "new")
- c.Assert(cfg.Get("imaging.anchor"), qt.Equals, "top")
- c.Assert(cfg.Get("imaging.quality"), qt.Equals, int64(75))
- c.Assert(cfg.Get("imaging.resamplefilter"), qt.Equals, "CatmullRom")
- c.Assert(cfg.Get("stringSlice"), qt.DeepEquals, []any{"c", "d"})
- c.Assert(cfg.Get("floatSlice"), qt.DeepEquals, []any{5.32})
- c.Assert(cfg.Get("intSlice"), qt.DeepEquals, []any{5, 8, 9})
- c.Assert(cfg.Get("params.api_config.api_key"), qt.Equals, "new_key")
- c.Assert(cfg.Get("params.api_config.another_key"), qt.Equals, "default another_key")
- c.Assert(cfg.Get("params.mytheme_section.theme_param"), qt.Equals, "themevalue_changed")
- c.Assert(cfg.Get("params.mytheme_section.theme_param_nooverride"), qt.Equals, "nooverride")
- c.Assert(cfg.Get("params.mytheme_section2.theme_param"), qt.Equals, "themevalue2_changed")
- c.Assert(cfg.Get("params.empty"), qt.Equals, ``)
- c.Assert(cfg.Get("params.html"), qt.Equals, `<a target="_blank" />`)
-
- params := cfg.Get("params").(maps.Params)
- c.Assert(params["paramwithnoenvoverride"], qt.Equals, "nooverride")
- c.Assert(cfg.Get("params.paramwithnoenvoverride"), qt.Equals, "nooverride")
- c.Assert(scfg.GoogleAnalytics.ID, qt.Equals, "gaid")
- c.Assert(cfg.Get("params.a.b"), qt.DeepEquals, maps.Params{
- "c": "abc",
- })
-
- ofBase, _ := s.outputFormatsConfig.GetByName("ofbase")
- ofTheme, _ := s.outputFormatsConfig.GetByName("oftheme")
-
- c.Assert(ofBase.MediaType, qt.Equals, media.TextType)
- c.Assert(ofTheme.MediaType, qt.Equals, media.TextType)
-
- })
-
- // Issue #8709
- c.Run("Set in string", func(c *qt.C) {
- b := newB(c)
-
- b.WithEnviron(
- "HUGO_ENABLEGITINFO", "false",
- // imaging.anchor is a string, and it's not possible
- // to set a child attribute.
- "HUGO_IMAGING_ANCHOR_FOO", "top",
- )
-
- b.Build(BuildCfg{})
-
- cfg := b.H.Cfg
- c.Assert(cfg.Get("imaging.anchor"), qt.Equals, "smart")
-
- })
-
-}
-
func TestInvalidDefaultMarkdownHandler(t *testing.T) {
t.Parallel()