From fcfcaef4715f73eb766c7e3076ac96559fa92373 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Wed, 9 Dec 2020 08:36:22 +0100 Subject: [PATCH] Improve/fix form handling. --- .../lookup/test_open_url_test_lookup.py | 29 +++++++++++++++++++ .../modules/test_fetch_url_test_module.py | 4 +-- .../unit/utils/fetch_url_module_framework.py | 11 +++---- tests/unit/utils/open_url_framework.py | 11 +++---- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/tests/unit/plugins/lookup/test_open_url_test_lookup.py b/tests/unit/plugins/lookup/test_open_url_test_lookup.py index bf10b8c..1e3664b 100644 --- a/tests/unit/plugins/lookup/test_open_url_test_lookup.py +++ b/tests/unit/plugins/lookup/test_open_url_test_lookup.py @@ -46,6 +46,35 @@ def test_basic(self): assert result[0]['status'] == 200 assert result[0]['content'] == base64.b64encode('hello'.encode('utf-8')).decode('utf-8') + def test_multiple(self): + open_url = OpenUrlProxy([ + OpenUrlCall('POST', 200) + .result_json({'1': 2}) + .return_header('content-type', 'application/json') + .expect_header('foo', 'bar') + .expect_header_unset('baz') + .expect_url('http://example.com'), + OpenUrlCall('POST', 500) + .result_error('Error!'.encode('utf-8')) + .expect_form_present('name') + .expect_form_value('email', 'name@example.com') + .expect_form_value_absent('firstname') + .expect_url('http://example.org'), + ]) + with patch('ansible_collections.community.internal_test_tools.plugins.lookup.open_url_test_lookup.open_url', open_url): + result = self.lookup.run( + ['http://example.com', 'http://example.org'], + [], + method='POST', + headers=dict(foo='bar'), + data=base64.b64encode('name=foo&email=name@example.com'.encode('utf-8')).decode('utf-8'), + ) + open_url.assert_is_done() + + assert len(result) == 2 + assert result[0]['status'] == 200 + assert result[1]['status'] == 500 + def test_error(self): open_url = OpenUrlProxy([ OpenUrlCall('PUT', 404) diff --git a/tests/unit/plugins/modules/test_fetch_url_test_module.py b/tests/unit/plugins/modules/test_fetch_url_test_module.py index 8305aaa..999d075 100644 --- a/tests/unit/plugins/modules/test_fetch_url_test_module.py +++ b/tests/unit/plugins/modules/test_fetch_url_test_module.py @@ -20,9 +20,7 @@ class TestFetchURLTestModule(BaseTestModule): MOCK_ANSIBLE_MODULEUTILS_BASIC_ANSIBLEMODULE = 'ansible_collections.community.internal_test_tools.plugins.modules.fetch_url_test_module.AnsibleModule' MOCK_ANSIBLE_MODULEUTILS_URLS_FETCH_URL = 'ansible_collections.community.internal_test_tools.plugins.modules.fetch_url_test_module.fetch_url' - # Tests for state (absent and present) - - def test_absent_idempotency(self, mocker): + def test_basic(self, mocker): result = self.run_module_success(mocker, fetch_url_test_module, { 'call_sequence': [ { diff --git a/tests/unit/utils/fetch_url_module_framework.py b/tests/unit/utils/fetch_url_module_framework.py index eacee79..339b408 100644 --- a/tests/unit/utils/fetch_url_module_framework.py +++ b/tests/unit/utils/fetch_url_module_framework.py @@ -76,6 +76,7 @@ def test_absent(self, mocker): import ansible.module_utils.basic # noqa import ansible.module_utils.urls # noqa +from ansible.module_utils._text import to_native from ansible_collections.community.internal_test_tools.tests.unit.plugins.modules.utils import set_module_args from ansible.module_utils.six.moves.urllib.parse import parse_qs @@ -212,16 +213,16 @@ def _validate_form(self, call, data): ''' form = {} if data is not None: - form = parse_qs(data, keep_blank_values=True) + form = parse_qs(to_native(data), keep_blank_values=True) for k in call.form_present: - assert k in form + assert k in form, 'Form key "{0}" not present'.format(k) for k, v in call.form_values.items(): if len(v) == 0: - assert k not in form + assert k not in form, 'Form key "{0}" not absent'.format(k) else: - assert form[k] == v + assert form[k] == v, 'Form key "{0}" has not values {1}, but {2}'.format(k, v, form[k]) for k, v in call.form_values_one.items(): - assert v <= set(form[k]) + assert v <= set(form[k]), 'Form key "{0}" has values {2}, which does not include all of {1}'.format(k, v, form[k]) def _validate_headers(self, call, headers): ''' diff --git a/tests/unit/utils/open_url_framework.py b/tests/unit/utils/open_url_framework.py index 870e47a..922e479 100644 --- a/tests/unit/utils/open_url_framework.py +++ b/tests/unit/utils/open_url_framework.py @@ -85,6 +85,7 @@ def test_populate(inventory, mocker): from mock import MagicMock +from ansible.module_utils._text import to_native from ansible.module_utils.six.moves.urllib.error import HTTPError from ansible.module_utils.six.moves.urllib.parse import parse_qs @@ -234,16 +235,16 @@ def _validate_form(self, call, data): ''' form = {} if data is not None: - form = parse_qs(data, keep_blank_values=True) + form = parse_qs(to_native(data), keep_blank_values=True) for k in call.form_present: - assert k in form + assert k in form, 'Form key "{0}" not present'.format(k) for k, v in call.form_values.items(): if len(v) == 0: - assert k not in form + assert k not in form, 'Form key "{0}" not absent'.format(k) else: - assert form[k] == v + assert form[k] == v, 'Form key "{0}" has not values {1}, but {2}'.format(k, v, form[k]) for k, v in call.form_values_one.items(): - assert v <= set(form[k]) + assert v <= set(form[k]), 'Form key "{0}" has values {2}, which does not include all of {1}'.format(k, v, form[k]) def _validate_headers(self, call, headers): '''