test_import_key.py 11 KB

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