test_container.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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={}, config={}, credential_parameters=credential_parameters
  11. )
  12. def test_load_credential_with_invalid_secret_name_raises():
  13. with pytest.raises(ValueError):
  14. module.load_credential(
  15. hook_config={}, config={}, credential_parameters=('this is invalid',)
  16. )
  17. def test_load_credential_reads_named_secret_from_file():
  18. credential_stream = io.StringIO('password')
  19. credential_stream.name = '/run/secrets/mysecret'
  20. builtins = flexmock(sys.modules['builtins'])
  21. builtins.should_receive('open').with_args('/run/secrets/mysecret').and_return(credential_stream)
  22. assert (
  23. module.load_credential(hook_config={}, config={}, credential_parameters=('mysecret',))
  24. == 'password'
  25. )
  26. def test_load_credential_with_custom_secrets_directory_looks_there_for_secret_file():
  27. config = {'container': {'secrets_directory': '/secrets'}}
  28. credential_stream = io.StringIO('password')
  29. credential_stream.name = '/secrets/mysecret'
  30. builtins = flexmock(sys.modules['builtins'])
  31. builtins.should_receive('open').with_args('/secrets/mysecret').and_return(credential_stream)
  32. assert (
  33. module.load_credential(
  34. hook_config=config['container'], config=config, credential_parameters=('mysecret',)
  35. )
  36. == 'password'
  37. )
  38. def test_load_credential_with_custom_secrets_directory_prefixes_it_with_working_directory():
  39. config = {'container': {'secrets_directory': 'secrets'}, 'working_directory': '/working'}
  40. credential_stream = io.StringIO('password')
  41. credential_stream.name = '/working/secrets/mysecret'
  42. builtins = flexmock(sys.modules['builtins'])
  43. builtins.should_receive('open').with_args('/working/secrets/mysecret').and_return(
  44. credential_stream
  45. )
  46. assert (
  47. module.load_credential(
  48. hook_config=config['container'], config=config, credential_parameters=('mysecret',)
  49. )
  50. == 'password'
  51. )
  52. def test_load_credential_with_file_not_found_error_raises():
  53. builtins = flexmock(sys.modules['builtins'])
  54. builtins.should_receive('open').with_args('/run/secrets/mysecret').and_raise(FileNotFoundError)
  55. with pytest.raises(ValueError):
  56. module.load_credential(hook_config={}, config={}, credential_parameters=('mysecret',))