test_sqlite.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import pytest
  2. from flexmock import flexmock
  3. from borgmatic.hooks import sqlite as module
  4. def test_dump_databases_logs_and_skips_if_dump_already_exists():
  5. databases = [{'path': '/path/to/database', 'name': 'database'}]
  6. flexmock(module).should_receive('make_dump_path').and_return('/path/to/dump')
  7. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  8. '/path/to/dump/database'
  9. )
  10. flexmock(module.os.path).should_receive('exists').and_return(True)
  11. flexmock(module.dump).should_receive('create_parent_directory_for_dump').never()
  12. flexmock(module).should_receive('execute_command').never()
  13. assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == []
  14. def test_dump_databases_dumps_each_database():
  15. databases = [
  16. {'path': '/path/to/database1', 'name': 'database1'},
  17. {'path': '/path/to/database2', 'name': 'database2'},
  18. ]
  19. processes = [flexmock(), flexmock()]
  20. flexmock(module).should_receive('make_dump_path').and_return('/path/to/dump')
  21. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  22. '/path/to/dump/database'
  23. )
  24. flexmock(module.os.path).should_receive('exists').and_return(False)
  25. flexmock(module.dump).should_receive('create_parent_directory_for_dump')
  26. flexmock(module).should_receive('execute_command').and_return(processes[0]).and_return(
  27. processes[1]
  28. )
  29. assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == processes
  30. def test_dumping_database_with_non_existent_path_warns_and_dumps_database():
  31. databases = [
  32. {'path': '/path/to/database1', 'name': 'database1'},
  33. ]
  34. processes = [flexmock()]
  35. flexmock(module).should_receive('make_dump_path').and_return('/path/to/dump')
  36. flexmock(module.logger).should_receive('warning').once()
  37. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  38. '/path/to/dump/database'
  39. )
  40. flexmock(module.os.path).should_receive('exists').and_return(False)
  41. flexmock(module.dump).should_receive('create_parent_directory_for_dump')
  42. flexmock(module).should_receive('execute_command').and_return(processes[0])
  43. assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == processes
  44. def test_dumping_database_with_name_all_warns_and_dumps_all_databases():
  45. databases = [
  46. {'path': '/path/to/database1', 'name': 'all'},
  47. ]
  48. processes = [flexmock()]
  49. flexmock(module).should_receive('make_dump_path').and_return('/path/to/dump')
  50. flexmock(module.logger).should_receive(
  51. 'warning'
  52. ).twice() # once for the name=all, once for the non-existent path
  53. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  54. '/path/to/dump/database'
  55. )
  56. flexmock(module.os.path).should_receive('exists').and_return(False)
  57. flexmock(module.dump).should_receive('create_parent_directory_for_dump')
  58. flexmock(module).should_receive('execute_command').and_return(processes[0])
  59. assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == processes
  60. def test_dump_databases_does_not_dump_if_dry_run():
  61. databases = [{'path': '/path/to/database', 'name': 'database'}]
  62. flexmock(module).should_receive('make_dump_path').and_return('/path/to/dump')
  63. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  64. '/path/to/dump/database'
  65. )
  66. flexmock(module.os.path).should_receive('exists').and_return(False)
  67. flexmock(module.dump).should_receive('create_parent_directory_for_dump').never()
  68. flexmock(module).should_receive('execute_command').never()
  69. assert module.dump_databases(databases, 'test.yaml', {}, dry_run=True) == []
  70. def test_restore_database_dump_restores_database():
  71. database_config = [{'path': '/path/to/database', 'name': 'database'}]
  72. extract_process = flexmock(stdout=flexmock())
  73. flexmock(module).should_receive('execute_command_with_processes').once()
  74. flexmock(module.os).should_receive('remove').once()
  75. module.restore_database_dump(
  76. database_config, 'test.yaml', {}, dry_run=False, extract_process=extract_process
  77. )
  78. def test_restore_database_dump_does_not_restore_database_if_dry_run():
  79. database_config = [{'path': '/path/to/database', 'name': 'database'}]
  80. extract_process = flexmock(stdout=flexmock())
  81. flexmock(module).should_receive('execute_command_with_processes').never()
  82. flexmock(module.os).should_receive('remove').never()
  83. module.restore_database_dump(
  84. database_config, 'test.yaml', {}, dry_run=True, extract_process=extract_process
  85. )
  86. def test_restore_database_dump_raises_error_if_database_config_is_invalid():
  87. database_config = []
  88. extract_process = flexmock(stdout=flexmock())
  89. with pytest.raises(ValueError):
  90. module.restore_database_dump(
  91. database_config, 'test.yaml', {}, dry_run=False, extract_process=extract_process
  92. )