diff options
Diffstat (limited to 'hugolib/config_test.go')
-rw-r--r-- | hugolib/config_test.go | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/hugolib/config_test.go b/hugolib/config_test.go new file mode 100644 index 000000000..a52e3f061 --- /dev/null +++ b/hugolib/config_test.go @@ -0,0 +1,526 @@ +// Copyright 2016-present The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package hugolib + +import ( + "bytes" + "fmt" + "path/filepath" + "testing" + + qt "github.com/frankban/quicktest" + "github.com/spf13/afero" + "github.com/spf13/viper" +) + +func TestLoadConfig(t *testing.T) { + t.Parallel() + + c := qt.New(t) + + // Add a random config variable for testing. + // side = page in Norwegian. + configContent := ` + PaginatePath = "side" + ` + + mm := afero.NewMemMapFs() + + writeToFs(t, mm, "hugo.toml", configContent) + + cfg, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Filename: "hugo.toml"}) + c.Assert(err, qt.IsNil) + + c.Assert(cfg.GetString("paginatePath"), qt.Equals, "side") + +} + +func TestLoadMultiConfig(t *testing.T) { + t.Parallel() + + c := qt.New(t) + + // Add a random config variable for testing. + // side = page in Norwegian. + configContentBase := ` + DontChange = "same" + PaginatePath = "side" + ` + configContentSub := ` + PaginatePath = "top" + ` + mm := afero.NewMemMapFs() + + writeToFs(t, mm, "base.toml", configContentBase) + + writeToFs(t, mm, "override.toml", configContentSub) + + cfg, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Filename: "base.toml,override.toml"}) + c.Assert(err, qt.IsNil) + + c.Assert(cfg.GetString("paginatePath"), qt.Equals, "top") + c.Assert(cfg.GetString("DontChange"), qt.Equals, "same") +} + +func TestLoadConfigFromTheme(t *testing.T) { + t.Parallel() + + c := qt.New(t) + + mainConfigBasic := ` +theme = "test-theme" +baseURL = "https://example.com/" + +` + mainConfig := ` +theme = "test-theme" +baseURL = "https://example.com/" + +[frontmatter] +date = ["date","publishDate"] + +[params] +p1 = "p1 main" +p2 = "p2 main" +top = "top" + +[mediaTypes] +[mediaTypes."text/m1"] +suffixes = ["m1main"] + +[outputFormats.o1] +mediaType = "text/m1" +baseName = "o1main" + +[languages] +[languages.en] +languageName = "English" +[languages.en.params] +pl1 = "p1-en-main" +[languages.nb] +languageName = "Norsk" +[languages.nb.params] +pl1 = "p1-nb-main" + +[[menu.main]] +name = "menu-main-main" + +[[menu.top]] +name = "menu-top-main" + +` + + themeConfig := ` +baseURL = "http://bep.is/" + +# Can not be set in theme. +[frontmatter] +expiryDate = ["date"] + +[params] +p1 = "p1 theme" +p2 = "p2 theme" +p3 = "p3 theme" + +[mediaTypes] +[mediaTypes."text/m1"] +suffixes = ["m1theme"] +[mediaTypes."text/m2"] +suffixes = ["m2theme"] + +[outputFormats.o1] +mediaType = "text/m1" +baseName = "o1theme" +[outputFormats.o2] +mediaType = "text/m2" +baseName = "o2theme" + +[languages] +[languages.en] +languageName = "English2" +[languages.en.params] +pl1 = "p1-en-theme" +pl2 = "p2-en-theme" +[[languages.en.menu.main]] +name = "menu-lang-en-main" +[[languages.en.menu.theme]] +name = "menu-lang-en-theme" +[languages.nb] +languageName = "Norsk2" +[languages.nb.params] +pl1 = "p1-nb-theme" +pl2 = "p2-nb-theme" +top = "top-nb-theme" +[[languages.nb.menu.main]] +name = "menu-lang-nb-main" +[[languages.nb.menu.theme]] +name = "menu-lang-nb-theme" +[[languages.nb.menu.top]] +name = "menu-lang-nb-top" + +[[menu.main]] +name = "menu-main-theme" + +[[menu.thememenu]] +name = "menu-theme" + +` + + b := newTestSitesBuilder(t) + b.WithConfigFile("toml", mainConfig).WithThemeConfigFile("toml", themeConfig) + b.CreateSites().Build(BuildCfg{}) + + got := b.Cfg.(*viper.Viper).AllSettings() + + b.AssertObject(` +map[string]interface {}{ + "p1": "p1 main", + "p2": "p2 main", + "p3": "p3 theme", + "top": "top", +}`, got["params"]) + + b.AssertObject(` +map[string]interface {}{ + "date": []interface {}{ + "date", + "publishDate", + }, +}`, got["frontmatter"]) + + b.AssertObject(` +map[string]interface {}{ + "text/m1": map[string]interface {}{ + "suffixes": []interface {}{ + "m1main", + }, + }, + "text/m2": map[string]interface {}{ + "suffixes": []interface {}{ + "m2theme", + }, + }, +}`, got["mediatypes"]) + + b.AssertObject(` +map[string]interface {}{ + "o1": map[string]interface {}{ + "basename": "o1main", + "mediatype": Type{ + MainType: "text", + SubType: "m1", + Delimiter: ".", + Suffixes: []string{ + "m1main", + }, + }, + }, + "o2": map[string]interface {}{ + "basename": "o2theme", + "mediatype": Type{ + MainType: "text", + SubType: "m2", + Delimiter: ".", + Suffixes: []string{ + "m2theme", + }, + }, + }, +}`, got["outputformats"]) + + b.AssertObject(`map[string]interface {}{ + "en": map[string]interface {}{ + "languagename": "English", + "menus": map[string]interface {}{ + "theme": []map[string]interface {}{ + map[string]interface {}{ + "name": "menu-lang-en-theme", + }, + }, + }, + "params": map[string]interface {}{ + "pl1": "p1-en-main", + "pl2": "p2-en-theme", + }, + }, + "nb": map[string]interface {}{ + "languagename": "Norsk", + "menus": map[string]interface {}{ + "theme": []map[string]interface {}{ + map[string]interface {}{ + "name": "menu-lang-nb-theme", + }, + }, + }, + "params": map[string]interface {}{ + "pl1": "p1-nb-main", + "pl2": "p2-nb-theme", + }, + }, +} +`, got["languages"]) + + b.AssertObject(` +map[string]interface {}{ + "main": []map[string]interface {}{ + map[string]interface {}{ + "name": "menu-main-main", + }, + }, + "thememenu": []map[string]interface {}{ + map[string]interface {}{ + "name": "menu-theme", + }, + }, + "top": []map[string]interface {}{ + map[string]interface {}{ + "name": "menu-top-main", + }, + }, +} +`, got["menus"]) + + c.Assert(got["baseurl"], qt.Equals, "https://example.com/") + + if true { + return + } + // Test variants with only values from theme + b = newTestSitesBuilder(t) + b.WithConfigFile("toml", mainConfigBasic).WithThemeConfigFile("toml", themeConfig) + b.CreateSites().Build(BuildCfg{}) + + got = b.Cfg.(*viper.Viper).AllSettings() + + b.AssertObject(`map[string]interface {}{ + "p1": "p1 theme", + "p2": "p2 theme", + "p3": "p3 theme", + "test-theme": map[string]interface {}{ + "p1": "p1 theme", + "p2": "p2 theme", + "p3": "p3 theme", + }, +}`, got["params"]) + + c.Assert(got["languages"], qt.IsNil) + b.AssertObject(` +map[string]interface {}{ + "text/m1": map[string]interface {}{ + "suffix": "m1theme", + }, + "text/m2": map[string]interface {}{ + "suffix": "m2theme", + }, +}`, got["mediatypes"]) + + b.AssertObject(` +map[string]interface {}{ + "o1": map[string]interface {}{ + "basename": "o1theme", + "mediatype": Type{ + MainType: "text", + SubType: "m1", + Suffix: "m1theme", + Delimiter: ".", + }, + }, + "o2": map[string]interface {}{ + "basename": "o2theme", + "mediatype": Type{ + MainType: "text", + SubType: "m2", + Suffix: "m2theme", + Delimiter: ".", + }, + }, +}`, got["outputformats"]) + b.AssertObject(` +map[string]interface {}{ + "main": []interface {}{ + map[string]interface {}{ + "name": "menu-main-theme", + }, + }, + "thememenu": []interface {}{ + map[string]interface {}{ + "name": "menu-theme", + }, + }, +}`, got["menu"]) + +} + +func TestPrivacyConfig(t *testing.T) { + t.Parallel() + + c := qt.New(t) + + tomlConfig := ` + +someOtherValue = "foo" + +[privacy] +[privacy.youtube] +privacyEnhanced = true +` + + b := newTestSitesBuilder(t) + b.WithConfigFile("toml", tomlConfig) + b.Build(BuildCfg{SkipRender: true}) + + c.Assert(b.H.Sites[0].Info.Config().Privacy.YouTube.PrivacyEnhanced, qt.Equals, true) + +} + +func TestLoadConfigModules(t *testing.T) { + t.Parallel() + + c := qt.New(t) + + // https://github.com/gohugoio/hugoThemes#themetoml + + const ( + // Before Hugo 0.56 each theme/component could have its own theme.toml + // with some settings, mostly used on the Hugo themes site. + // To preserve combability we read these files into the new "modules" + // section in config.toml. + o1t = ` +name = "Component o1" +license = "MIT" +min_version = 0.38 +` + // This is the component's config.toml, using the old theme syntax. + o1c = ` +theme = ["n2"] +` + + n1 = ` +title = "Component n1" + +[module] +description = "Component n1 description" +[module.hugoVersion] +min = "0.40.0" +max = "0.50.0" +extended = true +[[module.imports]] +path="o1" +[[module.imports]] +path="n3" + + +` + + n2 = ` +title = "Component n2" +` + + n3 = ` +title = "Component n3" +` + + n4 = ` +title = "Component n4" +` + ) + + b := newTestSitesBuilder(t) + + writeThemeFiles := func(name, configTOML, themeTOML string) { + b.WithSourceFile(filepath.Join("themes", name, "data", "module.toml"), fmt.Sprintf("name=%q", name)) + if configTOML != "" { + b.WithSourceFile(filepath.Join("themes", name, "config.toml"), configTOML) + } + if themeTOML != "" { + b.WithSourceFile(filepath.Join("themes", name, "theme.toml"), themeTOML) + } + } + + writeThemeFiles("n1", n1, "") + writeThemeFiles("n2", n2, "") + writeThemeFiles("n3", n3, "") + writeThemeFiles("n4", n4, "") + writeThemeFiles("o1", o1c, o1t) + + b.WithConfigFile("toml", ` +[module] +[[module.imports]] +path="n1" +[[module.imports]] +path="n4" + +`) + + b.Build(BuildCfg{}) + + modulesClient := b.H.Paths.ModulesClient + var graphb bytes.Buffer + modulesClient.Graph(&graphb) + + expected := `project n1 +n1 o1 +o1 n2 +n1 n3 +project n4 +` + + c.Assert(graphb.String(), qt.Equals, expected) + +} + +func TestLoadConfigWithOsEnvOverrides(t *testing.T) { + + c := qt.New(t) + + baseConfig := ` + +environment = "production" +enableGitInfo = true +intSlice = [5,7,9] +floatSlice = [3.14, 5.19] +stringSlice = ["a", "b"] + +[imaging] +anchor = "smart" +quality = 75 +resamplefilter = "CatmullRom" +` + + b := newTestSitesBuilder(t).WithConfigFile("toml", baseConfig) + + b.WithEnviron( + "HUGO_ENVIRONMENT", "test", + "HUGO_NEW", "new", // key not in config.toml + "HUGO_ENABLEGITINFO", "false", + "HUGO_IMAGING_ANCHOR", "top", + "HUGO_STRINGSLICE", `["c", "d"]`, + "HUGO_INTSLICE", `[5, 8, 9]`, + "HUGO_FLOATSLICE", `[5.32]`, + ) + + b.Build(BuildCfg{}) + + cfg := b.H.Cfg + + 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("stringSlice"), qt.DeepEquals, []interface{}{"c", "d"}) + c.Assert(cfg.Get("floatSlice"), qt.DeepEquals, []interface{}{5.32}) + c.Assert(cfg.Get("intSlice"), qt.DeepEquals, []interface{}{5, 8, 9}) + +} |