1
0
Fork 0
iredis/tests/unittests/test_completers.py
Daniel Baumann 3c10eca007
Adding upstream version 1.12.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-02-09 17:08:57 +01:00

439 lines
14 KiB
Python

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",
]