1# (c) 2021, NetApp, Inc 2# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 3 4''' unit tests Cloudmanager Ansible module: ''' 5 6from __future__ import (absolute_import, division, print_function) 7__metaclass__ = type 8import json 9import pytest 10 11from ansible.module_utils import basic 12from ansible.module_utils._text import to_bytes 13from ansible_collections.netapp.cloudmanager.tests.unit.compat import unittest 14from ansible_collections.netapp.cloudmanager.tests.unit.compat.mock import patch, Mock 15 16from ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account \ 17 import NetAppCloudmanagerNssAccount as my_module 18 19 20def set_module_args(args): 21 '''prepare arguments so that they will be picked up during module creation''' 22 args = json.dumps({'ANSIBLE_MODULE_ARGS': args}) 23 basic._ANSIBLE_ARGS = to_bytes(args) # pylint: disable=protected-access 24 25 26class AnsibleExitJson(Exception): 27 '''Exception class to be raised by module.exit_json and caught by the test case''' 28 29 30class AnsibleFailJson(Exception): 31 '''Exception class to be raised by module.fail_json and caught by the test case''' 32 33 34def exit_json(*args, **kwargs): # pylint: disable=unused-argument 35 '''function to patch over exit_json; package return data into an exception''' 36 if 'changed' not in kwargs: 37 kwargs['changed'] = False 38 raise AnsibleExitJson(kwargs) 39 40 41def fail_json(*args, **kwargs): # pylint: disable=unused-argument 42 '''function to patch over fail_json; package return data into an exception''' 43 kwargs['failed'] = True 44 raise AnsibleFailJson(kwargs) 45 46 47class MockCMConnection(): 48 ''' Mock response of http connections ''' 49 def __init__(self, kind=None, parm1=None): 50 self.type = kind 51 self.parm1 = parm1 52 self.xml_in = None 53 self.xml_out = None 54 55 56class TestMyModule(unittest.TestCase): 57 ''' a group of related Unit Tests ''' 58 59 def setUp(self): 60 self.mock_module_helper = patch.multiple(basic.AnsibleModule, 61 exit_json=exit_json, 62 fail_json=fail_json) 63 self.mock_module_helper.start() 64 self.addCleanup(self.mock_module_helper.stop) 65 66 def set_default_args_pass_check(self): 67 return dict({ 68 'state': 'present', 69 'name': 'test_nss_account', 70 'username': 'username', 71 'password': 'password', 72 'client_id': 'client_id', 73 'refresh_token': 'refrsh_token' 74 }) 75 76 def test_module_fail_when_required_args_missing(self): 77 ''' required arguments are reported as errors ''' 78 with pytest.raises(AnsibleFailJson) as exc: 79 set_module_args({}) 80 my_module() 81 print('Info: %s' % exc.value.args[0]['msg']) 82 83 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 84 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account.NetAppCloudmanagerNssAccount.get_nss_account') 85 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account.NetAppCloudmanagerNssAccount.create_nss_account') 86 def test_create_nss_account_successfully(self, create, get, get_token): 87 set_module_args(self.set_default_args_pass_check()) 88 get.return_value = None 89 create.return_value = None 90 get_token.return_value = ("type", "token") 91 obj = my_module() 92 obj.rest_api.api_root_path = "test_root_path" 93 94 with pytest.raises(AnsibleExitJson) as exc: 95 obj.apply() 96 assert exc.value.args[0]['changed'] 97 98 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 99 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account.NetAppCloudmanagerNssAccount.get_nss_account') 100 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account.NetAppCloudmanagerNssAccount.create_nss_account') 101 def test_create_nss_account_idempotency(self, create, get, get_token): 102 set_module_args(self.set_default_args_pass_check()) 103 get.return_value = { 104 'name': 'test_nss_account', 105 'username': 'TESTCLOUD1', 106 'password': 'test_test', 107 'client_id': 'Nw4Q2O1kdnLtvhwegGalFnodEHUfPJWh', 108 'refresh_token': 'CvMJXRhz5V4dmxZqVg5LDRDlZyE - kbqRKT9YMcAsjmwFs' 109 } 110 create.return_value = None 111 get_token.return_value = ("type", "token") 112 obj = my_module() 113 obj.rest_api.api_root_path = "test_root_path" 114 115 with pytest.raises(AnsibleExitJson) as exc: 116 obj.apply() 117 assert not exc.value.args[0]['changed'] 118 119 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 120 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account.NetAppCloudmanagerNssAccount.get_nss_account') 121 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_nss_account.NetAppCloudmanagerNssAccount.delete_nss_account') 122 def test_create_nss_account_successfully(self, delete, get, get_token): 123 args = self.set_default_args_pass_check() 124 args['state'] = 'absent' 125 set_module_args(args) 126 get.return_value = { 127 'name': 'test_nss_account', 128 'username': 'TESTCLOUD1', 129 'password': 'test_test', 130 'client_id': 'Nw4Q2O1kdnLtvhwegGalFnodEHUfPJWh', 131 'refresh_token': 'CvMJXRhz5V4dmxZqVg5LDRDlZyE - kbqRKT9YMcAsjmwFs' 132 } 133 delete.return_value = None 134 get_token.return_value = ("type", "token") 135 obj = my_module() 136 obj.rest_api.api_root_path = "test_root_path" 137 138 with pytest.raises(AnsibleExitJson) as exc: 139 obj.apply() 140 assert exc.value.args[0]['changed'] 141