mirror of https://github.com/ansible/ansible.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
# Copyright (c) 2017 Ansible Project
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
from __future__ import (absolute_import, division)
|
|
__metaclass__ = type
|
|
|
|
import json
|
|
|
|
from ansible.compat.tests import unittest
|
|
from ansible.compat.tests.mock import MagicMock
|
|
from units.mock.procenv import swap_stdin_and_argv, swap_stdout
|
|
from ansible.module_utils import basic
|
|
|
|
|
|
class TestCallableTypeValidation(unittest.TestCase):
|
|
def setUp(self):
|
|
args = json.dumps(dict(ANSIBLE_MODULE_ARGS=dict(arg="42")))
|
|
self.stdin_swap_ctx = swap_stdin_and_argv(stdin_data=args)
|
|
self.stdin_swap_ctx.__enter__()
|
|
|
|
# since we can't use context managers and "with" without overriding run(), call them directly
|
|
self.stdout_swap_ctx = swap_stdout()
|
|
self.fake_stream = self.stdout_swap_ctx.__enter__()
|
|
|
|
basic._ANSIBLE_ARGS = None
|
|
|
|
def tearDown(self):
|
|
# since we can't use context managers and "with" without overriding run(), call them directly to clean up
|
|
self.stdin_swap_ctx.__exit__(None, None, None)
|
|
self.stdout_swap_ctx.__exit__(None, None, None)
|
|
|
|
def test_validate_success(self):
|
|
mock_validator = MagicMock(return_value=42)
|
|
m = basic.AnsibleModule(argument_spec=dict(
|
|
arg=dict(type=mock_validator)
|
|
))
|
|
|
|
self.assertTrue(mock_validator.called)
|
|
self.assertEqual(m.params['arg'], 42)
|
|
self.assertEqual(type(m.params['arg']), int)
|
|
|
|
def test_validate_fail(self):
|
|
mock_validator = MagicMock(side_effect=TypeError("bad conversion"))
|
|
with self.assertRaises(SystemExit) as ecm:
|
|
m = basic.AnsibleModule(argument_spec=dict(
|
|
arg=dict(type=mock_validator)
|
|
))
|
|
|
|
self.assertIn("bad conversion", json.loads(self.fake_stream.getvalue())['msg'])
|