test_validate.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import pytest
  2. from flexmock import flexmock
  3. from borgmatic.config import validate as module
  4. def test_validation_error_str_contains_error_messages_and_config_filename():
  5. error = module.Validation_error('config.yaml', ('oops', 'uh oh'))
  6. result = str(error)
  7. assert 'config.yaml' in result
  8. assert 'oops' in result
  9. assert 'uh oh' in result
  10. def test_apply_logical_validation_raises_if_archive_name_format_present_without_prefix():
  11. with pytest.raises(module.Validation_error):
  12. module.apply_logical_validation(
  13. 'config.yaml',
  14. {
  15. 'storage': {'archive_name_format': '{hostname}-{now}'},
  16. 'retention': {'keep_daily': 7},
  17. },
  18. )
  19. def test_apply_logical_validation_raises_if_archive_name_format_present_without_retention_prefix():
  20. with pytest.raises(module.Validation_error):
  21. module.apply_logical_validation(
  22. 'config.yaml',
  23. {
  24. 'storage': {'archive_name_format': '{hostname}-{now}'},
  25. 'retention': {'keep_daily': 7},
  26. 'consistency': {'prefix': '{hostname}-'},
  27. },
  28. )
  29. def test_apply_logical_validation_warns_if_archive_name_format_present_without_consistency_prefix():
  30. logger = flexmock(module.logger)
  31. logger.should_receive('warning').once()
  32. module.apply_logical_validation(
  33. 'config.yaml',
  34. {
  35. 'storage': {'archive_name_format': '{hostname}-{now}'},
  36. 'retention': {'prefix': '{hostname}-'},
  37. 'consistency': {},
  38. },
  39. )
  40. def test_apply_locical_validation_raises_if_unknown_repository_in_check_repositories():
  41. with pytest.raises(module.Validation_error):
  42. module.apply_logical_validation(
  43. 'config.yaml',
  44. {
  45. 'location': {'repositories': ['repo.borg', 'other.borg']},
  46. 'retention': {'keep_secondly': 1000},
  47. 'consistency': {'check_repositories': ['repo.borg', 'unknown.borg']},
  48. },
  49. )
  50. def test_apply_locical_validation_does_not_raise_if_known_repository_in_check_repositories():
  51. module.apply_logical_validation(
  52. 'config.yaml',
  53. {
  54. 'location': {'repositories': ['repo.borg', 'other.borg']},
  55. 'retention': {'keep_secondly': 1000},
  56. 'consistency': {'check_repositories': ['repo.borg']},
  57. },
  58. )
  59. def test_apply_logical_validation_does_not_raise_or_warn_if_archive_name_format_and_prefix_present():
  60. logger = flexmock(module.logger)
  61. logger.should_receive('warning').never()
  62. module.apply_logical_validation(
  63. 'config.yaml',
  64. {
  65. 'storage': {'archive_name_format': '{hostname}-{now}'},
  66. 'retention': {'prefix': '{hostname}-'},
  67. 'consistency': {'prefix': '{hostname}-'},
  68. },
  69. )
  70. def test_apply_logical_validation_does_not_raise_otherwise():
  71. module.apply_logical_validation('config.yaml', {'retention': {'keep_secondly': 1000}})
  72. def test_guard_configuration_contains_repository_does_not_raise_when_repository_in_config():
  73. module.guard_configuration_contains_repository(
  74. repository='repo', configurations={'config.yaml': {'location': {'repositories': ['repo']}}}
  75. )
  76. def test_guard_configuration_contains_repository_does_not_raise_when_repository_not_given():
  77. module.guard_configuration_contains_repository(
  78. repository=None, configurations={'config.yaml': {'location': {'repositories': ['repo']}}}
  79. )
  80. def test_guard_configuration_contains_repository_errors_when_repository_assumed_to_match_config_twice():
  81. with pytest.raises(ValueError):
  82. module.guard_configuration_contains_repository(
  83. repository=None,
  84. configurations={'config.yaml': {'location': {'repositories': ['repo', 'repo2']}}},
  85. )
  86. def test_guard_configuration_contains_repository_errors_when_repository_missing_from_config():
  87. with pytest.raises(ValueError):
  88. module.guard_configuration_contains_repository(
  89. repository='nope',
  90. configurations={'config.yaml': {'location': {'repositories': ['repo', 'repo2']}}},
  91. )
  92. def test_guard_configuration_contains_repository_errors_when_repository_matches_config_twice():
  93. with pytest.raises(ValueError):
  94. module.guard_configuration_contains_repository(
  95. repository='repo',
  96. configurations={
  97. 'config.yaml': {'location': {'repositories': ['repo', 'repo2']}},
  98. 'other.yaml': {'location': {'repositories': ['repo']}},
  99. },
  100. )