No Description
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.

test_settings_loader.py 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. #
  2. # This file is part of Lodel 2 (https://github.com/OpenEdition)
  3. #
  4. # Copyright (C) 2015-2017 Cléo UMS-3287
  5. #
  6. # This program is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU Affero General Public License as published
  8. # by the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU Affero General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Affero General Public License
  17. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. import unittest
  20. import os.path
  21. from lodel.settings.utils import *
  22. from lodel.plugin.exceptions import *
  23. from lodel.settings.settings_loader import SettingsLoader
  24. from lodel.validator.validator import *
  25. #A dummy validator that only returns the value
  26. def dummy_validator(value): return value
  27. #A dummy validator that always fails
  28. def dummy_validator_fails(value): raise ValueError("Fake validation error")
  29. def write_list_validator(value):
  30. res = ''
  31. errors = list()
  32. for elt in value:
  33. res += dummy_validator(elt) + ','
  34. return res[:len(res)-1]
  35. class SettingsLoaderTestCase(unittest.TestCase):
  36. def test_merge_getsection(self):
  37. """Tests merge and getSection functions """
  38. settings = SettingsLoader('tests/settings/settings_examples/conf.d')
  39. def maFonction(a):
  40. return a
  41. e=settings.getoption('lodel2.A','a',maFonction)
  42. self.assertEqual(e,'a1')
  43. f=settings.getoption('lodel2.B','bb',maFonction)
  44. self.assertEqual(f,"bj,kl,mn")
  45. g=settings.getremains()
  46. self.assertIsNotNone(g)
  47. e=settings.getoption('lodel2.A','b',maFonction)
  48. e=settings.getoption('lodel2.A','c',maFonction)
  49. e=settings.getoption('lodel2.A','fhui',maFonction)
  50. f=settings.getoption('lodel2.B','ab',maFonction)
  51. f=settings.getoption('lodel2.B','cb',maFonction)
  52. f=settings.getoption('lodel2.C','cb',maFonction)
  53. f=settings.getoption('lodel2.C','ca',maFonction)
  54. f=settings.getoption('lodel2.C','cc',maFonction)
  55. f=settings.getoption('lodel2.C','a',maFonction)
  56. f=settings.getoption('lodel2.A.e','a',maFonction)
  57. f=settings.getoption('lodel2.A.e','titi',maFonction)
  58. g=settings.getremains()
  59. self.assertEqual(len(g),0)
  60. with self.assertRaises(SettingsError):
  61. loader = SettingsLoader('tests/settings/settings_examples/conf_raise.d')
  62. def test_merge(self):
  63. """ Test merge of multiple configuration files """
  64. loader = SettingsLoader('tests/settings/settings_examples/merge.conf.d')
  65. for value in ('a','b','c','d','e','f'):
  66. self.assertEqual(loader.getoption('lodel2', value, dummy_validator), value)
  67. self.assertEqual(loader.getoption('lodel2.othersection', value, dummy_validator), value)
  68. def test_merge_conflict(self):
  69. """ Test merge fails because of duplicated keys """
  70. with self.assertRaises(SettingsError):
  71. loader = SettingsLoader('tests/settings/settings_examples/bad_merge.conf.d')
  72. def test_getoption_simple(self):
  73. """ Testing behavior of getoption """
  74. loader = SettingsLoader('tests/settings/settings_examples/simple.conf.d')
  75. value = loader.getoption('lodel2.foo.bar', 'foo', dummy_validator)
  76. self.assertEqual(value, "42")
  77. value = loader.getoption('lodel2.foo.bar', 'foobar', dummy_validator)
  78. self.assertEqual(value, "hello world")
  79. value = loader.getoption('lodel2.foo.bar', 'foo_bar', dummy_validator)
  80. self.assertEqual(value, "foobar")
  81. value = loader.getoption('lodel2.foo.bar', 'foo.bar', dummy_validator)
  82. self.assertEqual(value, "barfoo")
  83. def test_getoption_multiple_time(self):
  84. """ Testing the behavior when doing 2 time the same call to getoption """
  85. loader = SettingsLoader('tests/settings/settings_examples/simple.conf.d')
  86. value = loader.getoption('lodel2.foo.bar', 'foo', dummy_validator)
  87. value = loader.getoption('lodel2.foo.bar', 'foo', dummy_validator)
  88. value = loader.getoption('lodel2.foo.bar', 'foo', dummy_validator)
  89. value = loader.getoption('lodel2.foo.bar', 'foo', dummy_validator)
  90. def test_geoption_default_value(self):
  91. """ Testing behavior of default value in getoption """
  92. loader = SettingsLoader('tests/settings/settings_examples/simple.conf.d')
  93. # for non existing keys in file
  94. value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator, 'hello 42')
  95. self.assertEqual(value, 'hello 42')
  96. # for non existing section in file
  97. value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator, 'hello 42')
  98. self.assertEqual(value, 'hello 42')
  99. def test_geoption_invalid_default_value(self):
  100. """ Testing the behavior when the default value is invalid """
  101. loader = SettingsLoader('tests/settings/settings_examples/simple.conf.d')
  102. mandatory_validator = Validator('string', none_is_valid=False)
  103. with self.assertRaises(SettingsErrors):
  104. value = loader.getoption(
  105. 'lodel2.foo.bar', 'foofoofooDEFAULT', mandatory_validator)
  106. loader.raise_errors()
  107. def test_getoption_complex(self):
  108. """ Testing behavior of getoption with less simple files & confs """
  109. expected = {
  110. 'lodel2.editorialmodel': {
  111. 'lib_path': '/tmp',
  112. 'foo_bar': '42',
  113. 'foo.bar': '1337',
  114. 'example': 'foobar',
  115. },
  116. 'lodel2.conf1': {
  117. 'conf_key': 'woot',
  118. 'conf_value': '42',
  119. },
  120. 'lodel2.conf2': {
  121. 'conf_foo': 'bar',
  122. },
  123. 'lodel2.foo.foo': {
  124. 'foobar': 'barfoo',
  125. },
  126. 'lodel2.bar.foo': {
  127. 'foobar': 'barfoo',
  128. 'barfoo': '42',
  129. },
  130. 'lodel2.bar.bar': {
  131. 'toto': 'tata',
  132. }
  133. }
  134. loader = SettingsLoader('tests/settings/settings_examples/complex.conf.d')
  135. for section in expected:
  136. for key, expected_value in expected[section].items():
  137. value = loader.getoption( section,
  138. key,
  139. dummy_validator)
  140. self.assertEqual(value, expected_value)
  141. def test_variable_sections(self):
  142. """ Testing variable section recognition """
  143. loader = SettingsLoader('tests/settings/settings_examples/var_sections.conf.d')
  144. sections = loader.getsection('lodel2.tests')
  145. self.assertEqual( set(sections),
  146. set(( 'lodel2.tests.section1',
  147. 'lodel2.tests.section2')))
  148. def test_variable_sections_default(self):
  149. """ Testing variable section default value handling """
  150. loader = SettingsLoader('tests/settings/settings_examples/var_sections.conf.d')
  151. sections = loader.getsection('lodel2.notexisting', 'foobar')
  152. self.assertEqual(set(sections), set(('lodel2.notexisting.foobar',)))
  153. def test_variable_sections_fails(self):
  154. """ Testing behavior when no default section given for a non existing variable section """
  155. loader = SettingsLoader('tests/settings/settings_examples/var_sections.conf.d')
  156. with self.assertRaises(NameError):
  157. sections = loader.getsection('lodel2.notexisting')
  158. def test_remains(self):
  159. """ Testing the remains method of SettingsLoader """
  160. loader = SettingsLoader('tests/settings/settings_examples/remains.conf.d')
  161. values = {
  162. 'lodel2.section': [ chr(i) for i in range(ord('a'), ord('f')) ],
  163. 'lodel2.othersection': [ chr(i) for i in range(ord('a'), ord('f')) ],
  164. }
  165. expt_rem = []
  166. for section in values:
  167. for val in values[section]:
  168. expt_rem.append('%s:%s' % (section, val))
  169. self.assertEqual(sorted(expt_rem), sorted(loader.getremains().keys()))
  170. for section in values:
  171. for val in values[section]:
  172. loader.getoption(section, val, dummy_validator)
  173. expt_rem.remove('%s:%s' % (section, val))
  174. self.assertEqual( sorted(expt_rem),
  175. sorted(loader.getremains().keys()))
  176. def test_setoption(self):
  177. loader=SettingsLoader('tests/settings/settings_examples/conf_set.d')
  178. loader.setoption('lodel2.A','fhui','test ok',dummy_validator)
  179. loader=SettingsLoader('tests/settings/settings_examples/conf_set.d')
  180. option=loader.getoption('lodel2.A','fhui',dummy_validator)
  181. self.assertEqual(option,'test ok')
  182. loader.setoption('lodel2.A','fhui','retour',dummy_validator)
  183. loader=SettingsLoader('tests/settings/settings_examples/conf_set.d')
  184. option=loader.getoption('lodel2.A','fhui',dummy_validator)
  185. self.assertEqual(option,'retour')
  186. cblist=('test ok1','test ok2','test ok3')
  187. loader.setoption('lodel2.C','cb',cblist,write_list_validator)
  188. loader=SettingsLoader('tests/settings/settings_examples/conf_set.d')
  189. option=loader.getoption('lodel2.C','cb',dummy_validator)
  190. self.assertEqual(option,'test ok1,test ok2,test ok3')
  191. cblist=('b4','b2','b3')
  192. loader.setoption('lodel2.C','cb',cblist,write_list_validator)
  193. loader=SettingsLoader('tests/settings/settings_examples/conf_set.d')
  194. option=loader.getoption('lodel2.C','cb',dummy_validator)
  195. self.assertEqual(option,'b4,b2,b3')
  196. def test_saveconf(self):
  197. loader=SettingsLoader('tests/settings/settings_examples/conf_save.d')
  198. newsec=dict()
  199. newsec['lodel2.A'] = dict()
  200. newsec['lodel2.A']['fhui'] = 'test ok'
  201. newsec['lodel2.A']['c'] = 'test ok'
  202. newsec['lodel2.A.e'] = dict()
  203. newsec['lodel2.A.e']['a'] = 'test ok'
  204. validators = dict()
  205. validators['lodel2.A'] = dict()
  206. validators['lodel2.A']['fhui'] = dummy_validator
  207. validators['lodel2.A']['c'] = dummy_validator
  208. validators['lodel2.A.e'] = dict()
  209. validators['lodel2.A.e']['a'] = dummy_validator
  210. loader.saveconf(newsec,validators)
  211. loader=SettingsLoader('tests/settings/settings_examples/conf_save.d')
  212. option=loader.getoption('lodel2.A','fhui',dummy_validator)
  213. self.assertEqual(option,'test ok')
  214. option=loader.getoption('lodel2.A','c',dummy_validator)
  215. self.assertEqual(option,'test ok')
  216. option=loader.getoption('lodel2.A.e','a',dummy_validator)
  217. self.assertEqual(option,'test ok')
  218. newsec['lodel2.A']['fhui']='retour'
  219. newsec['lodel2.A']['c']='toto'
  220. newsec['lodel2.A.e']['a']='ft'
  221. loader.saveconf(newsec,validators)
  222. loader=SettingsLoader('tests/settings/settings_examples/conf_save.d')
  223. option=loader.getoption('lodel2.A','fhui',dummy_validator)
  224. self.assertEqual(option,'retour')
  225. option=loader.getoption('lodel2.A','c',dummy_validator)
  226. self.assertEqual(option,'toto')
  227. option=loader.getoption('lodel2.A.e','a',dummy_validator)
  228. self.assertEqual(option,'ft')
  229. def test_setoption_default_value(self):
  230. loader = SettingsLoader('tests/settings/settings_examples/conf_setdef.d')
  231. # for non existing keys in file
  232. value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator, 'hello 42')
  233. self.assertEqual(value, 'hello 42')
  234. # for non existing section in file
  235. value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator, 'hello 42')
  236. self.assertEqual(value, 'hello 42')
  237. loader.setoption('lodel2.foo.bar', 'foofoofoo', 'test ok', dummy_validator)
  238. loader.setoption('lodel2.foofoo', 'foofoofoo', 'test ok', dummy_validator)
  239. self.assertTrue(os.path.isfile('tests/settings/settings_examples/conf_setdef.d/generated.ini'))
  240. loader = SettingsLoader('tests/settings/settings_examples/conf_setdef.d')
  241. value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator)
  242. self.assertEqual(value, 'test ok')
  243. value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator)
  244. self.assertEqual(value, 'test ok')
  245. os.remove('tests/settings/settings_examples/conf_setdef.d/generated.ini')