test_mysql.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import sys
  2. from flexmock import flexmock
  3. from borgmatic.hooks import mysql as module
  4. def test_dump_databases_runs_mysqldump_for_each_database():
  5. databases = [{'name': 'foo'}, {'name': 'bar'}]
  6. output_file = flexmock()
  7. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  8. 'databases/localhost/foo'
  9. ).and_return('databases/localhost/bar')
  10. flexmock(module.os).should_receive('makedirs')
  11. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  12. for name in ('foo', 'bar'):
  13. flexmock(module).should_receive('execute_command').with_args(
  14. ('mysqldump', '--add-drop-database', '--databases', name),
  15. output_file=output_file,
  16. extra_environment=None,
  17. ).once()
  18. module.dump_databases(databases, 'test.yaml', dry_run=False)
  19. def test_dump_databases_with_dry_run_skips_mysqldump():
  20. databases = [{'name': 'foo'}, {'name': 'bar'}]
  21. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  22. 'databases/localhost/foo'
  23. ).and_return('databases/localhost/bar')
  24. flexmock(module.os).should_receive('makedirs').never()
  25. flexmock(module).should_receive('execute_command').never()
  26. module.dump_databases(databases, 'test.yaml', dry_run=True)
  27. def test_dump_databases_without_databases_does_not_raise():
  28. module.dump_databases([], 'test.yaml', dry_run=False)
  29. def test_dump_databases_runs_mysqldump_with_hostname_and_port():
  30. databases = [{'name': 'foo', 'hostname': 'database.example.org', 'port': 5433}]
  31. output_file = flexmock()
  32. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  33. 'databases/database.example.org/foo'
  34. )
  35. flexmock(module.os).should_receive('makedirs')
  36. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  37. flexmock(module).should_receive('execute_command').with_args(
  38. (
  39. 'mysqldump',
  40. '--add-drop-database',
  41. '--host',
  42. 'database.example.org',
  43. '--port',
  44. '5433',
  45. '--protocol',
  46. 'tcp',
  47. '--databases',
  48. 'foo',
  49. ),
  50. output_file=output_file,
  51. extra_environment=None,
  52. ).once()
  53. module.dump_databases(databases, 'test.yaml', dry_run=False)
  54. def test_dump_databases_runs_mysqldump_with_username_and_password():
  55. databases = [{'name': 'foo', 'username': 'root', 'password': 'trustsome1'}]
  56. output_file = flexmock()
  57. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  58. 'databases/localhost/foo'
  59. )
  60. flexmock(module.os).should_receive('makedirs')
  61. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  62. flexmock(module).should_receive('execute_command').with_args(
  63. ('mysqldump', '--add-drop-database', '--user', 'root', '--databases', 'foo'),
  64. output_file=output_file,
  65. extra_environment={'MYSQL_PWD': 'trustsome1'},
  66. ).once()
  67. module.dump_databases(databases, 'test.yaml', dry_run=False)
  68. def test_dump_databases_runs_mysqldump_with_options():
  69. databases = [{'name': 'foo', 'options': '--stuff=such'}]
  70. output_file = flexmock()
  71. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  72. 'databases/localhost/foo'
  73. )
  74. flexmock(module.os).should_receive('makedirs')
  75. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  76. flexmock(module).should_receive('execute_command').with_args(
  77. ('mysqldump', '--add-drop-database', '--stuff=such', '--databases', 'foo'),
  78. output_file=output_file,
  79. extra_environment=None,
  80. ).once()
  81. module.dump_databases(databases, 'test.yaml', dry_run=False)
  82. def test_dump_databases_runs_mysqldump_for_all_databases():
  83. databases = [{'name': 'all'}]
  84. output_file = flexmock()
  85. flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
  86. 'databases/localhost/all'
  87. )
  88. flexmock(module.os).should_receive('makedirs')
  89. flexmock(sys.modules['builtins']).should_receive('open').and_return(output_file)
  90. flexmock(module).should_receive('execute_command').with_args(
  91. ('mysqldump', '--add-drop-database', '--all-databases'),
  92. output_file=output_file,
  93. extra_environment=None,
  94. ).once()
  95. module.dump_databases(databases, 'test.yaml', dry_run=False)