Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix unit and sanity test issues #117

Merged
merged 9 commits into from
May 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/ansible-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@ jobs:
working-directory: /home/runner/.ansible/collections/ansible_collections/infoblox/nios_modules/

- name: Generate coverage report
run: ansible-test coverage xml -v --group-by command --group-by version
run: |
if [ "${{ matrix.ansible-version }}" == "devel" ]; then pip install coverage==6.3.2; fi
ansible-test coverage xml -v --group-by command --group-by version
working-directory: /home/runner/.ansible/collections/ansible_collections/infoblox/nios_modules/


Expand Down
Binary file removed plugins/.DS_Store
Binary file not shown.
2 changes: 0 additions & 2 deletions plugins/inventory/nios_inventory.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

DOCUMENTATION = r'''
name: nios_inventory
plugin_type: inventory
author:
- Will Tome (@willtome)
short_description: Infoblox inventory plugin
Expand Down Expand Up @@ -42,7 +41,6 @@
- Value can also be specified using C(INFOBLOX_PASSWORD) environment
variable.
type: string
secret: true
env:
- name: INFOBLOX_PASSWORD
extattrs:
Expand Down
5 changes: 3 additions & 2 deletions plugins/lookup/nios_lookup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

DOCUMENTATION = '''
---
lookup: nios
name: nios_lookup
short_description: Query Infoblox NIOS objects
version_added: "1.0.0"
description:
Expand All @@ -28,6 +28,7 @@
return_fields:
description: The list of field names to return for the specified object.
type: list
elements: str
filter:
description: A dict object that is used to filter the returned objects.
type: dict
Expand Down Expand Up @@ -74,7 +75,7 @@
description:
- The object type specified in the terms argument
returned: always
type: complex
type: list
contains:
obj_field:
description:
Expand Down
5 changes: 3 additions & 2 deletions plugins/lookup/nios_next_ip.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

DOCUMENTATION = '''
---
lookup: nios_next_ip
name: nios_next_ip
short_description: Return the next available IP address for a network
version_added: "1.0.0"
description:
Expand All @@ -32,6 +32,7 @@
description: List of IP's that need to be excluded from returned IP addresses.
required: false
type: list
elements: str
'''

EXAMPLES = """
Expand Down Expand Up @@ -80,7 +81,7 @@ def run(self, terms, variables=None, **kwargs):
provider = kwargs.pop('provider', {})
wapi = WapiLookup(provider)

if type(ipaddress.ip_network(network)) == ipaddress.IPv6Network:
if isinstance(ipaddress.ip_network(network), ipaddress.IPv6Network):
network_obj = wapi.get_object('ipv6network', {'network': network})
else:
network_obj = wapi.get_object('network', {'network': network})
Expand Down
4 changes: 2 additions & 2 deletions plugins/lookup/nios_next_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

DOCUMENTATION = '''
---
lookup: nios_next_network
name: nios_next_network
short_description: Return the next available network range for a network-container
version_added: "1.0.0"
description:
Expand All @@ -29,7 +29,6 @@
- The CIDR of the network to retrieve the next network from next available network within the
specified container. Also, Requested CIDR must be specified and greater than the parent CIDR.
required: True
default: 24
type: str
num:
description: The number of network addresses to return from network-container.
Expand All @@ -41,6 +40,7 @@
required: false
default: ''
type: list
elements: str
'''

EXAMPLES = """
Expand Down
Empty file added tests/unit/compat/__init__.py
Empty file.
120 changes: 120 additions & 0 deletions tests/unit/compat/mock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# (c) 2014, Toshio Kuratomi <[email protected]>
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.

# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

'''
Compat module for Python3.x's unittest.mock module
'''
import sys

# Python 2.7

# Note: Could use the pypi mock library on python3.x as well as python2.x. It
# is the same as the python3 stdlib mock library

try:
# Allow wildcard import because we really do want to import all of mock's
# symbols into this compat shim
# pylint: disable=wildcard-import,unused-wildcard-import
from unittest.mock import *
except ImportError:
# Python 2
# pylint: disable=wildcard-import,unused-wildcard-import
try:
from mock import *
except ImportError:
print('You need the mock library installed on python2.x to run tests')


# Prior to 3.4.4, mock_open cannot handle binary read_data
if sys.version_info >= (3,) and sys.version_info < (3, 4, 4):
file_spec = None

def _iterate_read_data(read_data):
# Helper for mock_open:
# Retrieve lines from read_data via a generator so that separate calls to
# readline, read, and readlines are properly interleaved
sep = b'\n' if isinstance(read_data, bytes) else '\n'
data_as_list = [l + sep for l in read_data.split(sep)]

if data_as_list[-1] == sep:
# If the last line ended in a newline, the list comprehension will have an
# extra entry that's just a newline. Remove this.
data_as_list = data_as_list[:-1]
else:
# If there wasn't an extra newline by itself, then the file being
# emulated doesn't have a newline to end the last line remove the
# newline that our naive format() added
data_as_list[-1] = data_as_list[-1][:-1]

for line in data_as_list:
yield line

def mock_open(mock=None, read_data=''):
"""
A helper function to create a mock to replace the use of `open`. It works
for `open` called directly or used as a context manager.
The `mock` argument is the mock object to configure. If `None` (the
default) then a `MagicMock` will be created for you, with the API limited
to methods or attributes available on standard file handles.
`read_data` is a string for the `read` methoddline`, and `readlines` of the
file handle to return. This is an empty string by default.
"""
def _readlines_side_effect(*args, **kwargs):
if handle.readlines.return_value is not None:
return handle.readlines.return_value
return list(_data)

def _read_side_effect(*args, **kwargs):
if handle.read.return_value is not None:
return handle.read.return_value
return type(read_data)().join(_data)

def _readline_side_effect():
if handle.readline.return_value is not None:
while True:
yield handle.readline.return_value
for line in _data:
yield line

global file_spec
if file_spec is None:
import _io
file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))

if mock is None:
mock = MagicMock(name='open', spec=open)

handle = MagicMock(spec=file_spec)
handle.__enter__.return_value = handle

_data = _iterate_read_data(read_data)

handle.write.return_value = None
handle.read.return_value = None
handle.readline.return_value = None
handle.readlines.return_value = None

handle.read.side_effect = _read_side_effect
handle.readline.side_effect = _readline_side_effect()
handle.readlines.side_effect = _readlines_side_effect

mock.return_value = handle
return mock