From 92e2ad80e1d3a068e534fa16a931eae9a8470511 Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 13:30:00 -0500 Subject: [PATCH 1/7] Add basic unit tests for meraki_admin - Reformat meraki_admin.py with black - Break module creation into a separate function - Create basic unit tests for find_admin --- plugins/__init__.py | 0 plugins/modules/meraki_admin.py | 322 +++++++++++++++++--------------- tests/__init__.py | 0 tests/unit/__init__.py | 0 tests/unit/test_meraki_admin.py | 68 +++++++ 5 files changed, 237 insertions(+), 153 deletions(-) create mode 100644 plugins/__init__.py create mode 100644 tests/__init__.py create mode 100644 tests/unit/__init__.py create mode 100644 tests/unit/test_meraki_admin.py diff --git a/plugins/__init__.py b/plugins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/plugins/modules/meraki_admin.py b/plugins/modules/meraki_admin.py index e554bb00..e664fe3f 100644 --- a/plugins/modules/meraki_admin.py +++ b/plugins/modules/meraki_admin.py @@ -5,15 +5,16 @@ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function + __metaclass__ = type ANSIBLE_METADATA = { - 'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community' + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", } -DOCUMENTATION = r''' +DOCUMENTATION = r""" --- module: meraki_admin short_description: Manage administrators in the Meraki cloud @@ -91,9 +92,9 @@ author: - Kevin Breit (@kbreit) extends_documentation_fragment: cisco.meraki.meraki -''' +""" -EXAMPLES = r''' +EXAMPLES = r""" - name: Query information about all administrators associated to the organization meraki_admin: auth_key: abc12345 @@ -174,9 +175,9 @@ networks: - id: N_12345 access: full -''' +""" -RETURN = r''' +RETURN = r""" data: description: List of administrators. returned: success @@ -253,21 +254,19 @@ type: str sample: full -''' +""" import os from ansible.module_utils.basic import AnsibleModule, json -from ansible_collections.cisco.meraki.plugins.module_utils.network.meraki.meraki import MerakiModule, meraki_argument_spec +from ansible_collections.cisco.meraki.plugins.module_utils.network.meraki.meraki import ( + MerakiModule, + meraki_argument_spec, +) def get_admins(meraki, org_id): admins = meraki.request( - meraki.construct_path( - 'query', - function='admin', - org_id=org_id - ), - method='GET' + meraki.construct_path("query", function="admin", org_id=org_id), method="GET" ) if meraki.status == 200: return admins @@ -276,39 +275,39 @@ def get_admins(meraki, org_id): def get_admin_id(meraki, data, name=None, email=None): admin_id = None for a in data: - if meraki.params['name'] is not None: - if meraki.params['name'] == a['name']: + if meraki.params["name"] is not None: + if meraki.params["name"] == a["name"]: if admin_id is not None: - meraki.fail_json(msg='There are multiple administrators with the same name') + meraki.fail_json( + msg="There are multiple administrators with the same name" + ) else: - admin_id = a['id'] - elif meraki.params['email']: - if meraki.params['email'] == a['email']: - return a['id'] + admin_id = a["id"] + elif meraki.params["email"]: + if meraki.params["email"] == a["email"]: + return a["id"] if admin_id is None: - meraki.fail_json(msg='No admin_id found') + meraki.fail_json(msg="No admin_id found") return admin_id def get_admin(meraki, data, id): for a in data: - if a['id'] == id: + if a["id"] == id: return a - meraki.fail_json(msg='No admin found by specified name or email') + meraki.fail_json(msg="No admin found by specified name or email") -def find_admin(meraki, data, email): +def find_admin(data, email): for a in data: - if a['email'] == email: + if a["email"] == email: return a return None def delete_admin(meraki, org_id, admin_id): - path = meraki.construct_path('revoke', 'admin', org_id=org_id) + admin_id - r = meraki.request(path, - method='DELETE' - ) + path = meraki.construct_path("revoke", "admin", org_id=org_id) + admin_id + r = meraki.request(path, method="DELETE") if meraki.status == 204: return r @@ -316,128 +315,142 @@ def delete_admin(meraki, org_id, admin_id): def network_factory(meraki, networks, nets): networks_new = [] for n in networks: - if 'network' in n and n['network'] is not None: - networks_new.append({'id': meraki.get_net_id(org_name=meraki.params['org_name'], - net_name=n['network'], - data=nets), - 'access': n['access'] - }) - elif 'id' in n: - networks_new.append({'id': n['id'], - 'access': n['access'] - }) + if "network" in n and n["network"] is not None: + networks_new.append( + { + "id": meraki.get_net_id( + org_name=meraki.params["org_name"], + net_name=n["network"], + data=nets, + ), + "access": n["access"], + } + ) + elif "id" in n: + networks_new.append({"id": n["id"], "access": n["access"]}) return networks_new def create_admin(meraki, org_id, name, email): payload = dict() - payload['name'] = name - payload['email'] = email + payload["name"] = name + payload["email"] = email - is_admin_existing = find_admin(meraki, get_admins(meraki, org_id), email) + is_admin_existing = find_admin(get_admins(meraki, org_id), email) - if meraki.params['org_access'] is not None: - payload['orgAccess'] = meraki.params['org_access'] - if meraki.params['tags'] is not None: - payload['tags'] = meraki.params['tags'] - if meraki.params['networks'] is not None: + if meraki.params["org_access"] is not None: + payload["orgAccess"] = meraki.params["org_access"] + if meraki.params["tags"] is not None: + payload["tags"] = meraki.params["tags"] + if meraki.params["networks"] is not None: nets = meraki.get_nets(org_id=org_id) - networks = network_factory(meraki, meraki.params['networks'], nets) - payload['networks'] = networks + networks = network_factory(meraki, meraki.params["networks"], nets) + payload["networks"] = networks if is_admin_existing is None: # Create new admin if meraki.module.check_mode is True: - meraki.result['data'] = payload - meraki.result['changed'] = True + meraki.result["data"] = payload + meraki.result["changed"] = True meraki.exit_json(**meraki.result) - path = meraki.construct_path('create', function='admin', org_id=org_id) - r = meraki.request(path, - method='POST', - payload=json.dumps(payload) - ) + path = meraki.construct_path("create", function="admin", org_id=org_id) + r = meraki.request(path, method="POST", payload=json.dumps(payload)) if meraki.status == 201: - meraki.result['changed'] = True + meraki.result["changed"] = True return r elif is_admin_existing is not None: # Update existing admin - if not meraki.params['tags']: - payload['tags'] = [] - if not meraki.params['networks']: - payload['networks'] = [] + if not meraki.params["tags"]: + payload["tags"] = [] + if not meraki.params["networks"]: + payload["networks"] = [] if meraki.is_update_required(is_admin_existing, payload) is True: if meraki.module.check_mode is True: meraki.generate_diff(is_admin_existing, payload) is_admin_existing.update(payload) - meraki.result['changed'] = True - meraki.result['data'] = payload + meraki.result["changed"] = True + meraki.result["data"] = payload meraki.exit_json(**meraki.result) - path = meraki.construct_path('update', function='admin', org_id=org_id) + is_admin_existing['id'] - r = meraki.request(path, - method='PUT', - payload=json.dumps(payload) - ) + path = ( + meraki.construct_path("update", function="admin", org_id=org_id) + + is_admin_existing["id"] + ) + r = meraki.request(path, method="PUT", payload=json.dumps(payload)) if meraki.status == 200: - meraki.result['changed'] = True + meraki.result["changed"] = True return r else: - meraki.result['data'] = is_admin_existing + meraki.result["data"] = is_admin_existing if meraki.module.check_mode is True: - meraki.result['data'] = payload + meraki.result["data"] = payload meraki.exit_json(**meraki.result) return -1 -def main(): - # define the available arguments/parameters that a user can pass to - # the module - - network_arg_spec = dict(id=dict(type='str'), - network=dict(type='str'), - access=dict(type='str'), - ) +def setup_module_object(): + network_arg_spec = dict( + id=dict(type="str"), + network=dict(type="str"), + access=dict(type="str"), + ) - tag_arg_spec = dict(tag=dict(type='str'), - access=dict(type='str'), - ) + tag_arg_spec = dict( + tag=dict(type="str"), + access=dict(type="str"), + ) argument_spec = meraki_argument_spec() - argument_spec.update(state=dict(type='str', choices=['present', 'query', 'absent'], required=True), - name=dict(type='str'), - email=dict(type='str'), - org_access=dict(type='str', aliases=['orgAccess'], choices=['full', 'read-only', 'none']), - tags=dict(type='list', elements='dict', options=tag_arg_spec), - networks=dict(type='list', elements='dict', options=network_arg_spec), - org_name=dict(type='str', aliases=['organization']), - org_id=dict(type='str'), - ) + argument_spec.update( + state=dict(type="str", choices=["present", "query", "absent"], required=True), + name=dict(type="str"), + email=dict(type="str"), + org_access=dict( + type="str", aliases=["orgAccess"], choices=["full", "read-only", "none"] + ), + tags=dict(type="list", elements="dict", options=tag_arg_spec), + networks=dict(type="list", elements="dict", options=network_arg_spec), + org_name=dict(type="str", aliases=["organization"]), + org_id=dict(type="str"), + ) # the AnsibleModule object will be our abstraction working with Ansible # this includes instantiation, a couple of common attr would be the # args/params passed to the execution, as well as if the module # supports check mode - module = AnsibleModule(argument_spec=argument_spec, - supports_check_mode=True, - ) - meraki = MerakiModule(module, function='admin') - - meraki.function = 'admin' - meraki.params['follow_redirects'] = 'all' - - query_urls = {'admin': '/organizations/{org_id}/admins', - } - create_urls = {'admin': '/organizations/{org_id}/admins', - } - update_urls = {'admin': '/organizations/{org_id}/admins/', - } - revoke_urls = {'admin': '/organizations/{org_id}/admins/', - } - - meraki.url_catalog['query'] = query_urls - meraki.url_catalog['create'] = create_urls - meraki.url_catalog['update'] = update_urls - meraki.url_catalog['revoke'] = revoke_urls + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + ) + return MerakiModule(module, function="admin") + + +def main(): + # define the available arguments/parameters that a user can pass to + # the module + + meraki = setup_module_object() + + meraki.function = "admin" + meraki.params["follow_redirects"] = "all" + + query_urls = { + "admin": "/organizations/{org_id}/admins", + } + create_urls = { + "admin": "/organizations/{org_id}/admins", + } + update_urls = { + "admin": "/organizations/{org_id}/admins/", + } + revoke_urls = { + "admin": "/organizations/{org_id}/admins/", + } + + meraki.url_catalog["query"] = query_urls + meraki.url_catalog["create"] = create_urls + meraki.url_catalog["update"] = update_urls + meraki.url_catalog["revoke"] = revoke_urls try: - meraki.params['auth_key'] = os.environ['MERAKI_KEY'] + meraki.params["auth_key"] = os.environ["MERAKI_KEY"] except KeyError: pass @@ -446,59 +459,62 @@ def main(): # state with no modifications # execute checks for argument completeness - if meraki.params['state'] == 'query': - meraki.mututally_exclusive = ['name', 'email'] - if not meraki.params['org_name'] and not meraki.params['org_id']: - meraki.fail_json(msg='org_name or org_id required') - meraki.required_if = [(['state'], ['absent'], ['email']), - ] + if meraki.params["state"] == "query": + meraki.mututally_exclusive = ["name", "email"] + if not meraki.params["org_name"] and not meraki.params["org_id"]: + meraki.fail_json(msg="org_name or org_id required") + meraki.required_if = [ + (["state"], ["absent"], ["email"]), + ] # manipulate or modify the state as needed (this is going to be the # part where your module will do what it needs to do) - org_id = meraki.params['org_id'] - if not meraki.params['org_id']: - org_id = meraki.get_org_id(meraki.params['org_name']) - if meraki.params['state'] == 'query': + org_id = meraki.params["org_id"] + if not meraki.params["org_id"]: + org_id = meraki.get_org_id(meraki.params["org_name"]) + if meraki.params["state"] == "query": admins = get_admins(meraki, org_id) - if not meraki.params['name'] and not meraki.params['email']: # Return all admins for org - meraki.result['data'] = admins - if meraki.params['name'] is not None: # Return a single admin for org - admin_id = get_admin_id(meraki, admins, name=meraki.params['name']) - meraki.result['data'] = admin_id + if ( + not meraki.params["name"] and not meraki.params["email"] + ): # Return all admins for org + meraki.result["data"] = admins + if meraki.params["name"] is not None: # Return a single admin for org + admin_id = get_admin_id(meraki, admins, name=meraki.params["name"]) + meraki.result["data"] = admin_id admin = get_admin(meraki, admins, admin_id) - meraki.result['data'] = admin - elif meraki.params['email'] is not None: - admin_id = get_admin_id(meraki, admins, email=meraki.params['email']) - meraki.result['data'] = admin_id + meraki.result["data"] = admin + elif meraki.params["email"] is not None: + admin_id = get_admin_id(meraki, admins, email=meraki.params["email"]) + meraki.result["data"] = admin_id admin = get_admin(meraki, admins, admin_id) - meraki.result['data'] = admin - elif meraki.params['state'] == 'present': - r = create_admin(meraki, - org_id, - meraki.params['name'], - meraki.params['email'], - ) + meraki.result["data"] = admin + elif meraki.params["state"] == "present": + r = create_admin( + meraki, + org_id, + meraki.params["name"], + meraki.params["email"], + ) if r != -1: - meraki.result['data'] = r - elif meraki.params['state'] == 'absent': + meraki.result["data"] = r + elif meraki.params["state"] == "absent": if meraki.module.check_mode is True: - meraki.result['data'] = {} - meraki.result['changed'] = True + meraki.result["data"] = {} + meraki.result["changed"] = True meraki.exit_json(**meraki.result) - admin_id = get_admin_id(meraki, - get_admins(meraki, org_id), - email=meraki.params['email'] - ) + admin_id = get_admin_id( + meraki, get_admins(meraki, org_id), email=meraki.params["email"] + ) r = delete_admin(meraki, org_id, admin_id) if r != -1: - meraki.result['data'] = r - meraki.result['changed'] = True + meraki.result["data"] = r + meraki.result["changed"] = True # in the event of a successful module execution, you will want to # simple AnsibleModule.exit_json(), passing the key/value results meraki.exit_json(**meraki.result) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/test_meraki_admin.py b/tests/unit/test_meraki_admin.py new file mode 100644 index 00000000..f0e45f4e --- /dev/null +++ b/tests/unit/test_meraki_admin.py @@ -0,0 +1,68 @@ +import pytest +from plugins.modules.meraki_admin import find_admin + + +def test_find_admin_success(): + data = [ + { + "id": "1234", + "name": "John Doe", + "email": "john.doe@example.com", + "authenticationMethod": "Email", + "orgAccess": "full", + "accountStatus": "ok", + "twoFactorAuthEnabled": True, + "hasApiKey": False, + "lastActive": "2022-04-13T13:48:51Z", + "networks": [], + "tags": [], + }, + { + "id": "4321", + "name": "Jane Doe", + "email": "jane.dow@example.com", + "authenticationMethod": "Email", + "orgAccess": "full", + "accountStatus": "ok", + "twoFactorAuthEnabled": False, + "hasApiKey": False, + "lastActive": "2021-05-13T18:58:32Z", + "networks": [], + "tags": [], + }, + ] + result = find_admin(data, "john.doe@example.com") + assert result == data[0] + + +def test_find_admin_fail(): + data = [ + { + "id": "1234", + "name": "John Doe", + "email": "john.doe@example.com", + "authenticationMethod": "Email", + "orgAccess": "full", + "accountStatus": "ok", + "twoFactorAuthEnabled": True, + "hasApiKey": False, + "lastActive": "2022-04-13T13:48:51Z", + "networks": [], + "tags": [], + }, + { + "id": "4321", + "name": "Jane Doe", + "email": "jane.dow@example.com", + "authenticationMethod": "Email", + "orgAccess": "full", + "accountStatus": "ok", + "twoFactorAuthEnabled": False, + "hasApiKey": False, + "lastActive": "2021-05-13T18:58:32Z", + "networks": [], + "tags": [], + }, + ] + result = find_admin(data, "not.john.doe@example.com") + assert result == None From 33612a9358d9b89993d6d6c2492fdc7b9790e309 Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 15:43:18 -0500 Subject: [PATCH 2/7] Added test_get_admin_id_success() unit test --- plugins/modules/meraki_admin.py | 38 ++++++++++++++++++++------------- tests/unit/test_meraki_admin.py | 37 +++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/plugins/modules/meraki_admin.py b/plugins/modules/meraki_admin.py index e664fe3f..840caf06 100644 --- a/plugins/modules/meraki_admin.py +++ b/plugins/modules/meraki_admin.py @@ -272,23 +272,21 @@ def get_admins(meraki, org_id): return admins -def get_admin_id(meraki, data, name=None, email=None): +def get_admin_id(params, data, name=None, email=None): admin_id = None for a in data: - if meraki.params["name"] is not None: - if meraki.params["name"] == a["name"]: + if params["name"] is not None: + if params["name"] == a["name"]: if admin_id is not None: - meraki.fail_json( - msg="There are multiple administrators with the same name" - ) + return None, "There are multiple administrators with the same name" else: admin_id = a["id"] - elif meraki.params["email"]: - if meraki.params["email"] == a["email"]: - return a["id"] + elif params["email"]: + if params["email"] == a["email"]: + return a["id"], None if admin_id is None: - meraki.fail_json(msg="No admin_id found") - return admin_id + return admin_id, "No admin_id found" + return admin_id, None def get_admin(meraki, data, id): @@ -479,12 +477,20 @@ def main(): ): # Return all admins for org meraki.result["data"] = admins if meraki.params["name"] is not None: # Return a single admin for org - admin_id = get_admin_id(meraki, admins, name=meraki.params["name"]) + admin_id, err = get_admin_id( + meraki.params, admins, name=meraki.params["name"] + ) + if err is not None: + meraki.fail_json(msg=err) meraki.result["data"] = admin_id admin = get_admin(meraki, admins, admin_id) meraki.result["data"] = admin elif meraki.params["email"] is not None: - admin_id = get_admin_id(meraki, admins, email=meraki.params["email"]) + admin_id, err = get_admin_id( + meraki.params, admins, email=meraki.params["email"] + ) + if err is not None: + meraki.fail_json(msg=err) meraki.result["data"] = admin_id admin = get_admin(meraki, admins, admin_id) meraki.result["data"] = admin @@ -502,9 +508,11 @@ def main(): meraki.result["data"] = {} meraki.result["changed"] = True meraki.exit_json(**meraki.result) - admin_id = get_admin_id( - meraki, get_admins(meraki, org_id), email=meraki.params["email"] + admin_id, err = get_admin_id( + meraki.params, get_admins(meraki, org_id), email=meraki.params["email"] ) + if err is not None: + meraki.fail_json(msg=err) r = delete_admin(meraki, org_id, admin_id) if r != -1: diff --git a/tests/unit/test_meraki_admin.py b/tests/unit/test_meraki_admin.py index f0e45f4e..28e70661 100644 --- a/tests/unit/test_meraki_admin.py +++ b/tests/unit/test_meraki_admin.py @@ -1,5 +1,5 @@ import pytest -from plugins.modules.meraki_admin import find_admin +from plugins.modules.meraki_admin import find_admin, get_admin_id def test_find_admin_success(): @@ -66,3 +66,38 @@ def test_find_admin_fail(): ] result = find_admin(data, "not.john.doe@example.com") assert result == None + + +def test_get_admin_id_success(): + data = [ + { + "id": "1234", + "name": "John Doe", + "email": "john.doe@example.com", + "authenticationMethod": "Email", + "orgAccess": "full", + "accountStatus": "ok", + "twoFactorAuthEnabled": True, + "hasApiKey": False, + "lastActive": "2022-04-13T13:48:51Z", + "networks": [], + "tags": [], + }, + { + "id": "4321", + "name": "Jane Doe", + "email": "jane.dow@example.com", + "authenticationMethod": "Email", + "orgAccess": "full", + "accountStatus": "ok", + "twoFactorAuthEnabled": False, + "hasApiKey": False, + "lastActive": "2021-05-13T18:58:32Z", + "networks": [], + "tags": [], + }, + ] + result = get_admin_id({"name": "John Doe", "id": "1234"}, data) + print(result[0]) + print(data[0]["id"]) + assert result[0] == data[0]["id"] From b41fd8349b6325ebe4e9704d851ba9e66d0b9c77 Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 21:47:18 -0500 Subject: [PATCH 3/7] Complete test coverage for get_admin_id --- tests/unit/test_meraki_admin.py | 104 ++++++++++++-------------------- 1 file changed, 38 insertions(+), 66 deletions(-) diff --git a/tests/unit/test_meraki_admin.py b/tests/unit/test_meraki_admin.py index 28e70661..b728011f 100644 --- a/tests/unit/test_meraki_admin.py +++ b/tests/unit/test_meraki_admin.py @@ -2,7 +2,8 @@ from plugins.modules.meraki_admin import find_admin, get_admin_id -def test_find_admin_success(): +@pytest.fixture +def admin_data(): data = [ { "id": "1234", @@ -31,73 +32,44 @@ def test_find_admin_success(): "tags": [], }, ] - result = find_admin(data, "john.doe@example.com") - assert result == data[0] + return data -def test_find_admin_fail(): - data = [ - { - "id": "1234", - "name": "John Doe", - "email": "john.doe@example.com", - "authenticationMethod": "Email", - "orgAccess": "full", - "accountStatus": "ok", - "twoFactorAuthEnabled": True, - "hasApiKey": False, - "lastActive": "2022-04-13T13:48:51Z", - "networks": [], - "tags": [], - }, - { - "id": "4321", - "name": "Jane Doe", - "email": "jane.dow@example.com", - "authenticationMethod": "Email", - "orgAccess": "full", - "accountStatus": "ok", - "twoFactorAuthEnabled": False, - "hasApiKey": False, - "lastActive": "2021-05-13T18:58:32Z", - "networks": [], - "tags": [], - }, - ] - result = find_admin(data, "not.john.doe@example.com") +def test_find_admin_success(admin_data): + result = find_admin(admin_data, "john.doe@example.com") + assert result == admin_data[0] + + +def test_find_admin_fail(admin_data): + result = find_admin(admin_data, "not.john.doe@example.com") assert result == None -def test_get_admin_id_success(): - data = [ - { - "id": "1234", - "name": "John Doe", - "email": "john.doe@example.com", - "authenticationMethod": "Email", - "orgAccess": "full", - "accountStatus": "ok", - "twoFactorAuthEnabled": True, - "hasApiKey": False, - "lastActive": "2022-04-13T13:48:51Z", - "networks": [], - "tags": [], - }, - { - "id": "4321", - "name": "Jane Doe", - "email": "jane.dow@example.com", - "authenticationMethod": "Email", - "orgAccess": "full", - "accountStatus": "ok", - "twoFactorAuthEnabled": False, - "hasApiKey": False, - "lastActive": "2021-05-13T18:58:32Z", - "networks": [], - "tags": [], - }, - ] - result = get_admin_id({"name": "John Doe", "id": "1234"}, data) - print(result[0]) - print(data[0]["id"]) - assert result[0] == data[0]["id"] +def test_get_admin_id_by_name_success(admin_data): + result = get_admin_id( + {"name": "John Doe", "id": "1234"}, admin_data, name="John Doe" + ) + assert result[0] == admin_data[0]["id"] + + +def test_get_admin_id_by_namenot_found(admin_data): + result = get_admin_id( + {"name": "Not John Doe", "id": "1234"}, admin_data, name="ASDF" + ) + assert result[1] == "No admin_id found" + + +def test_get_admin_id_by_email_success(admin_data): + result = get_admin_id( + {"name": "John Doe", "id": "1234"}, admin_data, email="john.doe@example.com" + ) + assert result[0] == admin_data[0]["id"] + + +def test_get_admin_id_by_emailnot_found(admin_data): + result = get_admin_id( + {"name": "Not John Doe", "id": "1234"}, + admin_data, + email="not.john.doe@example.com", + ) + assert result[1] == "No admin_id found" From a6d6dd630ce41c35d4481ba963588588fdf7023b Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 21:48:23 -0500 Subject: [PATCH 4/7] Add pytest to CICD pipeline --- .github/workflows/ansible-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ansible-test.yml b/.github/workflows/ansible-test.yml index 00503609..e8a9452e 100644 --- a/.github/workflows/ansible-test.yml +++ b/.github/workflows/ansible-test.yml @@ -27,3 +27,6 @@ jobs: - name: Run sanity tests run: ansible-test sanity --docker -v --color + + - name: Run pytest + run: pytest From b49450e79b21197ba1069bdd1fbdcffd43b96e21 Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 21:52:31 -0500 Subject: [PATCH 5/7] Fix comparison --- tests/unit/test_meraki_admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_meraki_admin.py b/tests/unit/test_meraki_admin.py index b728011f..e5870174 100644 --- a/tests/unit/test_meraki_admin.py +++ b/tests/unit/test_meraki_admin.py @@ -42,7 +42,7 @@ def test_find_admin_success(admin_data): def test_find_admin_fail(admin_data): result = find_admin(admin_data, "not.john.doe@example.com") - assert result == None + assert result is None def test_get_admin_id_by_name_success(admin_data): From 8a819d56c3b0ded88b3a40afc4b07729be35c4a1 Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 21:55:36 -0500 Subject: [PATCH 6/7] Install pytest --- .github/workflows/ansible-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ansible-test.yml b/.github/workflows/ansible-test.yml index e8a9452e..1fc9cd1d 100644 --- a/.github/workflows/ansible-test.yml +++ b/.github/workflows/ansible-test.yml @@ -22,6 +22,9 @@ jobs: - name: Install ansible-base (devel) run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check + - name: Install pytest + run: pip install pytest + - name: Show ansible-base version run: ansible --version From f3c83e97095c32997072f81425763330703a3072 Mon Sep 17 00:00:00 2001 From: Kevin Breit Date: Sat, 16 Jul 2022 21:57:10 -0500 Subject: [PATCH 7/7] Change test order --- .github/workflows/ansible-test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ansible-test.yml b/.github/workflows/ansible-test.yml index 1fc9cd1d..c4ce336d 100644 --- a/.github/workflows/ansible-test.yml +++ b/.github/workflows/ansible-test.yml @@ -28,8 +28,8 @@ jobs: - name: Show ansible-base version run: ansible --version - - name: Run sanity tests - run: ansible-test sanity --docker -v --color - - name: Run pytest run: pytest + + - name: Run sanity tests + run: ansible-test sanity --docker -v --color