diff --git a/awx_collection/test/awx/test_notification_template.py b/awx_collection/test/awx/test_notification_template.py index 28f7c4ecee..252aca71e3 100644 --- a/awx_collection/test/awx/test_notification_template.py +++ b/awx_collection/test/awx/test_notification_template.py @@ -3,7 +3,7 @@ __metaclass__ = type import pytest -from awx.main.models import NotificationTemplate +from awx.main.models import NotificationTemplate, Job def compare_with_encrypted(model_config, param_config): @@ -109,3 +109,32 @@ def test_deprecated_to_modern_no_op(run_module, admin_user, organization): ), admin_user) assert not result.get('failed', False), result.get('msg', result) assert not result.pop('changed', None), result + + +@pytest.mark.django_db +def test_build_notification_message_undefined(run_module, admin_user, organization): + """Job notification templates may encounter undefined values in the context when they are + rendered. Make sure that accessing attributes or items of an undefined value returns another + instance of Undefined, rather than raising an UndefinedError. This enables the use of expressions + like "{{ job.created_by.first_name | default('unknown') }}".""" + job = Job.objects.create(name='foobar') + + nt_config = { + 'url': 'http://www.example.com/hook', + 'headers': { + 'X-Custom-Header': 'value123' + } + } + custom_start_template = {'body': '{"started_by": "{{ job.summary_fields.created_by.username | default(\'My Placeholder\') }}"}'} + messages = {'started': custom_start_template, 'success': None, 'error': None, 'workflow_approval': None} + result = run_module('tower_notification_template', dict( + name='foo-notification-template', + organization=organization.name, + notification_type='webhook', + notification_configuration=nt_config, + messages=messages, + ), admin_user) + nt = NotificationTemplate.objects.get(id=result['id']) + + _, body = job.build_notification_message(nt, 'running') + assert '{"started_by": "My Placeholder"}' in body \ No newline at end of file