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 }