code.gitea.io/gitea@v1.22.3/modules/setting/config_provider_test.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestConfigProviderBehaviors(t *testing.T) {
    14  	t.Run("BuggyKeyOverwritten", func(t *testing.T) {
    15  		cfg, _ := NewConfigProviderFromData(`
    16  [foo]
    17  key =
    18  `)
    19  		sec := cfg.Section("foo")
    20  		secSub := cfg.Section("foo.bar")
    21  		secSub.Key("key").MustString("1")             // try to read a key from subsection
    22  		assert.Equal(t, "1", sec.Key("key").String()) // TODO: BUGGY! the key in [foo] is overwritten
    23  	})
    24  
    25  	t.Run("SubsectionSeeParentKeys", func(t *testing.T) {
    26  		cfg, _ := NewConfigProviderFromData(`
    27  [foo]
    28  key = 123
    29  `)
    30  		secSub := cfg.Section("foo.bar.xxx")
    31  		assert.Equal(t, "123", secSub.Key("key").String())
    32  	})
    33  	t.Run("TrailingSlash", func(t *testing.T) {
    34  		cfg, _ := NewConfigProviderFromData(`
    35  [foo]
    36  key = E:\
    37  xxx = yyy
    38  `)
    39  		sec := cfg.Section("foo")
    40  		assert.Equal(t, "E:\\", sec.Key("key").String())
    41  		assert.Equal(t, "yyy", sec.Key("xxx").String())
    42  	})
    43  }
    44  
    45  func TestConfigProviderHelper(t *testing.T) {
    46  	cfg, _ := NewConfigProviderFromData(`
    47  [foo]
    48  empty =
    49  key = 123
    50  `)
    51  
    52  	sec := cfg.Section("foo")
    53  	secSub := cfg.Section("foo.bar")
    54  
    55  	// test empty key
    56  	assert.Equal(t, "def", ConfigSectionKeyString(sec, "empty", "def"))
    57  	assert.Equal(t, "xyz", ConfigSectionKeyString(secSub, "empty", "xyz"))
    58  
    59  	// test non-inherited key, only see the keys in current section
    60  	assert.NotNil(t, ConfigSectionKey(sec, "key"))
    61  	assert.Nil(t, ConfigSectionKey(secSub, "key"))
    62  
    63  	// test default behavior
    64  	assert.Equal(t, "123", ConfigSectionKeyString(sec, "key"))
    65  	assert.Equal(t, "", ConfigSectionKeyString(secSub, "key"))
    66  	assert.Equal(t, "def", ConfigSectionKeyString(secSub, "key", "def"))
    67  
    68  	assert.Equal(t, "123", ConfigInheritedKeyString(secSub, "key"))
    69  
    70  	// Workaround for ini package's BuggyKeyOverwritten behavior
    71  	assert.Equal(t, "", ConfigSectionKeyString(sec, "empty"))
    72  	assert.Equal(t, "", ConfigSectionKeyString(secSub, "empty"))
    73  	assert.Equal(t, "def", ConfigInheritedKey(secSub, "empty").MustString("def"))
    74  	assert.Equal(t, "def", ConfigInheritedKey(secSub, "empty").MustString("xyz"))
    75  	assert.Equal(t, "", ConfigSectionKeyString(sec, "empty"))
    76  	assert.Equal(t, "def", ConfigSectionKeyString(secSub, "empty"))
    77  }
    78  
    79  func TestNewConfigProviderFromFile(t *testing.T) {
    80  	cfg, err := NewConfigProviderFromFile("no-such.ini")
    81  	assert.NoError(t, err)
    82  	assert.True(t, cfg.IsLoadedFromEmpty())
    83  
    84  	// load non-existing file and save
    85  	testFile := t.TempDir() + "/test.ini"
    86  	testFile1 := t.TempDir() + "/test1.ini"
    87  	cfg, err = NewConfigProviderFromFile(testFile)
    88  	assert.NoError(t, err)
    89  
    90  	sec, _ := cfg.NewSection("foo")
    91  	_, _ = sec.NewKey("k1", "a")
    92  	assert.NoError(t, cfg.Save())
    93  	_, _ = sec.NewKey("k2", "b")
    94  	assert.NoError(t, cfg.SaveTo(testFile1))
    95  
    96  	bs, err := os.ReadFile(testFile)
    97  	assert.NoError(t, err)
    98  	assert.Equal(t, "[foo]\nk1 = a\n", string(bs))
    99  
   100  	bs, err = os.ReadFile(testFile1)
   101  	assert.NoError(t, err)
   102  	assert.Equal(t, "[foo]\nk1 = a\nk2 = b\n", string(bs))
   103  
   104  	// load existing file and save
   105  	cfg, err = NewConfigProviderFromFile(testFile)
   106  	assert.NoError(t, err)
   107  	assert.Equal(t, "a", cfg.Section("foo").Key("k1").String())
   108  	sec, _ = cfg.NewSection("bar")
   109  	_, _ = sec.NewKey("k1", "b")
   110  	assert.NoError(t, cfg.Save())
   111  	bs, err = os.ReadFile(testFile)
   112  	assert.NoError(t, err)
   113  	assert.Equal(t, "[foo]\nk1 = a\n\n[bar]\nk1 = b\n", string(bs))
   114  }
   115  
   116  func TestNewConfigProviderForLocale(t *testing.T) {
   117  	// load locale from file
   118  	localeFile := t.TempDir() + "/locale.ini"
   119  	_ = os.WriteFile(localeFile, []byte(`k1=a`), 0o644)
   120  	cfg, err := NewConfigProviderForLocale(localeFile)
   121  	assert.NoError(t, err)
   122  	assert.Equal(t, "a", cfg.Section("").Key("k1").String())
   123  
   124  	// load locale from bytes
   125  	cfg, err = NewConfigProviderForLocale([]byte("k1=foo\nk2=bar"))
   126  	assert.NoError(t, err)
   127  	assert.Equal(t, "foo", cfg.Section("").Key("k1").String())
   128  	cfg, err = NewConfigProviderForLocale([]byte("k1=foo\nk2=bar"), []byte("k2=xxx"))
   129  	assert.NoError(t, err)
   130  	assert.Equal(t, "foo", cfg.Section("").Key("k1").String())
   131  	assert.Equal(t, "xxx", cfg.Section("").Key("k2").String())
   132  }
   133  
   134  func TestDisableSaving(t *testing.T) {
   135  	testFile := t.TempDir() + "/test.ini"
   136  	_ = os.WriteFile(testFile, []byte("k1=a\nk2=b"), 0o644)
   137  	cfg, err := NewConfigProviderFromFile(testFile)
   138  	assert.NoError(t, err)
   139  
   140  	cfg.DisableSaving()
   141  	err = cfg.Save()
   142  	assert.ErrorIs(t, err, errDisableSaving)
   143  
   144  	saveCfg, err := cfg.PrepareSaving()
   145  	assert.NoError(t, err)
   146  
   147  	saveCfg.Section("").Key("k1").MustString("x")
   148  	saveCfg.Section("").Key("k2").SetValue("y")
   149  	saveCfg.Section("").Key("k3").SetValue("z")
   150  	err = saveCfg.Save()
   151  	assert.NoError(t, err)
   152  
   153  	bs, err := os.ReadFile(testFile)
   154  	assert.NoError(t, err)
   155  	assert.Equal(t, "k1 = a\nk2 = y\nk3 = z\n", string(bs))
   156  }