diff options
Diffstat (limited to 'tests/unittests/test_completers.py')
-rw-r--r-- | tests/unittests/test_completers.py | 439 |
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", + ] |