test_extract.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. import logging
  2. import pytest
  3. from flexmock import flexmock
  4. from borgmatic.borg import extract as module
  5. from ..test_verbosity import insert_logging_mock
  6. def insert_execute_command_mock(command, working_directory=None, borg_exit_codes=None):
  7. flexmock(module.environment).should_receive('make_environment')
  8. flexmock(module).should_receive('execute_command').with_args(
  9. command,
  10. working_directory=working_directory,
  11. extra_environment=None,
  12. borg_local_path=command[0],
  13. borg_exit_codes=borg_exit_codes,
  14. ).once()
  15. def test_extract_last_archive_dry_run_calls_borg_with_last_archive():
  16. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  17. insert_execute_command_mock(('borg', 'extract', '--dry-run', 'repo::archive'))
  18. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  19. ('repo::archive',)
  20. )
  21. module.extract_last_archive_dry_run(
  22. config={},
  23. local_borg_version='1.2.3',
  24. global_arguments=flexmock(log_json=False),
  25. repository_path='repo',
  26. lock_wait=None,
  27. )
  28. def test_extract_last_archive_dry_run_without_any_archives_should_not_raise():
  29. flexmock(module.rlist).should_receive('resolve_archive_name').and_raise(ValueError)
  30. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(('repo',))
  31. module.extract_last_archive_dry_run(
  32. config={},
  33. local_borg_version='1.2.3',
  34. global_arguments=flexmock(log_json=False),
  35. repository_path='repo',
  36. lock_wait=None,
  37. )
  38. def test_extract_last_archive_dry_run_with_log_info_calls_borg_with_info_parameter():
  39. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  40. insert_execute_command_mock(('borg', 'extract', '--dry-run', '--info', 'repo::archive'))
  41. insert_logging_mock(logging.INFO)
  42. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  43. ('repo::archive',)
  44. )
  45. module.extract_last_archive_dry_run(
  46. config={},
  47. local_borg_version='1.2.3',
  48. global_arguments=flexmock(log_json=False),
  49. repository_path='repo',
  50. lock_wait=None,
  51. )
  52. def test_extract_last_archive_dry_run_with_log_debug_calls_borg_with_debug_parameter():
  53. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  54. insert_execute_command_mock(
  55. ('borg', 'extract', '--dry-run', '--debug', '--show-rc', '--list', 'repo::archive')
  56. )
  57. insert_logging_mock(logging.DEBUG)
  58. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  59. ('repo::archive',)
  60. )
  61. module.extract_last_archive_dry_run(
  62. config={},
  63. local_borg_version='1.2.3',
  64. global_arguments=flexmock(log_json=False),
  65. repository_path='repo',
  66. lock_wait=None,
  67. )
  68. def test_extract_last_archive_dry_run_calls_borg_via_local_path():
  69. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  70. insert_execute_command_mock(('borg1', 'extract', '--dry-run', 'repo::archive'))
  71. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  72. ('repo::archive',)
  73. )
  74. module.extract_last_archive_dry_run(
  75. config={},
  76. local_borg_version='1.2.3',
  77. global_arguments=flexmock(log_json=False),
  78. repository_path='repo',
  79. lock_wait=None,
  80. local_path='borg1',
  81. )
  82. def test_extract_last_archive_dry_run_calls_borg_using_exit_codes():
  83. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  84. borg_exit_codes = flexmock()
  85. insert_execute_command_mock(
  86. ('borg', 'extract', '--dry-run', 'repo::archive'), borg_exit_codes=borg_exit_codes
  87. )
  88. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  89. ('repo::archive',)
  90. )
  91. module.extract_last_archive_dry_run(
  92. config={'borg_exit_codes': borg_exit_codes},
  93. local_borg_version='1.2.3',
  94. global_arguments=flexmock(log_json=False),
  95. repository_path='repo',
  96. lock_wait=None,
  97. )
  98. def test_extract_last_archive_dry_run_calls_borg_with_remote_path_flags():
  99. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  100. insert_execute_command_mock(
  101. ('borg', 'extract', '--dry-run', '--remote-path', 'borg1', 'repo::archive')
  102. )
  103. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  104. ('repo::archive',)
  105. )
  106. module.extract_last_archive_dry_run(
  107. config={},
  108. local_borg_version='1.2.3',
  109. global_arguments=flexmock(log_json=False),
  110. repository_path='repo',
  111. lock_wait=None,
  112. remote_path='borg1',
  113. )
  114. def test_extract_last_archive_dry_run_calls_borg_with_log_json_flag():
  115. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  116. insert_execute_command_mock(('borg', 'extract', '--dry-run', '--log-json', 'repo::archive'))
  117. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  118. ('repo::archive',)
  119. )
  120. module.extract_last_archive_dry_run(
  121. config={},
  122. local_borg_version='1.2.3',
  123. global_arguments=flexmock(log_json=True),
  124. repository_path='repo',
  125. lock_wait=None,
  126. )
  127. def test_extract_last_archive_dry_run_calls_borg_with_lock_wait_flags():
  128. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  129. insert_execute_command_mock(
  130. ('borg', 'extract', '--dry-run', '--lock-wait', '5', 'repo::archive')
  131. )
  132. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  133. ('repo::archive',)
  134. )
  135. module.extract_last_archive_dry_run(
  136. config={},
  137. local_borg_version='1.2.3',
  138. global_arguments=flexmock(log_json=False),
  139. repository_path='repo',
  140. lock_wait=5,
  141. )
  142. def test_extract_archive_calls_borg_with_path_flags():
  143. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  144. insert_execute_command_mock(('borg', 'extract', 'repo::archive', 'path1', 'path2'))
  145. flexmock(module.feature).should_receive('available').and_return(True)
  146. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  147. ('repo::archive',)
  148. )
  149. flexmock(module.borgmatic.config.validate).should_receive(
  150. 'normalize_repository_path'
  151. ).and_return('repo')
  152. module.extract_archive(
  153. dry_run=False,
  154. repository='repo',
  155. archive='archive',
  156. paths=['path1', 'path2'],
  157. config={},
  158. local_borg_version='1.2.3',
  159. global_arguments=flexmock(log_json=False),
  160. )
  161. def test_extract_archive_calls_borg_with_local_path():
  162. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  163. insert_execute_command_mock(('borg1', 'extract', 'repo::archive'))
  164. flexmock(module.feature).should_receive('available').and_return(True)
  165. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  166. ('repo::archive',)
  167. )
  168. flexmock(module.borgmatic.config.validate).should_receive(
  169. 'normalize_repository_path'
  170. ).and_return('repo')
  171. module.extract_archive(
  172. dry_run=False,
  173. repository='repo',
  174. archive='archive',
  175. paths=None,
  176. config={},
  177. local_borg_version='1.2.3',
  178. global_arguments=flexmock(log_json=False),
  179. local_path='borg1',
  180. )
  181. def test_extract_archive_calls_borg_with_exit_codes():
  182. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  183. borg_exit_codes = flexmock()
  184. insert_execute_command_mock(
  185. ('borg', 'extract', 'repo::archive'), borg_exit_codes=borg_exit_codes
  186. )
  187. flexmock(module.feature).should_receive('available').and_return(True)
  188. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  189. ('repo::archive',)
  190. )
  191. flexmock(module.borgmatic.config.validate).should_receive(
  192. 'normalize_repository_path'
  193. ).and_return('repo')
  194. module.extract_archive(
  195. dry_run=False,
  196. repository='repo',
  197. archive='archive',
  198. paths=None,
  199. config={'borg_exit_codes': borg_exit_codes},
  200. local_borg_version='1.2.3',
  201. global_arguments=flexmock(log_json=False),
  202. )
  203. def test_extract_archive_calls_borg_with_remote_path_flags():
  204. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  205. insert_execute_command_mock(('borg', 'extract', '--remote-path', 'borg1', 'repo::archive'))
  206. flexmock(module.feature).should_receive('available').and_return(True)
  207. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  208. ('repo::archive',)
  209. )
  210. flexmock(module.borgmatic.config.validate).should_receive(
  211. 'normalize_repository_path'
  212. ).and_return('repo')
  213. module.extract_archive(
  214. dry_run=False,
  215. repository='repo',
  216. archive='archive',
  217. paths=None,
  218. config={},
  219. local_borg_version='1.2.3',
  220. global_arguments=flexmock(log_json=False),
  221. remote_path='borg1',
  222. )
  223. @pytest.mark.parametrize(
  224. 'feature_available,option_flag',
  225. (
  226. (True, '--numeric-ids'),
  227. (False, '--numeric-owner'),
  228. ),
  229. )
  230. def test_extract_archive_calls_borg_with_numeric_ids_parameter(feature_available, option_flag):
  231. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  232. insert_execute_command_mock(('borg', 'extract', option_flag, 'repo::archive'))
  233. flexmock(module.feature).should_receive('available').and_return(feature_available)
  234. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  235. ('repo::archive',)
  236. )
  237. flexmock(module.borgmatic.config.validate).should_receive(
  238. 'normalize_repository_path'
  239. ).and_return('repo')
  240. module.extract_archive(
  241. dry_run=False,
  242. repository='repo',
  243. archive='archive',
  244. paths=None,
  245. config={'numeric_ids': True},
  246. local_borg_version='1.2.3',
  247. global_arguments=flexmock(log_json=False),
  248. )
  249. def test_extract_archive_calls_borg_with_umask_flags():
  250. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  251. insert_execute_command_mock(('borg', 'extract', '--umask', '0770', 'repo::archive'))
  252. flexmock(module.feature).should_receive('available').and_return(True)
  253. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  254. ('repo::archive',)
  255. )
  256. flexmock(module.borgmatic.config.validate).should_receive(
  257. 'normalize_repository_path'
  258. ).and_return('repo')
  259. module.extract_archive(
  260. dry_run=False,
  261. repository='repo',
  262. archive='archive',
  263. paths=None,
  264. config={'umask': '0770'},
  265. local_borg_version='1.2.3',
  266. global_arguments=flexmock(log_json=False),
  267. )
  268. def test_extract_archive_calls_borg_with_log_json_flags():
  269. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  270. insert_execute_command_mock(('borg', 'extract', '--log-json', 'repo::archive'))
  271. flexmock(module.feature).should_receive('available').and_return(True)
  272. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  273. ('repo::archive',)
  274. )
  275. module.extract_archive(
  276. dry_run=False,
  277. repository='repo',
  278. archive='archive',
  279. paths=None,
  280. config={},
  281. local_borg_version='1.2.3',
  282. global_arguments=flexmock(log_json=True),
  283. )
  284. def test_extract_archive_calls_borg_with_lock_wait_flags():
  285. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  286. insert_execute_command_mock(('borg', 'extract', '--lock-wait', '5', 'repo::archive'))
  287. flexmock(module.feature).should_receive('available').and_return(True)
  288. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  289. ('repo::archive',)
  290. )
  291. flexmock(module.borgmatic.config.validate).should_receive(
  292. 'normalize_repository_path'
  293. ).and_return('repo')
  294. module.extract_archive(
  295. dry_run=False,
  296. repository='repo',
  297. archive='archive',
  298. paths=None,
  299. config={'lock_wait': '5'},
  300. local_borg_version='1.2.3',
  301. global_arguments=flexmock(log_json=False),
  302. )
  303. def test_extract_archive_with_log_info_calls_borg_with_info_parameter():
  304. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  305. insert_execute_command_mock(('borg', 'extract', '--info', 'repo::archive'))
  306. insert_logging_mock(logging.INFO)
  307. flexmock(module.feature).should_receive('available').and_return(True)
  308. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  309. ('repo::archive',)
  310. )
  311. flexmock(module.borgmatic.config.validate).should_receive(
  312. 'normalize_repository_path'
  313. ).and_return('repo')
  314. module.extract_archive(
  315. dry_run=False,
  316. repository='repo',
  317. archive='archive',
  318. paths=None,
  319. config={},
  320. local_borg_version='1.2.3',
  321. global_arguments=flexmock(log_json=False),
  322. )
  323. def test_extract_archive_with_log_debug_calls_borg_with_debug_flags():
  324. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  325. insert_execute_command_mock(
  326. ('borg', 'extract', '--debug', '--list', '--show-rc', 'repo::archive')
  327. )
  328. insert_logging_mock(logging.DEBUG)
  329. flexmock(module.feature).should_receive('available').and_return(True)
  330. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  331. ('repo::archive',)
  332. )
  333. flexmock(module.borgmatic.config.validate).should_receive(
  334. 'normalize_repository_path'
  335. ).and_return('repo')
  336. module.extract_archive(
  337. dry_run=False,
  338. repository='repo',
  339. archive='archive',
  340. paths=None,
  341. config={},
  342. local_borg_version='1.2.3',
  343. global_arguments=flexmock(log_json=False),
  344. )
  345. def test_extract_archive_calls_borg_with_dry_run_parameter():
  346. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  347. insert_execute_command_mock(('borg', 'extract', '--dry-run', 'repo::archive'))
  348. flexmock(module.feature).should_receive('available').and_return(True)
  349. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  350. ('repo::archive',)
  351. )
  352. flexmock(module.borgmatic.config.validate).should_receive(
  353. 'normalize_repository_path'
  354. ).and_return('repo')
  355. module.extract_archive(
  356. dry_run=True,
  357. repository='repo',
  358. archive='archive',
  359. paths=None,
  360. config={},
  361. local_borg_version='1.2.3',
  362. global_arguments=flexmock(log_json=False),
  363. )
  364. def test_extract_archive_calls_borg_with_destination_path():
  365. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  366. insert_execute_command_mock(('borg', 'extract', 'repo::archive'), working_directory='/dest')
  367. flexmock(module.feature).should_receive('available').and_return(True)
  368. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  369. ('repo::archive',)
  370. )
  371. flexmock(module.borgmatic.config.validate).should_receive(
  372. 'normalize_repository_path'
  373. ).and_return('repo')
  374. module.extract_archive(
  375. dry_run=False,
  376. repository='repo',
  377. archive='archive',
  378. paths=None,
  379. config={},
  380. local_borg_version='1.2.3',
  381. global_arguments=flexmock(log_json=False),
  382. destination_path='/dest',
  383. )
  384. def test_extract_archive_calls_borg_with_strip_components():
  385. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  386. insert_execute_command_mock(('borg', 'extract', '--strip-components', '5', 'repo::archive'))
  387. flexmock(module.feature).should_receive('available').and_return(True)
  388. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  389. ('repo::archive',)
  390. )
  391. flexmock(module.borgmatic.config.validate).should_receive(
  392. 'normalize_repository_path'
  393. ).and_return('repo')
  394. module.extract_archive(
  395. dry_run=False,
  396. repository='repo',
  397. archive='archive',
  398. paths=None,
  399. config={},
  400. local_borg_version='1.2.3',
  401. global_arguments=flexmock(log_json=False),
  402. strip_components=5,
  403. )
  404. def test_extract_archive_calls_borg_with_strip_components_calculated_from_all():
  405. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  406. insert_execute_command_mock(
  407. (
  408. 'borg',
  409. 'extract',
  410. '--strip-components',
  411. '2',
  412. 'repo::archive',
  413. 'foo/bar/baz.txt',
  414. 'foo/bar.txt',
  415. )
  416. )
  417. flexmock(module.feature).should_receive('available').and_return(True)
  418. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  419. ('repo::archive',)
  420. )
  421. flexmock(module.borgmatic.config.validate).should_receive(
  422. 'normalize_repository_path'
  423. ).and_return('repo')
  424. module.extract_archive(
  425. dry_run=False,
  426. repository='repo',
  427. archive='archive',
  428. paths=['foo/bar/baz.txt', 'foo/bar.txt'],
  429. config={},
  430. local_borg_version='1.2.3',
  431. global_arguments=flexmock(log_json=False),
  432. strip_components='all',
  433. )
  434. def test_extract_archive_calls_borg_with_strip_components_calculated_from_all_with_leading_slash():
  435. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  436. insert_execute_command_mock(
  437. (
  438. 'borg',
  439. 'extract',
  440. '--strip-components',
  441. '2',
  442. 'repo::archive',
  443. '/foo/bar/baz.txt',
  444. '/foo/bar.txt',
  445. )
  446. )
  447. flexmock(module.feature).should_receive('available').and_return(True)
  448. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  449. ('repo::archive',)
  450. )
  451. flexmock(module.borgmatic.config.validate).should_receive(
  452. 'normalize_repository_path'
  453. ).and_return('repo')
  454. module.extract_archive(
  455. dry_run=False,
  456. repository='repo',
  457. archive='archive',
  458. paths=['/foo/bar/baz.txt', '/foo/bar.txt'],
  459. config={},
  460. local_borg_version='1.2.3',
  461. global_arguments=flexmock(log_json=False),
  462. strip_components='all',
  463. )
  464. def test_extract_archive_with_strip_components_all_and_no_paths_raises():
  465. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  466. flexmock(module.feature).should_receive('available').and_return(True)
  467. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  468. ('repo::archive',)
  469. )
  470. flexmock(module.borgmatic.config.validate).should_receive(
  471. 'normalize_repository_path'
  472. ).and_return('repo')
  473. flexmock(module).should_receive('execute_command').never()
  474. with pytest.raises(ValueError):
  475. module.extract_archive(
  476. dry_run=False,
  477. repository='repo',
  478. archive='archive',
  479. paths=None,
  480. config={},
  481. local_borg_version='1.2.3',
  482. global_arguments=flexmock(log_json=False),
  483. strip_components='all',
  484. )
  485. def test_extract_archive_calls_borg_with_progress_parameter():
  486. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  487. flexmock(module.environment).should_receive('make_environment')
  488. flexmock(module).should_receive('execute_command').with_args(
  489. ('borg', 'extract', '--progress', 'repo::archive'),
  490. output_file=module.DO_NOT_CAPTURE,
  491. working_directory=None,
  492. extra_environment=None,
  493. borg_local_path='borg',
  494. borg_exit_codes=None,
  495. ).once()
  496. flexmock(module.feature).should_receive('available').and_return(True)
  497. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  498. ('repo::archive',)
  499. )
  500. flexmock(module.borgmatic.config.validate).should_receive(
  501. 'normalize_repository_path'
  502. ).and_return('repo')
  503. module.extract_archive(
  504. dry_run=False,
  505. repository='repo',
  506. archive='archive',
  507. paths=None,
  508. config={},
  509. local_borg_version='1.2.3',
  510. global_arguments=flexmock(log_json=False),
  511. progress=True,
  512. )
  513. def test_extract_archive_with_progress_and_extract_to_stdout_raises():
  514. flexmock(module).should_receive('execute_command').never()
  515. with pytest.raises(ValueError):
  516. module.extract_archive(
  517. dry_run=False,
  518. repository='repo',
  519. archive='archive',
  520. paths=None,
  521. config={},
  522. local_borg_version='1.2.3',
  523. global_arguments=flexmock(log_json=False),
  524. progress=True,
  525. extract_to_stdout=True,
  526. )
  527. def test_extract_archive_calls_borg_with_stdout_parameter_and_returns_process():
  528. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  529. process = flexmock()
  530. flexmock(module.environment).should_receive('make_environment')
  531. flexmock(module).should_receive('execute_command').with_args(
  532. ('borg', 'extract', '--stdout', 'repo::archive'),
  533. output_file=module.subprocess.PIPE,
  534. working_directory=None,
  535. run_to_completion=False,
  536. extra_environment=None,
  537. borg_local_path='borg',
  538. borg_exit_codes=None,
  539. ).and_return(process).once()
  540. flexmock(module.feature).should_receive('available').and_return(True)
  541. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  542. ('repo::archive',)
  543. )
  544. flexmock(module.borgmatic.config.validate).should_receive(
  545. 'normalize_repository_path'
  546. ).and_return('repo')
  547. assert (
  548. module.extract_archive(
  549. dry_run=False,
  550. repository='repo',
  551. archive='archive',
  552. paths=None,
  553. config={},
  554. local_borg_version='1.2.3',
  555. global_arguments=flexmock(log_json=False),
  556. extract_to_stdout=True,
  557. )
  558. == process
  559. )
  560. def test_extract_archive_skips_abspath_for_remote_repository():
  561. flexmock(module.os.path).should_receive('abspath').never()
  562. flexmock(module.environment).should_receive('make_environment')
  563. flexmock(module).should_receive('execute_command').with_args(
  564. ('borg', 'extract', 'server:repo::archive'),
  565. working_directory=None,
  566. extra_environment=None,
  567. borg_local_path='borg',
  568. borg_exit_codes=None,
  569. ).once()
  570. flexmock(module.feature).should_receive('available').and_return(True)
  571. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  572. ('server:repo::archive',)
  573. )
  574. flexmock(module.borgmatic.config.validate).should_receive(
  575. 'normalize_repository_path'
  576. ).and_return('repo')
  577. module.extract_archive(
  578. dry_run=False,
  579. repository='server:repo',
  580. archive='archive',
  581. paths=None,
  582. config={},
  583. local_borg_version='1.2.3',
  584. global_arguments=flexmock(log_json=False),
  585. )