def test_replace_variables_simple_case(self):
        dct = {
            "env": "{{env_var}}",
            "env_dict": {
                "env3": "{{ var1 }}"
            },
            "env4": "{{var2 }}",
            "env5": "{{{var2}}",
            "env6": "{{var3}}"
        }

        variables = {
            "env_var": "env value",
            "var1": "value1",
            "var2": "value2"
        }

        expected = {
            "env": "env value",
            "env_dict": {
                "env3": "value1"
            },
            "env4": "value2",
            "env5": "{value2",
            "env6": "{{var3}}"
        }

        self.assertEqual(expected,
                         dict_util.replace_placeholders(dct, variables))
    def test_replace_variables_flat_replace(self, airflow_variable_mock):
        def airflow_variable_values(key, default_var):
            return 'liminal playground' if key == 'playground' else default_var

        airflow_variable_mock.side_effect = airflow_variable_values

        dct = {
            "query": "select * from my_table "
            "where event_type = {{event_type}} and region = {{region}}",
            "env": "{{prod}}, {{stg}}, {{playground}}",
            "optional": "{{optionals}}"
        }

        variables = {
            "region": "us_east_1",
            "event_type": "subscription",
            "prod": "liminal production",
            "stg": "liminal staging"
        }

        expected = {
            'query': 'select * from my_table '
            'where event_type = subscription and region = us_east_1',
            "env": "liminal production, liminal staging, liminal playground",
            "optional": "{{optionals}}"
        }

        self.assertEqual(expected,
                         dict_util.replace_placeholders(dct, variables))
 def test_replace_variables_empty_var(self):
     dct = {
         "env": "{{env_var}}",
         "env_dict": {
             "env3": "{{ var1 }}"
         },
         "env4": "{{var2 }}",
         "env5": "{{{var2}}",
         "env6": "{{var3}}"
     }
     self.assertEqual(dct, dict_util.replace_placeholders(dct, {}))
def apply_variable_substitution(subliminal, superliminal, is_render_variables=False):
    """
     if is_render_variables is True
        Replace all {{variable.key}} in subliminal with variable.value variable in
        subliminal.variables + superliminal.variables
     else
        merge subliminal.variables with superliminal.variables without replace
        placeholders
     """
    keyword = "variables"
    merged_variables = dict_util.merge_dicts(subliminal.get(keyword, {}),
                                             superliminal.get(keyword, {}), True)
    if is_render_variables:
        for k, v in merged_variables.items():
            if isinstance(v, str) or (not isinstance(v, dict) and not isinstance(v, list)):
                merged_variables[k] = dict_util.replace_placholders_in_string(str(v),
                                                                              merged_variables)

        merged_variables = dict_util.replace_placeholders(merged_variables, merged_variables)
        return dict_util.replace_placeholders(subliminal, merged_variables)
    else:
        subliminal[keyword] = merged_variables
        return subliminal
    def test_replace_variables_from_variable_and_not_env(self):
        dct = {
            "query":
            "select * from my_table "
            "where event_type = {{event_type}} and region = {{region}} from {{table}}"
        }

        variables = {"table": "my_variable_table"}

        expected = {
            'query':
            'select * from my_table '
            'where event_type = {{event_type}} '
            'and region = {{region}} from my_variable_table'
        }

        self.assertEqual(expected,
                         dict_util.replace_placeholders(dct, variables))
    def test_replace_variables_with_nested_list(self, airflow_variable_mock):
        def airflow_variable_values(key, default_var):
            return 'liminal playground' if key == 'playground' else default_var

        airflow_variable_mock.side_effect = airflow_variable_values

        dct = {
            "query": "select * from my_table "
            "where event_type = {{event_type}} and region = {{region}}",
            "env": ['{{prod}}', '{{stg}}', '{{playground}}'],
            "tasks": [{
                'id': 'id1',
                'image': '{{image}}'
            }],
            "optional": "{{optionals}}"
        }

        variables = {
            "region": "us_east_1",
            "event_type": "subscription",
            "prod": "liminal production",
            "stg": "liminal staging",
            "image": "my_image_name"
        }

        expected = {
            'env':
            ['liminal production', 'liminal staging', 'liminal playground'],
            'optional':
            '{{optionals}}',
            'query':
            'select * from my_table where event_type = subscription and region = '
            'us_east_1',
            'tasks': [{
                'id': 'id1',
                'image': 'my_image_name'
            }]
        }

        self.assertEqual(expected,
                         dict_util.replace_placeholders(dct, variables))
    def test_replace_variables_from_airflow_and_not_enc(
            self, airflow_variable_mock):
        def airflow_variable_values(key, default_var):
            return 'my_airflow_table' if key == 'table' else default_var

        airflow_variable_mock.side_effect = airflow_variable_values

        dct = {
            "query":
            "select * from my_table "
            "where event_type = {{event_type}} and region = {{region}} from {{table}}"
        }

        variables = {}

        expected = {
            'query':
            'select * from my_table '
            'where event_type = {{event_type}} '
            'and region = {{region}} from my_airflow_table'
        }

        self.assertEqual(expected,
                         dict_util.replace_placeholders(dct, variables))