test_config.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. from collections import OrderedDict
  2. from flexmock import flexmock
  3. from nose.tools import assert_raises
  4. from atticmatic import config as module
  5. def test_option_should_create_config_option():
  6. option = module.option('name', bool, required=False)
  7. assert option == module.Config_option('name', bool, False)
  8. def test_option_should_create_config_option_with_defaults():
  9. option = module.option('name')
  10. assert option == module.Config_option('name', str, True)
  11. def test_validate_configuration_format_with_valid_config_should_not_raise():
  12. parser = flexmock()
  13. parser.should_receive('sections').and_return(('section', 'other'))
  14. parser.should_receive('options').with_args('section').and_return(('stuff',))
  15. parser.should_receive('options').with_args('other').and_return(('such',))
  16. config_format = (
  17. module.Section_format(
  18. 'section',
  19. options=(
  20. module.Config_option('stuff', str, required=True),
  21. ),
  22. ),
  23. module.Section_format(
  24. 'other',
  25. options=(
  26. module.Config_option('such', str, required=True),
  27. ),
  28. ),
  29. )
  30. module.validate_configuration_format(parser, config_format)
  31. def test_validate_configuration_format_with_missing_required_section_should_raise():
  32. parser = flexmock()
  33. parser.should_receive('sections').and_return(('section',))
  34. config_format = (
  35. module.Section_format(
  36. 'section',
  37. options=(
  38. module.Config_option('stuff', str, required=True),
  39. ),
  40. ),
  41. # At least one option in this section is required, so the section is required.
  42. module.Section_format(
  43. 'missing',
  44. options=(
  45. module.Config_option('such', str, required=False),
  46. module.Config_option('things', str, required=True),
  47. ),
  48. ),
  49. )
  50. with assert_raises(ValueError):
  51. module.validate_configuration_format(parser, config_format)
  52. def test_validate_configuration_format_with_missing_optional_section_should_not_raise():
  53. parser = flexmock()
  54. parser.should_receive('sections').and_return(('section',))
  55. parser.should_receive('options').with_args('section').and_return(('stuff',))
  56. config_format = (
  57. module.Section_format(
  58. 'section',
  59. options=(
  60. module.Config_option('stuff', str, required=True),
  61. ),
  62. ),
  63. # No options in the section are required, so the section is optional.
  64. module.Section_format(
  65. 'missing',
  66. options=(
  67. module.Config_option('such', str, required=False),
  68. module.Config_option('things', str, required=False),
  69. ),
  70. ),
  71. )
  72. module.validate_configuration_format(parser, config_format)
  73. def test_validate_configuration_format_with_unknown_section_should_raise():
  74. parser = flexmock()
  75. parser.should_receive('sections').and_return(('section', 'extra'))
  76. config_format = (
  77. module.Section_format('section', options=()),
  78. )
  79. with assert_raises(ValueError):
  80. module.validate_configuration_format(parser, config_format)
  81. def test_validate_configuration_format_with_missing_required_option_should_raise():
  82. parser = flexmock()
  83. parser.should_receive('sections').and_return(('section',))
  84. parser.should_receive('options').with_args('section').and_return(('option',))
  85. config_format = (
  86. module.Section_format(
  87. 'section',
  88. options=(
  89. module.Config_option('option', str, required=True),
  90. module.Config_option('missing', str, required=True),
  91. ),
  92. ),
  93. )
  94. with assert_raises(ValueError):
  95. module.validate_configuration_format(parser, config_format)
  96. def test_validate_configuration_format_with_missing_optional_option_should_not_raise():
  97. parser = flexmock()
  98. parser.should_receive('sections').and_return(('section',))
  99. parser.should_receive('options').with_args('section').and_return(('option',))
  100. config_format = (
  101. module.Section_format(
  102. 'section',
  103. options=(
  104. module.Config_option('option', str, required=True),
  105. module.Config_option('missing', str, required=False),
  106. ),
  107. ),
  108. )
  109. module.validate_configuration_format(parser, config_format)
  110. def test_validate_configuration_format_with_extra_option_should_raise():
  111. parser = flexmock()
  112. parser.should_receive('sections').and_return(('section',))
  113. parser.should_receive('options').with_args('section').and_return(('option', 'extra'))
  114. config_format = (
  115. module.Section_format(
  116. 'section',
  117. options=(module.Config_option('option', str, required=True),),
  118. ),
  119. )
  120. with assert_raises(ValueError):
  121. module.validate_configuration_format(parser, config_format)
  122. def test_parse_section_options_should_return_section_options():
  123. parser = flexmock()
  124. parser.should_receive('get').with_args('section', 'foo').and_return('value')
  125. parser.should_receive('getint').with_args('section', 'bar').and_return(1)
  126. parser.should_receive('getboolean').never()
  127. parser.should_receive('has_option').with_args('section', 'foo').and_return(True)
  128. parser.should_receive('has_option').with_args('section', 'bar').and_return(True)
  129. section_format = module.Section_format(
  130. 'section',
  131. (
  132. module.Config_option('foo', str, required=True),
  133. module.Config_option('bar', int, required=True),
  134. ),
  135. )
  136. config = module.parse_section_options(parser, section_format)
  137. assert config == OrderedDict(
  138. (
  139. ('foo', 'value'),
  140. ('bar', 1),
  141. )
  142. )
  143. def test_parse_section_options_for_missing_section_should_return_empty_dict():
  144. parser = flexmock()
  145. parser.should_receive('get').never()
  146. parser.should_receive('getint').never()
  147. parser.should_receive('getboolean').never()
  148. parser.should_receive('has_option').with_args('section', 'foo').and_return(False)
  149. parser.should_receive('has_option').with_args('section', 'bar').and_return(False)
  150. section_format = module.Section_format(
  151. 'section',
  152. (
  153. module.Config_option('foo', str, required=False),
  154. module.Config_option('bar', int, required=False),
  155. ),
  156. )
  157. config = module.parse_section_options(parser, section_format)
  158. assert config == OrderedDict()
  159. def insert_mock_parser():
  160. parser = flexmock()
  161. parser.should_receive('read').and_return([flexmock()])
  162. module.RawConfigParser = lambda: parser
  163. return parser
  164. def test_parse_configuration_should_return_section_configs():
  165. parser = insert_mock_parser()
  166. config_format = (flexmock(name='items'), flexmock(name='things'))
  167. mock_module = flexmock(module)
  168. mock_module.should_receive('validate_configuration_format').with_args(
  169. parser, config_format,
  170. ).once()
  171. mock_section_configs = (flexmock(), flexmock())
  172. for section_format, section_config in zip(config_format, mock_section_configs):
  173. mock_module.should_receive('parse_section_options').with_args(
  174. parser, section_format,
  175. ).and_return(section_config).once()
  176. parsed_config = module.parse_configuration('filename', config_format)
  177. assert parsed_config == type(parsed_config)(*mock_section_configs)
  178. def test_parse_configuration_with_file_open_error_should_raise():
  179. parser = insert_mock_parser()
  180. parser.should_receive('read').and_return([])
  181. with assert_raises(ValueError):
  182. module.parse_configuration('filename', config_format=flexmock())