You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

config_provider_test.go 4.7KB

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