summaryrefslogtreecommitdiffstats
path: root/tests/unittests/test_completers.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unittests/test_completers.py')
-rw-r--r--tests/unittests/test_completers.py439
1 files changed, 439 insertions, 0 deletions
diff --git a/tests/unittests/test_completers.py b/tests/unittests/test_completers.py
new file mode 100644
index 0000000..5441b0e
--- /dev/null
+++ b/tests/unittests/test_completers.py
@@ -0,0 +1,439 @@
+from unittest.mock import MagicMock, patch
+
+import pendulum
+from prompt_toolkit.formatted_text import FormattedText
+from prompt_toolkit.completion import Completion
+
+from iredis.completers import MostRecentlyUsedFirstWordCompleter
+from iredis.completers import IRedisCompleter, TimestampCompleter, IntegerTypeCompleter
+
+
+def test_LUF_completer_touch():
+ c = MostRecentlyUsedFirstWordCompleter(3, ["one", "two"])
+ c.touch("hello")
+ assert c.words == ["hello", "one", "two"]
+
+ c.touch("foo")
+ assert c.words == ["foo", "hello", "one"]
+
+ c.touch("hello")
+ assert c.words == ["hello", "foo", "one"]
+
+
+def test_LUF_completer_touch_words():
+ c = MostRecentlyUsedFirstWordCompleter(3, [])
+ c.touch_words(["hello", "world", "foo", "bar"])
+ assert c.words == ["bar", "foo", "world"]
+
+ c.touch_words(["one", "two"])
+ assert c.words == ["two", "one", "bar"]
+
+
+def test_newbie_mode_complete_without_meta_dict():
+ fake_document = MagicMock()
+ fake_document.text_before_cursor = fake_document.text = "GEOR"
+ completer = IRedisCompleter(hint=False)
+ completions = list(completer.get_completions(fake_document, None))
+ assert [word.text for word in completions] == ["GEORADIUS", "GEORADIUSBYMEMBER"]
+ assert [word.display_meta for word in completions] == [
+ FormattedText([("", "")]),
+ FormattedText([("", "")]),
+ ]
+
+
+def test_newbie_mode_complete_with_meta_dict():
+ fake_document = MagicMock()
+ fake_document.text_before_cursor = fake_document.text = "GEOR"
+ completer = IRedisCompleter(hint=True)
+ completions = list(completer.get_completions(fake_document, None))
+
+ assert sorted([completion.display_meta for completion in completions]) == [
+ FormattedText(
+ [
+ (
+ "",
+ "Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member", # noqa
+ )
+ ]
+ ),
+ FormattedText(
+ [
+ (
+ "",
+ "Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point", # noqa
+ )
+ ]
+ ),
+ ]
+
+
+def test_newbie_mode_complete_with_meta_dict_command_is_lowercase():
+ fake_document = MagicMock()
+ fake_document.text_before_cursor = fake_document.text = "geor"
+ completer = IRedisCompleter(hint=True)
+ completions = list(completer.get_completions(fake_document, None))
+
+ assert sorted([completion.display_meta for completion in completions]) == [
+ FormattedText(
+ [
+ (
+ "",
+ "Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member", # noqa
+ )
+ ]
+ ),
+ FormattedText(
+ [
+ (
+ "",
+ "Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point", # noqa
+ )
+ ]
+ ),
+ ]
+
+
+def test_iredis_completer_update_for_response():
+ c = IRedisCompleter()
+ c.update_completer_for_response(
+ "HGETALL",
+ (),
+ [
+ b"Behave",
+ b"misbehave",
+ b"Interpret",
+ b"misinterpret",
+ b"Lead",
+ b"mislead",
+ b"Trust",
+ b"mistrust",
+ ],
+ )
+ assert c.field_completer.words == ["Trust", "Lead", "Interpret", "Behave"]
+
+
+def test_categoryname_completer_update_for_response():
+ c = IRedisCompleter()
+ c.update_completer_for_response(
+ "ACL CAT",
+ (),
+ [b"scripting", b"watch"],
+ )
+ assert sorted(c.catetoryname_completer.words) == ["scripting", "watch"]
+ c.update_completer_for_response(
+ "ACL CAT",
+ ("scripting"),
+ [b"foo", b"bar"],
+ )
+ assert sorted(c.catetoryname_completer.words) == ["scripting", "watch"]
+
+
+def test_completer_when_there_are_spaces_in_command():
+ c = IRedisCompleter()
+ c.update_completer_for_response(
+ "ACL cat",
+ (),
+ [b"scripting", b"watch"],
+ )
+ assert sorted(c.catetoryname_completer.words) == ["scripting", "watch"]
+
+ c.update_completer_for_response(
+ "acl \t cat",
+ (),
+ [b"hello", b"world"],
+ )
+ assert sorted(c.catetoryname_completer.words) == [
+ "hello",
+ "scripting",
+ "watch",
+ "world",
+ ]
+
+
+def test_iredis_completer_no_exception_for_none_response():
+ c = IRedisCompleter()
+ c.update_completer_for_response("XPENDING", None, None)
+ c.update_completer_for_response("KEYS", None, None)
+
+
+def test_group_completer():
+ fake_document = MagicMock()
+ previous_commands = ["xgroup create abc world 123", "xgroup setid abc hello 123"]
+ fake_document.text = fake_document.text_before_cursor = "XGROUP DESTROY key "
+ completer = IRedisCompleter()
+ for command in previous_commands:
+ completer.update_completer_for_input(command)
+ completions = list(completer.get_completions(fake_document, None))
+ assert completions == [
+ Completion(
+ text="hello",
+ start_position=0,
+ display=FormattedText([("", "hello")]),
+ display_meta=FormattedText([("", "")]),
+ ),
+ Completion(
+ text="world",
+ start_position=0,
+ display=FormattedText([("", "world")]),
+ display_meta=FormattedText([("", "")]),
+ ),
+ ]
+
+
+@patch("iredis.completers.pendulum.now")
+def test_timestamp_completer_humanize_time_completion(fake_now):
+ fake_now.return_value = pendulum.from_timestamp(1578487013)
+ c = TimestampCompleter(is_milliseconds=True, future_time=False)
+
+ fake_document = MagicMock()
+ fake_document.text = fake_document.text_before_cursor = "30"
+ completions = list(c.get_completions(fake_document, None))
+
+ assert completions == [
+ Completion(
+ text="1575895013000",
+ start_position=-2,
+ display=FormattedText([("", "1575895013000")]),
+ display_meta="30 days ago (2019-12-09 12:36:53)",
+ ),
+ Completion(
+ text="1578379013000",
+ start_position=-2,
+ display=FormattedText([("", "1578379013000")]),
+ display_meta="30 hours ago (2020-01-07 06:36:53)",
+ ),
+ Completion(
+ text="1578485213000",
+ start_position=-2,
+ display=FormattedText([("", "1578485213000")]),
+ display_meta="30 minutes ago (2020-01-08 12:06:53)",
+ ),
+ Completion(
+ text="1578486983000",
+ start_position=-2,
+ display=FormattedText([("", "1578486983000")]),
+ display_meta="30 seconds ago (2020-01-08 12:36:23)",
+ ),
+ ]
+
+ # No plural
+ fake_document.text = fake_document.text_before_cursor = "1"
+ completions = list(c.get_completions(fake_document, None))
+
+ assert completions == [
+ Completion(
+ text="1546951013000",
+ start_position=-1,
+ display=FormattedText([("", "1546951013000")]),
+ display_meta="1 year ago (2019-01-08 12:36:53)",
+ ),
+ Completion(
+ text="1575808613000",
+ start_position=-1,
+ display=FormattedText([("", "1575808613000")]),
+ display_meta="1 month ago (2019-12-08 12:36:53)",
+ ),
+ Completion(
+ text="1578400613000",
+ start_position=-1,
+ display=FormattedText([("", "1578400613000")]),
+ display_meta="1 day ago (2020-01-07 12:36:53)",
+ ),
+ Completion(
+ text="1578483413000",
+ start_position=-1,
+ display=FormattedText([("", "1578483413000")]),
+ display_meta="1 hour ago (2020-01-08 11:36:53)",
+ ),
+ Completion(
+ text="1578486953000",
+ start_position=-1,
+ display=FormattedText([("", "1578486953000")]),
+ display_meta="1 minute ago (2020-01-08 12:35:53)",
+ ),
+ Completion(
+ text="1578487012000",
+ start_position=-1,
+ display=FormattedText([("", "1578487012000")]),
+ display_meta="1 second ago (2020-01-08 12:36:52)",
+ ),
+ ]
+
+
+@patch("iredis.completers.pendulum.now")
+def test_timestamp_completer_humanize_time_completion_seconds(fake_now):
+ fake_now.return_value = pendulum.from_timestamp(1578487013)
+ c = TimestampCompleter(is_milliseconds=False, future_time=False)
+
+ fake_document = MagicMock()
+ fake_document.text = fake_document.text_before_cursor = "30"
+ completions = list(c.get_completions(fake_document, None))
+
+ assert completions == [
+ Completion(
+ text="1575895013",
+ start_position=-2,
+ display=FormattedText([("", "1575895013")]),
+ display_meta="30 days ago (2019-12-09 12:36:53)",
+ ),
+ Completion(
+ text="1578379013",
+ start_position=-2,
+ display=FormattedText([("", "1578379013")]),
+ display_meta="30 hours ago (2020-01-07 06:36:53)",
+ ),
+ Completion(
+ text="1578485213",
+ start_position=-2,
+ display=FormattedText([("", "1578485213")]),
+ display_meta="30 minutes ago (2020-01-08 12:06:53)",
+ ),
+ Completion(
+ text="1578486983",
+ start_position=-2,
+ display=FormattedText([("", "1578486983")]),
+ display_meta="30 seconds ago (2020-01-08 12:36:23)",
+ ),
+ ]
+
+
+@patch("iredis.completers.pendulum.now")
+def test_timestamp_completer_humanize_time_completion_seconds_future_time(fake_now):
+ fake_now.return_value = pendulum.from_timestamp(1578487013)
+ c = TimestampCompleter(is_milliseconds=False, future_time=True)
+
+ fake_document = MagicMock()
+ fake_document.text = fake_document.text_before_cursor = "30"
+ completions = list(c.get_completions(fake_document, None))
+
+ print(completions)
+ for c in completions:
+ print(c.text)
+ print(c.display)
+ print(c.display_meta)
+ assert completions == [
+ Completion(
+ text="1578487043",
+ start_position=-2,
+ display=FormattedText([("", "1578487043")]),
+ display_meta="30 seconds later (2020-01-08 12:37:23)",
+ ),
+ Completion(
+ text="1578488813",
+ start_position=-2,
+ display=FormattedText([("", "1578488813")]),
+ display_meta="30 minutes later (2020-01-08 13:06:53)",
+ ),
+ Completion(
+ text="1578595013",
+ start_position=-2,
+ display=FormattedText([("", "1578595013")]),
+ display_meta="30 hours later (2020-01-09 18:36:53)",
+ ),
+ Completion(
+ text="1581079013",
+ start_position=-2,
+ display=FormattedText([("", "1581079013")]),
+ display_meta="30 days later (2020-02-07 12:36:53)",
+ ),
+ ]
+
+
+def test_timestamp_completer_datetime_format_time_completion():
+ c = TimestampCompleter(is_milliseconds=True, future_time=False)
+ fake_document = MagicMock()
+ fake_document.text = fake_document.text_before_cursor = "2020-02-07"
+ completions = list(c.get_completions(fake_document, None))
+
+ assert completions == [
+ Completion(
+ text="1581033600000",
+ start_position=-10,
+ display=FormattedText([("", "1581033600000")]),
+ display_meta="2020-02-07T00:00:00+00:00",
+ )
+ ]
+
+
+def test_integer_type_completer():
+ c = IntegerTypeCompleter()
+ fake_document = MagicMock()
+ fake_document.text = fake_document.get_word_before_cursor.return_value = "i"
+ completions = list(c.get_completions(fake_document, None))
+ assert len(completions) == 64
+
+ fake_document.text = fake_document.get_word_before_cursor.return_value = "u"
+ completions = list(c.get_completions(fake_document, None))
+ assert len(completions) == 63
+
+ c.touch("u4")
+ assert list(c.get_completions(fake_document, None))[0].text == "u4"
+
+
+def test_completion_casing():
+ c = IRedisCompleter(completion_casing="auto")
+ fake_document = MagicMock()
+ fake_document.text = fake_document.text_before_cursor = "ge"
+ assert [
+ completion.text for completion in c.get_completions(fake_document, None)
+ ] == [
+ "get",
+ "getex",
+ "getset",
+ "getdel",
+ "getbit",
+ "geopos",
+ "geoadd",
+ "geohash",
+ "geodist",
+ "getrange",
+ "geosearch",
+ "georadius",
+ "geosearchstore",
+ "georadiusbymember",
+ ]
+
+ c = IRedisCompleter(completion_casing="auto")
+ fake_document.text = fake_document.text_before_cursor = "GET"
+ assert [
+ completion.text for completion in c.get_completions(fake_document, None)
+ ] == ["GET", "GETEX", "GETSET", "GETDEL", "GETBIT", "GETRANGE"]
+
+ c = IRedisCompleter(completion_casing="upper")
+ fake_document.text = fake_document.text_before_cursor = "get"
+ assert [
+ completion.text for completion in c.get_completions(fake_document, None)
+ ] == ["GET", "GETEX", "GETSET", "GETDEL", "GETBIT", "GETRANGE"]
+
+ c = IRedisCompleter(completion_casing="lower")
+ fake_document.text = fake_document.text_before_cursor = "GET"
+ assert [
+ completion.text for completion in c.get_completions(fake_document, None)
+ ] == ["get", "getex", "getset", "getdel", "getbit", "getrange"]
+
+
+def test_username_completer():
+ completer = IRedisCompleter()
+ completer.update_completer_for_input("acl deluser laixintao")
+ completer.update_completer_for_input("acl deluser antirez")
+
+ fake_document = MagicMock()
+ fake_document.text_before_cursor = fake_document.text = "acl deluser "
+ completions = list(completer.get_completions(fake_document, None))
+ assert sorted([completion.text for completion in completions]) == [
+ "antirez",
+ "laixintao",
+ ]
+
+
+def test_username_touch_for_response():
+ c = IRedisCompleter()
+ c.update_completer_for_response(
+ "acl users",
+ (),
+ [b"hello", b"world"],
+ )
+ assert sorted(c.username_completer.words) == [
+ "hello",
+ "world",
+ ]