summaryrefslogtreecommitdiffstats
path: root/test/units/module_utils/common/text/converters
diff options
context:
space:
mode:
Diffstat (limited to 'test/units/module_utils/common/text/converters')
-rw-r--r--test/units/module_utils/common/text/converters/test_container_to_bytes.py95
-rw-r--r--test/units/module_utils/common/text/converters/test_container_to_text.py78
-rw-r--r--test/units/module_utils/common/text/converters/test_json_encode_fallback.py68
-rw-r--r--test/units/module_utils/common/text/converters/test_jsonify.py27
-rw-r--r--test/units/module_utils/common/text/converters/test_to_str.py50
5 files changed, 318 insertions, 0 deletions
diff --git a/test/units/module_utils/common/text/converters/test_container_to_bytes.py b/test/units/module_utils/common/text/converters/test_container_to_bytes.py
new file mode 100644
index 0000000..091545e
--- /dev/null
+++ b/test/units/module_utils/common/text/converters/test_container_to_bytes.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019, Andrew Klychkov @Andersson007 <aaklychkov@mail.ru>
+# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.common.text.converters import container_to_bytes
+
+
+DEFAULT_ENCODING = 'utf-8'
+DEFAULT_ERR_HANDLER = 'surrogate_or_strict'
+
+
+@pytest.mark.parametrize(
+ 'test_input,expected',
+ [
+ ({1: 1}, {1: 1}),
+ ([1, 2], [1, 2]),
+ ((1, 2), (1, 2)),
+ (1, 1),
+ (1.1, 1.1),
+ (b'str', b'str'),
+ (u'str', b'str'),
+ ([u'str'], [b'str']),
+ ((u'str'), (b'str')),
+ ({u'str': u'str'}, {b'str': b'str'}),
+ ]
+)
+@pytest.mark.parametrize('encoding', ['utf-8', 'latin1', 'shift_jis', 'big5', 'koi8_r'])
+@pytest.mark.parametrize('errors', ['strict', 'surrogate_or_strict', 'surrogate_then_replace'])
+def test_container_to_bytes(test_input, expected, encoding, errors):
+ """Test for passing objects to container_to_bytes()."""
+ assert container_to_bytes(test_input, encoding=encoding, errors=errors) == expected
+
+
+@pytest.mark.parametrize(
+ 'test_input,expected',
+ [
+ ({1: 1}, {1: 1}),
+ ([1, 2], [1, 2]),
+ ((1, 2), (1, 2)),
+ (1, 1),
+ (1.1, 1.1),
+ (True, True),
+ (None, None),
+ (u'str', u'str'.encode(DEFAULT_ENCODING)),
+ (u'くらとみ', u'くらとみ'.encode(DEFAULT_ENCODING)),
+ (u'café', u'café'.encode(DEFAULT_ENCODING)),
+ (b'str', u'str'.encode(DEFAULT_ENCODING)),
+ (u'str', u'str'.encode(DEFAULT_ENCODING)),
+ ([u'str'], [u'str'.encode(DEFAULT_ENCODING)]),
+ ((u'str'), (u'str'.encode(DEFAULT_ENCODING))),
+ ({u'str': u'str'}, {u'str'.encode(DEFAULT_ENCODING): u'str'.encode(DEFAULT_ENCODING)}),
+ ]
+)
+def test_container_to_bytes_default_encoding_err(test_input, expected):
+ """
+ Test for passing objects to container_to_bytes(). Default encoding and errors
+ """
+ assert container_to_bytes(test_input, encoding=DEFAULT_ENCODING,
+ errors=DEFAULT_ERR_HANDLER) == expected
+
+
+@pytest.mark.parametrize(
+ 'test_input,encoding',
+ [
+ (u'くらとみ', 'latin1'),
+ (u'café', 'shift_jis'),
+ ]
+)
+@pytest.mark.parametrize('errors', ['surrogate_or_strict', 'strict'])
+def test_container_to_bytes_incomp_chars_and_encod(test_input, encoding, errors):
+ """
+ Test for passing incompatible characters and encodings container_to_bytes().
+ """
+ with pytest.raises(UnicodeEncodeError, match="codec can't encode"):
+ container_to_bytes(test_input, encoding=encoding, errors=errors)
+
+
+@pytest.mark.parametrize(
+ 'test_input,encoding,expected',
+ [
+ (u'くらとみ', 'latin1', b'????'),
+ (u'café', 'shift_jis', b'caf?'),
+ ]
+)
+def test_container_to_bytes_surrogate_then_replace(test_input, encoding, expected):
+ """
+ Test for container_to_bytes() with surrogate_then_replace err handler.
+ """
+ assert container_to_bytes(test_input, encoding=encoding,
+ errors='surrogate_then_replace') == expected
diff --git a/test/units/module_utils/common/text/converters/test_container_to_text.py b/test/units/module_utils/common/text/converters/test_container_to_text.py
new file mode 100644
index 0000000..39038f5
--- /dev/null
+++ b/test/units/module_utils/common/text/converters/test_container_to_text.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019, Andrew Klychkov @Andersson007 <aaklychkov@mail.ru>
+# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.common.text.converters import container_to_text
+
+
+DEFAULT_ENCODING = 'utf-8'
+DEFAULT_ERR_HANDLER = 'surrogate_or_strict'
+
+
+@pytest.mark.parametrize(
+ 'test_input,expected',
+ [
+ ({1: 1}, {1: 1}),
+ ([1, 2], [1, 2]),
+ ((1, 2), (1, 2)),
+ (1, 1),
+ (1.1, 1.1),
+ (b'str', u'str'),
+ (u'str', u'str'),
+ ([b'str'], [u'str']),
+ ((b'str'), (u'str')),
+ ({b'str': b'str'}, {u'str': u'str'}),
+ ]
+)
+@pytest.mark.parametrize('encoding', ['utf-8', 'latin1', 'shift-jis', 'big5', 'koi8_r', ])
+@pytest.mark.parametrize('errors', ['strict', 'surrogate_or_strict', 'surrogate_then_replace', ])
+def test_container_to_text_different_types(test_input, expected, encoding, errors):
+ """Test for passing objects to container_to_text()."""
+ assert container_to_text(test_input, encoding=encoding, errors=errors) == expected
+
+
+@pytest.mark.parametrize(
+ 'test_input,expected',
+ [
+ ({1: 1}, {1: 1}),
+ ([1, 2], [1, 2]),
+ ((1, 2), (1, 2)),
+ (1, 1),
+ (1.1, 1.1),
+ (True, True),
+ (None, None),
+ (u'str', u'str'),
+ (u'くらとみ'.encode(DEFAULT_ENCODING), u'くらとみ'),
+ (u'café'.encode(DEFAULT_ENCODING), u'café'),
+ (u'str'.encode(DEFAULT_ENCODING), u'str'),
+ ([u'str'.encode(DEFAULT_ENCODING)], [u'str']),
+ ((u'str'.encode(DEFAULT_ENCODING)), (u'str')),
+ ({b'str': b'str'}, {u'str': u'str'}),
+ ]
+)
+def test_container_to_text_default_encoding_and_err(test_input, expected):
+ """
+ Test for passing objects to container_to_text(). Default encoding and errors
+ """
+ assert container_to_text(test_input, encoding=DEFAULT_ENCODING,
+ errors=DEFAULT_ERR_HANDLER) == expected
+
+
+@pytest.mark.parametrize(
+ 'test_input,encoding,expected',
+ [
+ (u'й'.encode('utf-8'), 'latin1', u'й'),
+ (u'café'.encode('utf-8'), 'shift_jis', u'cafテゥ'),
+ ]
+)
+@pytest.mark.parametrize('errors', ['strict', 'surrogate_or_strict', 'surrogate_then_replace', ])
+def test_container_to_text_incomp_encod_chars(test_input, encoding, errors, expected):
+ """
+ Test for passing incompatible characters and encodings container_to_text().
+ """
+ assert container_to_text(test_input, encoding=encoding, errors=errors) == expected
diff --git a/test/units/module_utils/common/text/converters/test_json_encode_fallback.py b/test/units/module_utils/common/text/converters/test_json_encode_fallback.py
new file mode 100644
index 0000000..022f38f
--- /dev/null
+++ b/test/units/module_utils/common/text/converters/test_json_encode_fallback.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019, Andrew Klychkov @Andersson007 <aaklychkov@mail.ru>
+# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from datetime import datetime, timedelta, tzinfo
+
+from ansible.module_utils.common.text.converters import _json_encode_fallback
+
+
+class timezone(tzinfo):
+ """Simple timezone implementation for use until we drop Python 2.7 support."""
+ def __init__(self, offset):
+ self._offset = offset
+
+ def utcoffset(self, dt):
+ return self._offset
+
+ def dst(self, dt):
+ return timedelta(0)
+
+ def tzname(self, dt):
+ return None
+
+
+@pytest.mark.parametrize(
+ 'test_input,expected',
+ [
+ (set([1]), [1]),
+ (datetime(2019, 5, 14, 13, 39, 38, 569047), '2019-05-14T13:39:38.569047'),
+ (datetime(2019, 5, 14, 13, 47, 16, 923866), '2019-05-14T13:47:16.923866'),
+ (datetime(2019, 6, 15, 14, 45, tzinfo=timezone(timedelta(0))), '2019-06-15T14:45:00+00:00'),
+ (datetime(2019, 6, 15, 14, 45, tzinfo=timezone(timedelta(hours=1, minutes=40))), '2019-06-15T14:45:00+01:40'),
+ ]
+)
+def test_json_encode_fallback(test_input, expected):
+ """
+ Test for passing expected objects to _json_encode_fallback().
+ """
+ assert _json_encode_fallback(test_input) == expected
+
+
+@pytest.mark.parametrize(
+ 'test_input',
+ [
+ 1,
+ 1.1,
+ u'string',
+ b'string',
+ [1, 2],
+ True,
+ None,
+ {1: 1},
+ (1, 2),
+ ]
+)
+def test_json_encode_fallback_default_behavior(test_input):
+ """
+ Test for _json_encode_fallback() default behavior.
+
+ It must fail with TypeError.
+ """
+ with pytest.raises(TypeError, match='Cannot json serialize'):
+ _json_encode_fallback(test_input)
diff --git a/test/units/module_utils/common/text/converters/test_jsonify.py b/test/units/module_utils/common/text/converters/test_jsonify.py
new file mode 100644
index 0000000..a341531
--- /dev/null
+++ b/test/units/module_utils/common/text/converters/test_jsonify.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019, Andrew Klychkov @Andersson007 <aaklychkov@mail.ru>
+# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.common.text.converters import jsonify
+
+
+@pytest.mark.parametrize(
+ 'test_input,expected',
+ [
+ (1, '1'),
+ (u'string', u'"string"'),
+ (u'くらとみ', u'"\\u304f\\u3089\\u3068\\u307f"'),
+ (u'café', u'"caf\\u00e9"'),
+ (b'string', u'"string"'),
+ (False, u'false'),
+ (u'string'.encode('utf-8'), u'"string"'),
+ ]
+)
+def test_jsonify(test_input, expected):
+ """Test for jsonify()."""
+ assert jsonify(test_input) == expected
diff --git a/test/units/module_utils/common/text/converters/test_to_str.py b/test/units/module_utils/common/text/converters/test_to_str.py
new file mode 100644
index 0000000..712ed85
--- /dev/null
+++ b/test/units/module_utils/common/text/converters/test_to_str.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Toshio Kuratomi <tkuratomi@ansible.com>
+# 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, print_function
+__metaclass__ = type
+
+import itertools
+
+import pytest
+
+from ansible.module_utils.six import PY3
+
+from ansible.module_utils.common.text.converters import to_text, to_bytes, to_native
+
+
+# Format: byte representation, text representation, encoding of byte representation
+VALID_STRINGS = (
+ (b'abcde', u'abcde', 'ascii'),
+ (b'caf\xc3\xa9', u'caf\xe9', 'utf-8'),
+ (b'caf\xe9', u'caf\xe9', 'latin-1'),
+ # u'くらとみ'
+ (b'\xe3\x81\x8f\xe3\x82\x89\xe3\x81\xa8\xe3\x81\xbf', u'\u304f\u3089\u3068\u307f', 'utf-8'),
+ (b'\x82\xad\x82\xe7\x82\xc6\x82\xdd', u'\u304f\u3089\u3068\u307f', 'shift-jis'),
+)
+
+
+@pytest.mark.parametrize('in_string, encoding, expected',
+ itertools.chain(((d[0], d[2], d[1]) for d in VALID_STRINGS),
+ ((d[1], d[2], d[1]) for d in VALID_STRINGS)))
+def test_to_text(in_string, encoding, expected):
+ """test happy path of decoding to text"""
+ assert to_text(in_string, encoding) == expected
+
+
+@pytest.mark.parametrize('in_string, encoding, expected',
+ itertools.chain(((d[0], d[2], d[0]) for d in VALID_STRINGS),
+ ((d[1], d[2], d[0]) for d in VALID_STRINGS)))
+def test_to_bytes(in_string, encoding, expected):
+ """test happy path of encoding to bytes"""
+ assert to_bytes(in_string, encoding) == expected
+
+
+@pytest.mark.parametrize('in_string, encoding, expected',
+ itertools.chain(((d[0], d[2], d[1] if PY3 else d[0]) for d in VALID_STRINGS),
+ ((d[1], d[2], d[1] if PY3 else d[0]) for d in VALID_STRINGS)))
+def test_to_native(in_string, encoding, expected):
+ """test happy path of encoding to native strings"""
+ assert to_native(in_string, encoding) == expected