| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | from __future__ import absolute_importfrom __future__ import unicode_literalsimport pytestfrom compose.config.environment import Environmentfrom compose.config.interpolation import interpolate_environment_variablesfrom compose.config.interpolation import Interpolatorfrom compose.config.interpolation import InvalidInterpolationfrom compose.config.interpolation import TemplateWithDefaults@pytest.fixturedef mock_env():    return Environment({'USER': 'jenny', 'FOO': 'bar'})@pytest.fixturedef variable_mapping():    return Environment({'FOO': 'first', 'BAR': ''})@pytest.fixturedef defaults_interpolator(variable_mapping):    return Interpolator(TemplateWithDefaults, variable_mapping).interpolatedef test_interpolate_environment_variables_in_services(mock_env):    services = {        'servicea': {            'image': 'example:${USER}',            'volumes': ['$FOO:/target'],            'logging': {                'driver': '${FOO}',                'options': {                    'user': '$USER',                }            }        }    }    expected = {        'servicea': {            'image': 'example:jenny',            'volumes': ['bar:/target'],            'logging': {                'driver': 'bar',                'options': {                    'user': 'jenny',                }            }        }    }    value = interpolate_environment_variables("2.0", services, 'service', mock_env)    assert value == expecteddef test_interpolate_environment_variables_in_volumes(mock_env):    volumes = {        'data': {            'driver': '$FOO',            'driver_opts': {                'max': 2,                'user': '${USER}'            }        },        'other': None,    }    expected = {        'data': {            'driver': 'bar',            'driver_opts': {                'max': 2,                'user': 'jenny'            }        },        'other': {},    }    value = interpolate_environment_variables("2.0",  volumes, 'volume', mock_env)    assert value == expecteddef test_escaped_interpolation(defaults_interpolator):    assert defaults_interpolator('$${foo}') == '${foo}'def test_invalid_interpolation(defaults_interpolator):    with pytest.raises(InvalidInterpolation):        defaults_interpolator('${')    with pytest.raises(InvalidInterpolation):        defaults_interpolator('$}')    with pytest.raises(InvalidInterpolation):        defaults_interpolator('${}')    with pytest.raises(InvalidInterpolation):        defaults_interpolator('${ }')    with pytest.raises(InvalidInterpolation):        defaults_interpolator('${ foo}')    with pytest.raises(InvalidInterpolation):        defaults_interpolator('${foo }')    with pytest.raises(InvalidInterpolation):        defaults_interpolator('${foo!}')def test_interpolate_missing_no_default(defaults_interpolator):    assert defaults_interpolator("This ${missing} var") == "This  var"    assert defaults_interpolator("This ${BAR} var") == "This  var"def test_interpolate_with_value(defaults_interpolator):    assert defaults_interpolator("This $FOO var") == "This first var"    assert defaults_interpolator("This ${FOO} var") == "This first var"def test_interpolate_missing_with_default(defaults_interpolator):    assert defaults_interpolator("ok ${missing:-def}") == "ok def"    assert defaults_interpolator("ok ${missing-def}") == "ok def"    assert defaults_interpolator("ok ${BAR:-/non:-alphanumeric}") == "ok /non:-alphanumeric"def test_interpolate_with_empty_and_default_value(defaults_interpolator):    assert defaults_interpolator("ok ${BAR:-def}") == "ok def"    assert defaults_interpolator("ok ${BAR-def}") == "ok "
 |