interpolation_test.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import pytest
  4. from compose.config.environment import Environment
  5. from compose.config.interpolation import interpolate_environment_variables
  6. from compose.config.interpolation import Interpolator
  7. from compose.config.interpolation import InvalidInterpolation
  8. from compose.config.interpolation import TemplateWithDefaults
  9. @pytest.fixture
  10. def mock_env():
  11. return Environment({'USER': 'jenny', 'FOO': 'bar'})
  12. @pytest.fixture
  13. def variable_mapping():
  14. return Environment({'FOO': 'first', 'BAR': ''})
  15. @pytest.fixture
  16. def defaults_interpolator(variable_mapping):
  17. return Interpolator(TemplateWithDefaults, variable_mapping).interpolate
  18. def test_interpolate_environment_variables_in_services(mock_env):
  19. services = {
  20. 'servicea': {
  21. 'image': 'example:${USER}',
  22. 'volumes': ['$FOO:/target'],
  23. 'logging': {
  24. 'driver': '${FOO}',
  25. 'options': {
  26. 'user': '$USER',
  27. }
  28. }
  29. }
  30. }
  31. expected = {
  32. 'servicea': {
  33. 'image': 'example:jenny',
  34. 'volumes': ['bar:/target'],
  35. 'logging': {
  36. 'driver': 'bar',
  37. 'options': {
  38. 'user': 'jenny',
  39. }
  40. }
  41. }
  42. }
  43. value = interpolate_environment_variables("2.0", services, 'service', mock_env)
  44. assert value == expected
  45. def test_interpolate_environment_variables_in_volumes(mock_env):
  46. volumes = {
  47. 'data': {
  48. 'driver': '$FOO',
  49. 'driver_opts': {
  50. 'max': 2,
  51. 'user': '${USER}'
  52. }
  53. },
  54. 'other': None,
  55. }
  56. expected = {
  57. 'data': {
  58. 'driver': 'bar',
  59. 'driver_opts': {
  60. 'max': 2,
  61. 'user': 'jenny'
  62. }
  63. },
  64. 'other': {},
  65. }
  66. value = interpolate_environment_variables("2.0", volumes, 'volume', mock_env)
  67. assert value == expected
  68. def test_escaped_interpolation(defaults_interpolator):
  69. assert defaults_interpolator('$${foo}') == '${foo}'
  70. def test_invalid_interpolation(defaults_interpolator):
  71. with pytest.raises(InvalidInterpolation):
  72. defaults_interpolator('${')
  73. with pytest.raises(InvalidInterpolation):
  74. defaults_interpolator('$}')
  75. with pytest.raises(InvalidInterpolation):
  76. defaults_interpolator('${}')
  77. with pytest.raises(InvalidInterpolation):
  78. defaults_interpolator('${ }')
  79. with pytest.raises(InvalidInterpolation):
  80. defaults_interpolator('${ foo}')
  81. with pytest.raises(InvalidInterpolation):
  82. defaults_interpolator('${foo }')
  83. with pytest.raises(InvalidInterpolation):
  84. defaults_interpolator('${foo!}')
  85. def test_interpolate_missing_no_default(defaults_interpolator):
  86. assert defaults_interpolator("This ${missing} var") == "This var"
  87. assert defaults_interpolator("This ${BAR} var") == "This var"
  88. def test_interpolate_with_value(defaults_interpolator):
  89. assert defaults_interpolator("This $FOO var") == "This first var"
  90. assert defaults_interpolator("This ${FOO} var") == "This first var"
  91. def test_interpolate_missing_with_default(defaults_interpolator):
  92. assert defaults_interpolator("ok ${missing:-def}") == "ok def"
  93. assert defaults_interpolator("ok ${missing-def}") == "ok def"
  94. def test_interpolate_with_empty_and_default_value(defaults_interpolator):
  95. assert defaults_interpolator("ok ${BAR:-def}") == "ok def"
  96. assert defaults_interpolator("ok ${BAR-def}") == "ok "