summaryrefslogtreecommitdiffstats
path: root/tests/unittests/test_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unittests/test_utils.py')
-rw-r--r--tests/unittests/test_utils.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/tests/unittests/test_utils.py b/tests/unittests/test_utils.py
new file mode 100644
index 0000000..98ea8db
--- /dev/null
+++ b/tests/unittests/test_utils.py
@@ -0,0 +1,122 @@
+import re
+import time
+import pytest
+from unittest.mock import patch
+
+from iredis.utils import timer, strip_quote_args
+from iredis.commands import split_command_args, split_unknown_args
+from iredis.utils import command_syntax
+from iredis.style import STYLE
+from iredis.exceptions import InvalidArguments, AmbiguousCommand
+from iredis.commands import commands_summary
+from prompt_toolkit import print_formatted_text
+
+
+def test_timer():
+ with patch("iredis.utils.logger") as mock_logger:
+ timer("foo")
+ time.sleep(0.1)
+ timer("bar")
+ mock_logger.debug.assert_called()
+ args, kwargs = mock_logger.debug.call_args
+ matched = re.match(r"\[timer (\d)\] (0\.\d+) -> bar", args[0])
+
+ assert matched.group(1) == str(3)
+ assert 0.1 <= float(matched.group(2)) <= 0.2
+
+ # --- test again ---
+ timer("foo")
+ time.sleep(0.2)
+ timer("bar")
+ mock_logger.debug.assert_called()
+ args, kwargs = mock_logger.debug.call_args
+ matched = re.match(r"\[timer (\d)\] (0\.\d+) -> bar", args[0])
+
+ assert matched.group(1) == str(5)
+ assert 0.2 <= float(matched.group(2)) <= 0.3
+
+
+@pytest.mark.parametrize(
+ "test_input,expected",
+ [
+ ("hello world", ["hello", "world"]),
+ ("'hello world'", ["hello world"]),
+ ('''hello"world"''', ["helloworld"]),
+ (r'''hello\"world"''', [r"hello\world"]),
+ (r'"\\"', [r"\\"]),
+ (r"\\", [r"\\"]),
+ (r"\abcd ef", [r"\abcd", "ef"]),
+ # quotes in quotes
+ (r""" 'hello"world' """, ['hello"world']),
+ (r""" "hello'world" """, ["hello'world"]),
+ (r""" 'hello\'world'""", ["hello'world"]),
+ (r""" "hello\"world" """, ['hello"world']),
+ (r"''", [""]), # set foo "" is a legal command
+ (r'""', [""]), # set foo "" is a legal command
+ (r"\\", ["\\\\"]), # backslash are legal
+ ("\\hello\\", ["\\hello\\"]), # backslash are legal
+ ],
+)
+def test_stripe_quote_escape_in_quote(test_input, expected):
+ assert list(strip_quote_args(test_input)) == expected
+
+
+@pytest.mark.parametrize(
+ "command,expected,args",
+ [
+ ("GET a", "GET", ["a"]),
+ ("cluster info", "cluster info", []),
+ ("getbit foo 17", "getbit", ["foo", "17"]),
+ ("command ", "command", []),
+ (" command count ", "command count", []),
+ (" command count ", "command count", []), # command with multi space
+ (" command count ' hello world'", "command count", [" hello world"]),
+ ("set foo 'hello world'", "set", ["foo", "hello world"]),
+ ],
+)
+def test_split_commands(command, expected, args):
+ parsed_command, parsed_args = split_command_args(command)
+ assert expected == parsed_command
+ assert args == parsed_args
+
+
+def test_split_commands_fail_on_unknown_command():
+ with pytest.raises(InvalidArguments):
+ split_command_args("FOO BAR")
+
+
+@pytest.mark.parametrize(
+ "command",
+ ["command in", "command in", "Command in", "COMMAND in"],
+)
+def test_split_commands_fail_on_partially_input(command):
+ with pytest.raises(AmbiguousCommand):
+ split_command_args(command)
+
+
+def test_split_commands_fail_on_unfinished_command():
+ with pytest.raises(InvalidArguments):
+ split_command_args("setn")
+
+
+def test_render_bottom_with_command_json():
+ for command, info in commands_summary.items():
+ print_formatted_text(command_syntax(command, info), style=STYLE)
+
+
+@pytest.mark.parametrize(
+ "raw,command,args",
+ [
+ ("abc 123", "abc", ["123"]),
+ ("abc", "abc", []),
+ ("abc foo bar", "abc", ["foo", "bar"]),
+ ("abc 'foo bar'", "abc", ["foo bar"]),
+ ('abc "foo bar"', "abc", ["foo bar"]),
+ ('abc "foo bar" 3 hello', "abc", ["foo bar", "3", "hello"]),
+ ('abc "foo \nbar"', "abc", ["foo \nbar"]),
+ ],
+)
+def test_split_unknown_commands(raw, command, args):
+ parsed_command, parsed_args = split_unknown_args(raw)
+ assert command == parsed_command
+ assert args == parsed_args