選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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. }