From 15036ff97026f89d1c43ad479c000f1e00f6585c Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Wed, 1 Apr 2020 10:19:35 -0400 Subject: [PATCH] Add unit tests for notification module --- .../plugins/modules/tower_notification.py | 4 +- awx_collection/test/awx/test_notification.py | 84 +++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 awx_collection/test/awx/test_notification.py diff --git a/awx_collection/plugins/modules/tower_notification.py b/awx_collection/plugins/modules/tower_notification.py index a41de0d759..f6480a32e1 100644 --- a/awx_collection/plugins/modules/tower_notification.py +++ b/awx_collection/plugins/modules/tower_notification.py @@ -426,7 +426,9 @@ def main(): final_notification_configuration.update(notification_configuration) # Create the data that gets sent for create and update - new_fields = {'notification_configuration': final_notification_configuration} + new_fields = {} + if final_notification_configuration: + new_fields['notification_configuration'] = final_notification_configuration new_fields['name'] = new_name if new_name else name if description is not None: new_fields['description'] = description diff --git a/awx_collection/test/awx/test_notification.py b/awx_collection/test/awx/test_notification.py new file mode 100644 index 0000000000..33ea3cd488 --- /dev/null +++ b/awx_collection/test/awx/test_notification.py @@ -0,0 +1,84 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import pytest + +from awx.main.models import NotificationTemplate + + +def compare_with_encrypted(model_config, param_config): + '''Given a model_config from the database, assure that this is consistent + with the config given in the notification_configuration parameter + this requires handling of password fields + ''' + for key, model_val in model_config.items(): + param_val = param_config.get(key, 'missing') + if isinstance(model_val, str) and (model_val.startswith('$encrypted$') or param_val.startswith('$encrypted$')): + assert model_val.startswith('$encrypted$') # must be saved as encrypted + assert len(model_val) > len('$encrypted$') + else: + assert model_val == param_val, 'Config key {0} did not match, (model: {1}, input: {2})'.format( + key, model_val, param_val + ) + + +@pytest.mark.django_db +def test_create_modify_notification_template(run_module, admin_user, organization): + nt_config = { + 'username': 'user', + 'password': 'password', + 'sender': 'foo@invalid.com', + 'recipients': ['foo2@invalid.com'], + 'host': 'smtp.example.com', + 'port': 25, + 'use_tls': False, 'use_ssl': False, + 'timeout': 4 + } + result = run_module('tower_notification', dict( + name='foo-notification-template', + organization=organization.name, + notification_type='email', + notification_configuration=nt_config, + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert result.pop('changed', None), result + + nt = NotificationTemplate.objects.get(id=result['id']) + compare_with_encrypted(nt.notification_configuration, nt_config) + assert nt.organization == organization + + # Test no-op, this is impossible if the notification_configuration is given + # because we cannot determine if password fields changed + result = run_module('tower_notification', dict( + name='foo-notification-template', + organization=organization.name, + notification_type='email', + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert not result.pop('changed', None), result + + # Test a change in the configuration + nt_config['timeout'] = 12 + result = run_module('tower_notification', dict( + name='foo-notification-template', + organization=organization.name, + notification_type='email', + notification_configuration=nt_config, + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert result.pop('changed', None), result + + nt.refresh_from_db() + compare_with_encrypted(nt.notification_configuration, nt_config) + + +@pytest.mark.django_db +def test_invalid_notification_configuration(run_module, admin_user, organization): + result = run_module('tower_notification', dict( + name='foo-notification-template', + organization=organization.name, + notification_type='email', + notification_configuration={}, + ), admin_user) + assert result.get('failed', False), result.get('msg', result) + assert 'Missing required fields for Notification Configuration' in result['msg']