2
0

test_export_key.py 11 KB

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