test_config.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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('has_option').with_args('section', 'foo').and_return(True)
  127. parser.should_receive('has_option').with_args('section', 'bar').and_return(True)
  128. section_format = module.Section_format(
  129. 'section',
  130. (
  131. module.Config_option('foo', str, required=True),
  132. module.Config_option('bar', int, required=True),
  133. ),
  134. )
  135. config = module.parse_section_options(parser, section_format)
  136. assert config == OrderedDict(
  137. (
  138. ('foo', 'value'),
  139. ('bar', 1),
  140. )
  141. )
  142. def test_parse_section_options_for_missing_section_should_return_empty_dict():
  143. parser = flexmock()
  144. parser.should_receive('get').never()
  145. parser.should_receive('getint').never()
  146. parser.should_receive('has_option').with_args('section', 'foo').and_return(False)
  147. parser.should_receive('has_option').with_args('section', 'bar').and_return(False)
  148. section_format = module.Section_format(
  149. 'section',
  150. (
  151. module.Config_option('foo', str, required=False),
  152. module.Config_option('bar', int, required=False),
  153. ),
  154. )
  155. config = module.parse_section_options(parser, section_format)
  156. assert config == OrderedDict()
  157. def insert_mock_parser():
  158. parser = flexmock()
  159. parser.should_receive('read')
  160. module.RawConfigParser = lambda: parser
  161. return parser
  162. def test_parse_configuration_should_return_section_configs():
  163. parser = insert_mock_parser()
  164. config_format = (flexmock(name='items'), flexmock(name='things'))
  165. mock_module = flexmock(module)
  166. mock_module.should_receive('validate_configuration_format').with_args(
  167. parser, config_format,
  168. ).once()
  169. mock_section_configs = (flexmock(), flexmock())
  170. for section_format, section_config in zip(config_format, mock_section_configs):
  171. mock_module.should_receive('parse_section_options').with_args(
  172. parser, section_format,
  173. ).and_return(section_config).once()
  174. parsed_config = module.parse_configuration('filename', config_format)
  175. assert parsed_config == type(parsed_config)(*mock_section_configs)