test_export_key.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import logging
  2. import pytest
  3. from flexmock import flexmock
  4. import borgmatic.logger
  5. from borgmatic.borg import export_key as module
  6. from ..test_verbosity import insert_logging_mock
  7. def insert_execute_command_mock(
  8. command, output_file=module.DO_NOT_CAPTURE, working_directory=None, borg_exit_codes=None
  9. ):
  10. borgmatic.logger.add_custom_log_levels()
  11. flexmock(module.environment).should_receive('make_environment')
  12. flexmock(module.borgmatic.config.paths).should_receive('get_working_directory').and_return(
  13. working_directory,
  14. )
  15. flexmock(module).should_receive('execute_command').with_args(
  16. command,
  17. output_file=output_file,
  18. output_log_level=module.logging.ANSWER,
  19. environment=None,
  20. working_directory=working_directory,
  21. borg_local_path=command[0],
  22. borg_exit_codes=borg_exit_codes,
  23. ).once()
  24. def test_export_key_calls_borg_with_required_flags():
  25. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  26. flexmock(module.os.path).should_receive('exists').never()
  27. insert_execute_command_mock(('borg', 'key', 'export', 'repo'))
  28. module.export_key(
  29. repository_path='repo',
  30. config={},
  31. local_borg_version='1.2.3',
  32. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  33. global_arguments=flexmock(dry_run=False),
  34. )
  35. def test_export_key_calls_borg_with_local_path():
  36. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  37. flexmock(module.os.path).should_receive('exists').never()
  38. insert_execute_command_mock(('borg1', 'key', 'export', 'repo'))
  39. module.export_key(
  40. repository_path='repo',
  41. config={},
  42. local_borg_version='1.2.3',
  43. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  44. global_arguments=flexmock(dry_run=False),
  45. local_path='borg1',
  46. )
  47. def test_export_key_calls_borg_using_exit_codes():
  48. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  49. flexmock(module.os.path).should_receive('exists').never()
  50. borg_exit_codes = flexmock()
  51. insert_execute_command_mock(('borg', 'key', 'export', 'repo'), borg_exit_codes=borg_exit_codes)
  52. module.export_key(
  53. repository_path='repo',
  54. config={'borg_exit_codes': borg_exit_codes},
  55. local_borg_version='1.2.3',
  56. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  57. global_arguments=flexmock(dry_run=False),
  58. )
  59. def test_export_key_calls_borg_with_remote_path_flags():
  60. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  61. flexmock(module.os.path).should_receive('exists').never()
  62. insert_execute_command_mock(('borg', 'key', 'export', '--remote-path', 'borg1', 'repo'))
  63. module.export_key(
  64. repository_path='repo',
  65. config={},
  66. local_borg_version='1.2.3',
  67. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  68. global_arguments=flexmock(dry_run=False),
  69. remote_path='borg1',
  70. )
  71. def test_export_key_calls_borg_with_umask_flags():
  72. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  73. flexmock(module.os.path).should_receive('exists').never()
  74. insert_execute_command_mock(('borg', 'key', 'export', '--umask', '0770', 'repo'))
  75. module.export_key(
  76. repository_path='repo',
  77. config={'umask': '0770'},
  78. local_borg_version='1.2.3',
  79. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  80. global_arguments=flexmock(dry_run=False),
  81. )
  82. def test_export_key_calls_borg_with_log_json_flags():
  83. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  84. flexmock(module.os.path).should_receive('exists').never()
  85. insert_execute_command_mock(('borg', 'key', 'export', '--log-json', 'repo'))
  86. module.export_key(
  87. repository_path='repo',
  88. config={'log_json': True},
  89. local_borg_version='1.2.3',
  90. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  91. global_arguments=flexmock(dry_run=False),
  92. )
  93. def test_export_key_calls_borg_with_lock_wait_flags():
  94. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  95. flexmock(module.os.path).should_receive('exists').never()
  96. insert_execute_command_mock(('borg', 'key', 'export', '--lock-wait', '5', 'repo'))
  97. module.export_key(
  98. repository_path='repo',
  99. config={'lock_wait': '5'},
  100. local_borg_version='1.2.3',
  101. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  102. global_arguments=flexmock(dry_run=False),
  103. )
  104. def test_export_key_with_log_info_calls_borg_with_info_parameter():
  105. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  106. flexmock(module.os.path).should_receive('exists').never()
  107. insert_execute_command_mock(('borg', 'key', 'export', '--info', 'repo'))
  108. insert_logging_mock(logging.INFO)
  109. module.export_key(
  110. repository_path='repo',
  111. config={},
  112. local_borg_version='1.2.3',
  113. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  114. global_arguments=flexmock(dry_run=False),
  115. )
  116. def test_export_key_with_log_debug_calls_borg_with_debug_flags():
  117. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  118. flexmock(module.os.path).should_receive('exists').never()
  119. insert_execute_command_mock(('borg', 'key', 'export', '--debug', '--show-rc', 'repo'))
  120. insert_logging_mock(logging.DEBUG)
  121. module.export_key(
  122. repository_path='repo',
  123. config={},
  124. local_borg_version='1.2.3',
  125. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  126. global_arguments=flexmock(dry_run=False),
  127. )
  128. def test_export_key_calls_borg_with_paper_flags():
  129. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  130. flexmock(module.os.path).should_receive('exists').never()
  131. insert_execute_command_mock(('borg', 'key', 'export', '--paper', 'repo'))
  132. module.export_key(
  133. repository_path='repo',
  134. config={},
  135. local_borg_version='1.2.3',
  136. export_arguments=flexmock(paper=True, qr_html=False, path=None),
  137. global_arguments=flexmock(dry_run=False),
  138. )
  139. def test_export_key_calls_borg_with_paper_flag():
  140. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  141. flexmock(module.os.path).should_receive('exists').never()
  142. insert_execute_command_mock(('borg', 'key', 'export', '--paper', 'repo'))
  143. module.export_key(
  144. repository_path='repo',
  145. config={},
  146. local_borg_version='1.2.3',
  147. export_arguments=flexmock(paper=True, qr_html=False, path=None),
  148. global_arguments=flexmock(dry_run=False),
  149. )
  150. def test_export_key_calls_borg_with_qr_html_flag():
  151. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  152. flexmock(module.os.path).should_receive('exists').never()
  153. insert_execute_command_mock(('borg', 'key', 'export', '--qr-html', 'repo'))
  154. module.export_key(
  155. repository_path='repo',
  156. config={},
  157. local_borg_version='1.2.3',
  158. export_arguments=flexmock(paper=False, qr_html=True, path=None),
  159. global_arguments=flexmock(dry_run=False),
  160. )
  161. def test_export_key_calls_borg_with_path_argument():
  162. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  163. flexmock(module.os.path).should_receive('exists').with_args('dest').and_return(False)
  164. insert_execute_command_mock(('borg', 'key', 'export', 'repo', 'dest'), output_file=None)
  165. module.export_key(
  166. repository_path='repo',
  167. config={},
  168. local_borg_version='1.2.3',
  169. export_arguments=flexmock(paper=False, qr_html=False, path='dest'),
  170. global_arguments=flexmock(dry_run=False),
  171. )
  172. def test_export_key_with_already_existent_path_raises():
  173. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  174. flexmock(module.os.path).should_receive('exists').and_return(True)
  175. flexmock(module).should_receive('execute_command').never()
  176. with pytest.raises(FileExistsError):
  177. module.export_key(
  178. repository_path='repo',
  179. config={},
  180. local_borg_version='1.2.3',
  181. export_arguments=flexmock(paper=False, qr_html=False, path='dest'),
  182. global_arguments=flexmock(dry_run=False),
  183. )
  184. def test_export_key_with_stdout_path_calls_borg_without_path_argument():
  185. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  186. flexmock(module.os.path).should_receive('exists').never()
  187. insert_execute_command_mock(('borg', 'key', 'export', 'repo'))
  188. module.export_key(
  189. repository_path='repo',
  190. config={},
  191. local_borg_version='1.2.3',
  192. export_arguments=flexmock(paper=False, qr_html=False, path='-'),
  193. global_arguments=flexmock(dry_run=False),
  194. )
  195. def test_export_key_with_dry_run_skips_borg_call():
  196. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  197. flexmock(module.os.path).should_receive('exists').never()
  198. flexmock(module).should_receive('execute_command').never()
  199. module.export_key(
  200. repository_path='repo',
  201. config={},
  202. local_borg_version='1.2.3',
  203. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  204. global_arguments=flexmock(dry_run=True),
  205. )
  206. def test_export_key_calls_borg_with_working_directory():
  207. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  208. flexmock(module.os.path).should_receive('exists').never()
  209. insert_execute_command_mock(('borg', 'key', 'export', 'repo'), working_directory='/working/dir')
  210. module.export_key(
  211. repository_path='repo',
  212. config={'working_directory': '/working/dir'},
  213. local_borg_version='1.2.3',
  214. export_arguments=flexmock(paper=False, qr_html=False, path=None),
  215. global_arguments=flexmock(dry_run=False),
  216. )
  217. def test_export_key_calls_borg_with_path_argument_and_working_directory():
  218. flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
  219. flexmock(module.os.path).should_receive('exists').with_args('/working/dir/dest').and_return(
  220. False
  221. ).once()
  222. insert_execute_command_mock(
  223. ('borg', 'key', 'export', 'repo', 'dest'),
  224. output_file=None,
  225. working_directory='/working/dir',
  226. )
  227. module.export_key(
  228. repository_path='repo',
  229. config={'working_directory': '/working/dir'},
  230. local_borg_version='1.2.3',
  231. export_arguments=flexmock(paper=False, qr_html=False, path='dest'),
  232. global_arguments=flexmock(dry_run=False),
  233. )