2
0

test_container.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import io
  2. import sys
  3. import pytest
  4. from flexmock import flexmock
  5. from borgmatic.hooks.credential import container as module
  6. @pytest.mark.parametrize('credential_parameters', ((), ('foo', 'bar')))
  7. def test_load_credential_with_invalid_credential_parameters_raises(credential_parameters):
  8. with pytest.raises(ValueError):
  9. module.load_credential(
  10. hook_config={},
  11. config={},
  12. credential_parameters=credential_parameters,
  13. )
  14. def test_load_credential_with_invalid_secret_name_raises():
  15. with pytest.raises(ValueError):
  16. module.load_credential(
  17. hook_config={},
  18. config={},
  19. credential_parameters=('this is invalid',),
  20. )
  21. def test_load_credential_reads_named_secret_from_file():
  22. credential_stream = io.StringIO('password')
  23. credential_stream.name = '/run/secrets/mysecret'
  24. builtins = flexmock(sys.modules['builtins'])
  25. builtins.should_receive('open').with_args('/run/secrets/mysecret', encoding='utf-8').and_return(
  26. credential_stream
  27. )
  28. assert (
  29. module.load_credential(hook_config={}, config={}, credential_parameters=('mysecret',))
  30. == 'password'
  31. )
  32. def test_load_credential_with_custom_secrets_directory_looks_there_for_secret_file():
  33. config = {'container': {'secrets_directory': '/secrets'}}
  34. credential_stream = io.StringIO('password')
  35. credential_stream.name = '/secrets/mysecret'
  36. builtins = flexmock(sys.modules['builtins'])
  37. builtins.should_receive('open').with_args('/secrets/mysecret', encoding='utf-8').and_return(
  38. credential_stream
  39. )
  40. assert (
  41. module.load_credential(
  42. hook_config=config['container'],
  43. config=config,
  44. credential_parameters=('mysecret',),
  45. )
  46. == 'password'
  47. )
  48. def test_load_credential_with_custom_secrets_directory_prefixes_it_with_working_directory():
  49. config = {'container': {'secrets_directory': 'secrets'}, 'working_directory': '/working'}
  50. credential_stream = io.StringIO('password')
  51. credential_stream.name = '/working/secrets/mysecret'
  52. builtins = flexmock(sys.modules['builtins'])
  53. builtins.should_receive('open').with_args(
  54. '/working/secrets/mysecret', encoding='utf-8'
  55. ).and_return(
  56. credential_stream,
  57. )
  58. assert (
  59. module.load_credential(
  60. hook_config=config['container'],
  61. config=config,
  62. credential_parameters=('mysecret',),
  63. )
  64. == 'password'
  65. )
  66. def test_load_credential_with_file_not_found_error_raises():
  67. builtins = flexmock(sys.modules['builtins'])
  68. builtins.should_receive('open').with_args('/run/secrets/mysecret', encoding='utf-8').and_raise(
  69. FileNotFoundError
  70. )
  71. with pytest.raises(ValueError):
  72. module.load_credential(hook_config={}, config={}, credential_parameters=('mysecret',))