2
0

test_legacy.py 7.3 KB

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