test_bootstrap.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import sys
  2. from flexmock import flexmock
  3. from borgmatic.hooks.data_source import bootstrap as module
  4. def test_dump_data_sources_creates_manifest_file():
  5. flexmock(module.os).should_receive('makedirs')
  6. flexmock(module.importlib.metadata).should_receive('version').and_return('1.0.0')
  7. manifest_file = flexmock(
  8. __enter__=lambda *args: flexmock(write=lambda *args: None, close=lambda *args: None),
  9. __exit__=lambda *args: None,
  10. )
  11. flexmock(sys.modules['builtins']).should_receive('open').with_args(
  12. '/run/borgmatic/bootstrap/manifest.json',
  13. 'w',
  14. encoding='utf-8',
  15. ).and_return(manifest_file)
  16. flexmock(module.json).should_receive('dump').with_args(
  17. {'borgmatic_version': '1.0.0', 'config_paths': ('test.yaml',)},
  18. manifest_file,
  19. ).once()
  20. flexmock(module.borgmatic.hooks.data_source.config).should_receive('inject_pattern').with_args(
  21. object,
  22. module.borgmatic.borg.pattern.Pattern(
  23. '/run/borgmatic/bootstrap', source=module.borgmatic.borg.pattern.Pattern_source.HOOK
  24. ),
  25. ).once()
  26. flexmock(module.borgmatic.hooks.data_source.config).should_receive('inject_pattern').with_args(
  27. object,
  28. module.borgmatic.borg.pattern.Pattern(
  29. 'test.yaml', source=module.borgmatic.borg.pattern.Pattern_source.HOOK
  30. ),
  31. ).once()
  32. module.dump_data_sources(
  33. hook_config=None,
  34. config={},
  35. config_paths=('test.yaml',),
  36. borgmatic_runtime_directory='/run/borgmatic',
  37. patterns=[],
  38. dry_run=False,
  39. )
  40. def test_dump_data_sources_with_store_config_files_false_does_not_create_manifest_file():
  41. flexmock(module.os).should_receive('makedirs').never()
  42. flexmock(module.json).should_receive('dump').never()
  43. flexmock(module.borgmatic.hooks.data_source.config).should_receive('inject_pattern').never()
  44. hook_config = {'store_config_files': False}
  45. module.dump_data_sources(
  46. hook_config=hook_config,
  47. config={'bootstrap': hook_config},
  48. config_paths=('test.yaml',),
  49. borgmatic_runtime_directory='/run/borgmatic',
  50. patterns=[],
  51. dry_run=True,
  52. )
  53. def test_dump_data_sources_with_dry_run_does_not_create_manifest_file():
  54. flexmock(module.os).should_receive('makedirs').never()
  55. flexmock(module.json).should_receive('dump').never()
  56. flexmock(module.borgmatic.hooks.data_source.config).should_receive('inject_pattern').never()
  57. module.dump_data_sources(
  58. hook_config=None,
  59. config={},
  60. config_paths=('test.yaml',),
  61. borgmatic_runtime_directory='/run/borgmatic',
  62. patterns=[],
  63. dry_run=True,
  64. )
  65. def test_remove_data_source_dumps_deletes_manifest_and_parent_directory():
  66. flexmock(module.borgmatic.config.paths).should_receive(
  67. 'replace_temporary_subdirectory_with_glob',
  68. ).and_return('/run/borgmatic')
  69. flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
  70. flexmock(module.os).should_receive('remove').with_args(
  71. '/run/borgmatic/bootstrap/manifest.json',
  72. ).once()
  73. flexmock(module.os).should_receive('rmdir').with_args('/run/borgmatic/bootstrap').once()
  74. module.remove_data_source_dumps(
  75. hook_config=None,
  76. config={},
  77. borgmatic_runtime_directory='/run/borgmatic',
  78. patterns=flexmock(),
  79. dry_run=False,
  80. )
  81. def test_remove_data_source_dumps_with_dry_run_bails():
  82. flexmock(module.borgmatic.config.paths).should_receive(
  83. 'replace_temporary_subdirectory_with_glob',
  84. ).and_return('/run/borgmatic')
  85. flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
  86. flexmock(module.os).should_receive('remove').never()
  87. flexmock(module.os).should_receive('rmdir').never()
  88. module.remove_data_source_dumps(
  89. hook_config=None,
  90. config={},
  91. borgmatic_runtime_directory='/run/borgmatic',
  92. patterns=flexmock(),
  93. dry_run=True,
  94. )
  95. def test_remove_data_source_dumps_swallows_manifest_file_not_found_error():
  96. flexmock(module.borgmatic.config.paths).should_receive(
  97. 'replace_temporary_subdirectory_with_glob',
  98. ).and_return('/run/borgmatic')
  99. flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
  100. flexmock(module.os).should_receive('remove').with_args(
  101. '/run/borgmatic/bootstrap/manifest.json',
  102. ).and_raise(FileNotFoundError).once()
  103. flexmock(module.os).should_receive('rmdir').with_args('/run/borgmatic/bootstrap').once()
  104. module.remove_data_source_dumps(
  105. hook_config=None,
  106. config={},
  107. borgmatic_runtime_directory='/run/borgmatic',
  108. patterns=flexmock(),
  109. dry_run=False,
  110. )
  111. def test_remove_data_source_dumps_swallows_manifest_parent_directory_not_found_error():
  112. flexmock(module.borgmatic.config.paths).should_receive(
  113. 'replace_temporary_subdirectory_with_glob',
  114. ).and_return('/run/borgmatic')
  115. flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
  116. flexmock(module.os).should_receive('remove').with_args(
  117. '/run/borgmatic/bootstrap/manifest.json',
  118. ).once()
  119. flexmock(module.os).should_receive('rmdir').with_args('/run/borgmatic/bootstrap').and_raise(
  120. FileNotFoundError,
  121. ).once()
  122. module.remove_data_source_dumps(
  123. hook_config=None,
  124. config={},
  125. borgmatic_runtime_directory='/run/borgmatic',
  126. patterns=flexmock(),
  127. dry_run=False,
  128. )