github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/hugolib/configdir_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  	"path/filepath"
    18  	"testing"
    19  
    20  	"github.com/gohugoio/hugo/common/herrors"
    21  
    22  	qt "github.com/frankban/quicktest"
    23  	"github.com/gohugoio/hugo/htesting"
    24  	"github.com/spf13/afero"
    25  )
    26  
    27  func TestLoadConfigDir(t *testing.T) {
    28  	t.Parallel()
    29  
    30  	c := qt.New(t)
    31  
    32  	configContent := `
    33  baseURL = "https://example.org"
    34  paginagePath = "pag_root"
    35  
    36  [languages.en]
    37  weight = 0
    38  languageName = "English"
    39  
    40  [languages.no]
    41  weight = 10
    42  languageName = "FOO"
    43  
    44  [params]
    45  p1 = "p1_base"
    46  
    47  `
    48  
    49  	mm := afero.NewMemMapFs()
    50  
    51  	writeToFs(t, mm, "hugo.toml", configContent)
    52  
    53  	fb := htesting.NewTestdataBuilder(mm, "config/_default", t)
    54  
    55  	fb.Add("config.toml", `paginatePath = "pag_default"`)
    56  
    57  	fb.Add("params.yaml", `
    58  p2: "p2params_default"
    59  p3: "p3params_default"
    60  p4: "p4params_default"
    61  `)
    62  	fb.Add("menus.toml", `
    63  [[docs]]
    64  name = "About Hugo"
    65  weight = 1
    66  [[docs]]
    67  name = "Home"
    68  weight = 2
    69  	`)
    70  
    71  	fb.Add("menus.no.toml", `
    72  	[[docs]]
    73  	name = "Om Hugo"
    74  	weight = 1
    75  	`)
    76  
    77  	fb.Add("params.no.toml",
    78  		`
    79  p3 = "p3params_no_default"
    80  p4 = "p4params_no_default"`,
    81  	)
    82  	fb.Add("languages.no.toml", `languageName = "Norsk_no_default"`)
    83  
    84  	fb.Build()
    85  
    86  	fb = fb.WithWorkingDir("config/production")
    87  
    88  	fb.Add("config.toml", `paginatePath = "pag_production"`)
    89  
    90  	fb.Add("params.no.toml", `
    91  p2 = "p2params_no_production"
    92  p3 = "p3params_no_production"
    93  `)
    94  
    95  	fb.Build()
    96  
    97  	fb = fb.WithWorkingDir("config/development")
    98  
    99  	// This is set in all the config.toml variants above, but this will win.
   100  	fb.Add("config.TOML", `paginatePath = "pag_development"`)
   101  	// Issue #5646
   102  	fb.Add("config.toml.swp", `p3 = "paginatePath = "nono"`)
   103  
   104  	fb.Add("params.no.toml", `p3 = "p3params_no_development"`)
   105  	fb.Add("params.toml", `p3 = "p3params_development"`)
   106  
   107  	fb.Build()
   108  
   109  	cfg, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Environment: "development", Filename: "hugo.toml", AbsConfigDir: "config"})
   110  	c.Assert(err, qt.IsNil)
   111  
   112  	c.Assert(cfg.GetString("paginatePath"), qt.Equals, "pag_development") // /config/development/config.toml
   113  
   114  	c.Assert(cfg.GetInt("languages.no.weight"), qt.Equals, 10)                          //  /config.toml
   115  	c.Assert(cfg.GetString("languages.no.languageName"), qt.Equals, "Norsk_no_default") // /config/_default/languages.no.toml
   116  
   117  	c.Assert(cfg.GetString("params.p1"), qt.Equals, "p1_base")
   118  	c.Assert(cfg.GetString("params.p2"), qt.Equals, "p2params_default") // Is in both _default and production
   119  	c.Assert(cfg.GetString("params.p3"), qt.Equals, "p3params_development")
   120  	c.Assert(cfg.GetString("languages.no.params.p3"), qt.Equals, "p3params_no_development")
   121  
   122  	c.Assert(len(cfg.Get("menus.docs").([]any)), qt.Equals, 2)
   123  	noMenus := cfg.Get("languages.no.menus.docs")
   124  	c.Assert(noMenus, qt.Not(qt.IsNil))
   125  	c.Assert(len(noMenus.([]any)), qt.Equals, 1)
   126  }
   127  
   128  func TestLoadConfigDirError(t *testing.T) {
   129  	t.Parallel()
   130  
   131  	c := qt.New(t)
   132  
   133  	configContent := `
   134  baseURL = "https://example.org"
   135  
   136  `
   137  
   138  	mm := afero.NewMemMapFs()
   139  
   140  	writeToFs(t, mm, "hugo.toml", configContent)
   141  
   142  	fb := htesting.NewTestdataBuilder(mm, "config/development", t)
   143  
   144  	fb.Add("config.toml", `invalid & syntax`).Build()
   145  
   146  	_, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Environment: "development", Filename: "hugo.toml", AbsConfigDir: "config"})
   147  	c.Assert(err, qt.Not(qt.IsNil))
   148  
   149  	fe := herrors.UnwrapFileError(err)
   150  	c.Assert(fe, qt.Not(qt.IsNil))
   151  	c.Assert(fe.Position().Filename, qt.Equals, filepath.FromSlash("config/development/config.toml"))
   152  }