diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/test_common.py | 23 | ||||
-rw-r--r-- | test/test_completion.py | 24 | ||||
-rw-r--r-- | test/test_config.py | 16 | ||||
-rw-r--r-- | test/test_logger.py | 98 | ||||
-rw-r--r-- | test/test_tabs.py | 50 | ||||
-rw-r--r-- | test/test_text_buffer.py | 200 | ||||
-rw-r--r-- | test/test_ui/test_funcs.py | 46 | ||||
-rw-r--r-- | test/test_ui/test_render.py | 144 | ||||
-rw-r--r-- | test/test_ui/test_types.py | 126 | ||||
-rw-r--r-- | test/test_user.py | 44 | ||||
-rw-r--r-- | test/test_windows.py | 28 | ||||
-rw-r--r-- | test/test_xhtml.py | 6 |
12 files changed, 759 insertions, 46 deletions
diff --git a/test/test_common.py b/test/test_common.py index d7bc2b8b..3235632d 100644 --- a/test/test_common.py +++ b/test/test_common.py @@ -11,7 +11,7 @@ from poezio.common import (_datetime_tuple as datetime_tuple, get_utc_time, get_local_time, shell_split, _find_argument_quoted as find_argument_quoted, _find_argument_unquoted as find_argument_unquoted, parse_str_to_secs, - parse_secs_to_str, safeJID) + parse_secs_to_str, unique_prefix_of) def test_utc_time(): delta = timedelta(seconds=-3600) @@ -60,6 +60,21 @@ def test_parse_secs_to_str(): with pytest.raises(TypeError): parse_secs_to_str('toto') -def test_safeJID(): - assert safeJID('toto@titi/tata') == JID('toto@titi/tata') - assert safeJID('toto@…') == JID('') +def test_unique_prefix_of__no_shared_prefix(): + assert unique_prefix_of("a", "b") == "a" + assert unique_prefix_of("foo", "bar") == "f" + assert unique_prefix_of("foo", "") == "f" + +def test_unique_prefix_of__equal(): + assert unique_prefix_of("foo", "foo") == "foo" + +def test_unique_prefix_of__a_prefix(): + assert unique_prefix_of("foo", "foobar") == "foo" + +def test_unique_prefix_of__b_prefix(): + assert unique_prefix_of("foobar", "foo") == "foob" + +def test_unique_prefix_of__normal_shared_prefix(): + assert unique_prefix_of("foobar", "foobaz") == "foobar" + assert unique_prefix_of("fnord", "funky") == "fn" + assert unique_prefix_of("asbestos", "aspergers") == "asb" diff --git a/test/test_completion.py b/test/test_completion.py index 4c5bc400..1a970470 100644 --- a/test/test_completion.py +++ b/test/test_completion.py @@ -5,23 +5,35 @@ Test the completions methods on an altered input object. import string import pytest import random +from poezio import config +from poezio.windows import Input + class ConfigShim(object): def get(self, *args, **kwargs): return '' + def getbool(self, *args, **kwargs): + return False + -from poezio import config config.config = ConfigShim() -from poezio.windows import Input + +class SubInput(Input): + def resize(self, *args, **kwargs): + pass + def rewrite_text(self, *args, **kwargs): + pass + def refresh(self, *args, **kwargs): + pass + @pytest.fixture(scope="function") def input_obj(): - obj = Input() + from poezio.windows import base_wins + base_wins.TAB_WIN = True + obj = SubInput() obj.reset_completion() - obj.resize = lambda: None - obj.rewrite_text = lambda: None - obj.refresh = lambda: None return obj @pytest.fixture(scope="module") diff --git a/test/test_config.py b/test/test_config.py index 4632410b..8e92bf3f 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -9,8 +9,10 @@ from pathlib import Path import pytest from poezio import config +from slixmpp import JID -@pytest.yield_fixture(scope="module") + +@pytest.fixture(scope="module") def config_obj(): file_ = tempfile.NamedTemporaryFile(delete=False) conf = config.Config(file_name=Path(file_.name)) @@ -18,6 +20,7 @@ def config_obj(): del conf os.unlink(file_.name) + class TestConfigSimple(object): def test_get_set(self, config_obj): config_obj.set_and_save('test', value='coucou') @@ -97,16 +100,15 @@ class TestConfigSections(object): class TestTabNames(object): def test_get_tabname(self, config_obj): - config.post_logging_setup() config_obj.set_and_save('test', value='value.toto@toto.com', section='toto@toto.com') config_obj.set_and_save('test2', value='value2@toto.com', section='@toto.com') - assert config_obj.get_by_tabname('test', 'toto@toto.com') == 'value.toto@toto.com' - assert config_obj.get_by_tabname('test2', 'toto@toto.com') == 'value2@toto.com' - assert config_obj.get_by_tabname('test2', 'toto@toto.com', fallback=False) == 'value2@toto.com' - assert config_obj.get_by_tabname('test2', 'toto@toto.com', fallback_server=False) == 'true' - assert config_obj.get_by_tabname('test_int', 'toto@toto.com', fallback=False) == '' + assert config_obj.get_by_tabname('test', JID('toto@toto.com')) == 'value.toto@toto.com' + assert config_obj.get_by_tabname('test2', JID('toto@toto.com')) == 'value2@toto.com' + assert config_obj.get_by_tabname('test2', JID('toto@toto.com'), fallback=False) == 'value2@toto.com' + assert config_obj.get_by_tabname('test2', JID('toto@toto.com'), fallback_server=False) == 'true' + assert config_obj.get_by_tabname('test_int', JID('toto@toto.com'), fallback=False) == '' diff --git a/test/test_logger.py b/test/test_logger.py index f1851d60..a1caad52 100644 --- a/test/test_logger.py +++ b/test/test_logger.py @@ -2,32 +2,110 @@ Test the functions in the `logger` module """ import datetime -from poezio.logger import LogMessage, parse_log_line, parse_log_lines, build_log_message -from poezio.common import get_utc_time, get_local_time +from pathlib import Path +from random import sample +from shutil import rmtree +from string import hexdigits +from poezio import logger +from poezio.logger import ( + LogMessage, parse_log_line, parse_log_lines, build_log_message +) +from poezio.ui.types import Message +from poezio.common import get_utc_time +import pytest + + +class ConfigShim: + def __init__(self, value): + self.value = value + + def get_by_tabname(self, name, *args, **kwargs): + return self.value + + +logger.config = ConfigShim(True) + + +@pytest.fixture +def log_dir(): + name = 'tmplog-' + ''.join(sample(hexdigits, 16)) + path = Path('/tmp', name) + try: + yield path + finally: + rmtree(path, ignore_errors=True) + + +def read_file(logger, name): + if '/' in name: + name = name.replace('/', '\\') + filename = logger.log_dir / f'{name}' + with open(filename) as fd: + return fd.read() + + +def test_log_roster(log_dir): + instance = logger.Logger() + instance.log_dir = log_dir + instance.log_roster_change('toto@example.com', 'test test') + content = read_file(instance, 'roster.log') + assert content[:3] == 'MI ' + assert content[-32:] == ' 000 toto@example.com test test\n' + + +def test_log_message(log_dir): + instance = logger.Logger() + instance.log_dir = log_dir + msg = Message('content', 'toto') + instance.log_message('toto@example.com', msg) + content = read_file(instance, 'toto@example.com') + line = parse_log_lines(content.split('\n'), '')[0] + assert line['nickname'] == 'toto' + assert line['txt'] == 'content' + msg2 = Message('content\ncontent2', 'titi') + instance.log_message('toto@example.com', msg2) + content = read_file(instance, 'toto@example.com') + lines = parse_log_lines(content.split('\n'), '') + + assert lines[0]['nickname'] == 'toto' + assert lines[0]['txt'] == 'content' + assert lines[1]['nickname'] == 'titi' + assert lines[1]['txt'] == 'content\ncontent2' + def test_parse_message(): line = 'MR 20170909T09:09:09Z 000 <nick> body' - assert vars(parse_log_line(line)) == vars(LogMessage('2017', '09', '09', '09', '09', '09', '0', 'nick', 'body')) + assert vars(parse_log_line(line, 'user@domain')) == vars(LogMessage('2017', '09', '09', '09', '09', '09', '0', 'nick', 'body')) line = '<>' - assert parse_log_line(line) is None + assert parse_log_line(line, 'user@domain') is None line = 'MR 20170908T07:05:04Z 003 <nick> ' - assert vars(parse_log_line(line)) == vars(LogMessage('2017', '09', '08', '07', '05', '04', '003', 'nick', '')) + assert vars(parse_log_line(line, 'user@domain')) == vars(LogMessage('2017', '09', '08', '07', '05', '04', '003', 'nick', '')) def test_log_and_parse_messages(): - msg1 = {'nick': 'toto', 'msg': 'coucou', 'date': datetime.datetime.now().replace(microsecond=0)} + msg1 = { + 'nick': 'toto', + 'msg': 'coucou', + 'date': datetime.datetime.now().replace(microsecond=0), + 'prefix': 'MR', + } msg1_utc = get_utc_time(msg1['date']) built_msg1 = build_log_message(**msg1) assert built_msg1 == 'MR %s 000 <toto> coucou\n' % (msg1_utc.strftime('%Y%m%dT%H:%M:%SZ')) - msg2 = {'nick': 'toto', 'msg': 'coucou\ncoucou', 'date': datetime.datetime.now().replace(microsecond=0)} + msg2 = { + 'nick': 'toto', + 'msg': 'coucou\ncoucou', + 'date': datetime.datetime.now().replace(microsecond=0), + 'prefix': 'MR', + } built_msg2 = build_log_message(**msg2) msg2_utc = get_utc_time(msg2['date']) assert built_msg2 == 'MR %s 001 <toto> coucou\n coucou\n' % (msg2_utc.strftime('%Y%m%dT%H:%M:%SZ')) - assert parse_log_lines((built_msg1 + built_msg2).split('\n')) == [ - {'time': msg1['date'], 'history': True, 'txt': '\x195,-1}coucou', 'nickname': 'toto'}, - {'time': msg2['date'], 'history': True, 'txt': '\x195,-1}coucou\ncoucou', 'nickname': 'toto'}, + assert parse_log_lines((built_msg1 + built_msg2).split('\n'), 'user@domain') == [ + {'time': msg1['date'], 'history': True, 'txt': 'coucou', 'nickname': 'toto', 'type': 'message'}, + {'time': msg2['date'], 'history': True, 'txt': 'coucou\ncoucou', 'nickname': 'toto', 'type': 'message'}, ] diff --git a/test/test_tabs.py b/test/test_tabs.py index 0a6930d4..d2503df2 100644 --- a/test/test_tabs.py +++ b/test/test_tabs.py @@ -12,16 +12,24 @@ class DummyTab(Tab): count = 0 def __init__(self): - self.name = 'dummy%s' % self.count + self._name = 'dummy%s' % self.count DummyTab.count += 1 + @property + def name(self): + return self._name + + @name.setter + def name(self, value): + self._name = value + @staticmethod def reset(): DummyTab.count = 0 def test_append(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() tabs.append(dummy) assert tabs[0] is dummy @@ -38,7 +46,7 @@ def test_append(): def test_delete(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() tabs.append(dummy) @@ -53,7 +61,7 @@ def test_delete(): def test_delete_restore_previous(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -74,7 +82,7 @@ def test_delete_restore_previous(): def test_delete_other_tab(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -94,7 +102,7 @@ def test_delete_other_tab(): def test_insert_and_gaps(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -117,7 +125,7 @@ def test_insert_and_gaps(): def test_replace_tabs(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -132,7 +140,7 @@ def test_replace_tabs(): def test_prev_next(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -158,7 +166,7 @@ def test_prev_next(): def test_set_current(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -174,7 +182,7 @@ def test_set_current(): def test_slice(): DummyTab.reset() - tabs = Tabs(h) + tabs = Tabs(h, None) dummy = DummyTab() dummy2 = DummyTab() dummy3 = DummyTab() @@ -183,3 +191,25 @@ def test_slice(): tabs.append(dummy3) assert tabs[1:2][0] is dummy2 + +def test_find_by_unique_prefix(): + DummyTab.reset() + tabs = Tabs(h, None) + t1 = DummyTab() + t2 = DummyTab() + t3 = DummyTab() + tabs.append(t1) + tabs.append(t2) + tabs.append(t3) + + t1.name = "foo" + t2.name = "bar" + t3.name = "fnord" + + assert tabs.find_by_unique_prefix("f") == (True, None) + assert tabs.find_by_unique_prefix("b") == (True, t2) + assert tabs.find_by_unique_prefix("fo") == (True, t1) + assert tabs.find_by_unique_prefix("fn") == (True, t3) + assert tabs.find_by_unique_prefix("fx") == (False, None) + assert tabs.find_by_unique_prefix("x") == (False, None) + assert tabs.find_by_unique_prefix("") == (True, None) diff --git a/test/test_text_buffer.py b/test/test_text_buffer.py new file mode 100644 index 00000000..3daf54d4 --- /dev/null +++ b/test/test_text_buffer.py @@ -0,0 +1,200 @@ +""" +Tests for the TextBuffer class +""" +from pytest import fixture + +from poezio.text_buffer import ( + TextBuffer, + HistoryGap, +) + +from poezio.ui.types import ( + Message, + BaseMessage, + MucOwnJoinMessage, + MucOwnLeaveMessage, +) + + +@fixture(scope='function') +def buf2048(): + return TextBuffer(2048) + + +@fixture(scope='function') +def msgs_nojoin(): + msg1 = Message('1', 'q') + msg2 = Message('2', 's') + leave = MucOwnLeaveMessage('leave') + return [msg1, msg2, leave] + + +@fixture(scope='function') +def msgs_noleave(): + join = MucOwnJoinMessage('join') + msg3 = Message('3', 'd') + msg4 = Message('4', 'f') + return [join, msg3, msg4] + + +@fixture(scope='function') +def msgs_doublejoin(): + join = MucOwnJoinMessage('join') + msg1 = Message('1', 'd') + msg2 = Message('2', 'f') + join2 = MucOwnJoinMessage('join') + return [join, msg1, msg2, join2] + + +def test_last_message(buf2048): + msg = BaseMessage('toto') + buf2048.add_message(BaseMessage('titi')) + buf2048.add_message(msg) + assert buf2048.last_message is msg + + +def test_message_nb_limit(): + buf = TextBuffer(5) + for i in range(10): + buf.add_message(BaseMessage("%s" % i)) + assert len(buf.messages) == 5 + + +def test_find_gap(buf2048, msgs_noleave): + msg1 = Message('1', 'q') + msg2 = Message('2', 's') + leave = MucOwnLeaveMessage('leave') + join = MucOwnJoinMessage('join') + msg3 = Message('3', 'd') + msg4 = Message('4', 'f') + msgs = [msg1, msg2, leave, join, msg3, msg4] + for msg in msgs: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert gap.leave_message == leave + assert gap.join_message == join + assert gap.last_timestamp_before_leave == msg2.time + assert gap.first_timestamp_after_join == msg3.time + + +def test_find_gap_doublejoin(buf2048, msgs_doublejoin): + for msg in msgs_doublejoin: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert gap.leave_message == msgs_doublejoin[2] + assert gap.join_message == msgs_doublejoin[3] + + +def test_find_gap_doublejoin_no_msg(buf2048): + join1 = MucOwnJoinMessage('join') + join2 = MucOwnJoinMessage('join') + for msg in [join1, join2]: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert gap.leave_message is join1 + assert gap.join_message is join2 + + +def test_find_gap_already_filled(buf2048): + msg1 = Message('1', 'q') + msg2 = Message('2', 's') + leave = MucOwnLeaveMessage('leave') + msg5 = Message('5', 'g') + msg6 = Message('6', 'h') + join = MucOwnJoinMessage('join') + msg3 = Message('3', 'd') + msg4 = Message('4', 'f') + msgs = [msg1, msg2, leave, msg5, msg6, join, msg3, msg4] + for msg in msgs: + buf2048.add_message(msg) + assert buf2048.find_last_gap_muc() is None + + +def test_find_gap_noleave(buf2048, msgs_noleave): + for msg in msgs_noleave: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert gap.leave_message is None + assert gap.last_timestamp_before_leave is None + assert gap.join_message == msgs_noleave[0] + assert gap.first_timestamp_after_join == msgs_noleave[1].time + + +def test_find_gap_nojoin(buf2048, msgs_nojoin): + for msg in msgs_nojoin: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert gap.leave_message == msgs_nojoin[-1] + assert gap.join_message is None + assert gap.last_timestamp_before_leave == msgs_nojoin[1].time + + +def test_get_gap_index(buf2048): + msg1 = Message('1', 'q') + msg2 = Message('2', 's') + leave = MucOwnLeaveMessage('leave') + join = MucOwnJoinMessage('join') + msg3 = Message('3', 'd') + msg4 = Message('4', 'f') + msgs = [msg1, msg2, leave, join, msg3, msg4] + for msg in msgs: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert buf2048.get_gap_index(gap) == 3 + + +def test_get_gap_index_doublejoin(buf2048, msgs_doublejoin): + for msg in msgs_doublejoin: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert buf2048.get_gap_index(gap) == 3 + + +def test_get_gap_index_doublejoin_no_msg(buf2048): + join1 = MucOwnJoinMessage('join') + join2 = MucOwnJoinMessage('join') + for msg in [join1, join2]: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert buf2048.get_gap_index(gap) == 1 + + +def test_get_gap_index_nojoin(buf2048, msgs_nojoin): + for msg in msgs_nojoin: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert buf2048.get_gap_index(gap) == 3 + + +def test_get_gap_index_noleave(buf2048, msgs_noleave): + for msg in msgs_noleave: + buf2048.add_message(msg) + gap = buf2048.find_last_gap_muc() + assert buf2048.get_gap_index(gap) == 0 + + +def test_add_history_messages(buf2048): + msg1 = Message('1', 'q') + msg2 = Message('2', 's') + leave = MucOwnLeaveMessage('leave') + join = MucOwnJoinMessage('join') + msg3 = Message('3', 'd') + msg4 = Message('4', 'f') + msgs = [msg1, msg2, leave, join, msg3, msg4] + for msg in msgs: + buf2048.add_message(msg) + msg5 = Message('5', 'g') + msg6 = Message('6', 'h') + gap = buf2048.find_last_gap_muc() + buf2048.add_history_messages([msg5, msg6], gap=gap) + assert buf2048.messages == [msg1, msg2, leave, msg5, msg6, join, msg3, msg4] + + +def test_add_history_empty(buf2048): + msg1 = Message('1', 'q') + msg2 = Message('2', 's') + msg3 = Message('3', 'd') + msg4 = Message('4', 'f') + buf2048.add_message(msg1) + buf2048.add_history_messages([msg2, msg3, msg4]) + assert buf2048.messages == [msg2, msg3, msg4, msg1] diff --git a/test/test_ui/test_funcs.py b/test/test_ui/test_funcs.py new file mode 100644 index 00000000..0e61549c --- /dev/null +++ b/test/test_ui/test_funcs.py @@ -0,0 +1,46 @@ +from poezio.ui.funcs import ( + find_first_format_char, + parse_attrs, + truncate_nick, +) + + +def test_find_char_not_present(): + assert find_first_format_char("toto") == -1 + + +def test_find_char(): + assert find_first_format_char('a \x1A 1') == 2 + + +def test_truncate_nick(): + assert truncate_nick("toto") == "toto" + + +def test_truncate_nick_wrong_size(): + assert truncate_nick("toto", -10) == "t…" + + +def test_truncate_nick_too_long(): + nick = "012345678901234567" + assert truncate_nick(nick) == nick[:10] + "…" + + +def test_truncate_nick_no_nick(): + assert truncate_nick('') == '' + + +def test_parse_attrs(): + text = "\x19o\x19u\x19b\x19i\x191}\x19o\x194}" + assert parse_attrs(text) == ['4}'] + + +def test_parse_attrs_broken_char(): + text = "coucou\x19" + assert parse_attrs(text) == [] + + +def test_parse_attrs_previous(): + text = "coucou" + previous = ['u'] + assert parse_attrs(text, previous=previous) == previous diff --git a/test/test_ui/test_render.py b/test/test_ui/test_render.py new file mode 100644 index 00000000..bdfc1be6 --- /dev/null +++ b/test/test_ui/test_render.py @@ -0,0 +1,144 @@ +import pytest +from contextlib import contextmanager +from datetime import datetime +from poezio.theming import get_theme +from poezio.ui.render import build_lines, Line, write_pre +from poezio.ui.types import BaseMessage, Message, StatusMessage, XMLLog + +def test_simple_build_basemsg(): + msg = BaseMessage(txt='coucou') + line = build_lines(msg, 100, True, 10)[0] + assert (line.start_pos, line.end_pos) == (0, 6) + + +def test_simple_render_message(): + msg = Message(txt='coucou', nickname='toto') + line = build_lines(msg, 100, True, 10)[0] + assert (line.start_pos, line.end_pos) == (0, 6) + + +def test_simple_render_xmllog(): + msg = XMLLog(txt='coucou', incoming=True) + line = build_lines(msg, 100, True, 10)[0] + assert (line.start_pos, line.end_pos) == (0, 6) + + +def test_simple_render_separator(): + line = build_lines(None, 100, True, 10)[0] + assert line is None + + +def test_simple_render_status(): + class Obj: + name = 'toto' + msg = StatusMessage("Coucou {name}", {'name': lambda: Obj.name}) + assert msg.txt == "Coucou toto" + Obj.name = 'titi' + build_lines(msg, 100, True, 10)[0] + assert msg.txt == "Coucou titi" + + +class FakeBuffer: + def __init__(self): + self.text = '' + + @contextmanager + def colored_text(self, *args, **kwargs): + yield None + + def addstr(self, txt): + self.text += txt + +@pytest.fixture(scope='function') +def buffer(): + return FakeBuffer() + +@pytest.fixture +def time(): + return datetime.strptime('2019-09-27 10:11:12', '%Y-%m-%d %H:%M:%S') + +def test_write_pre_basemsg(buffer): + str_time = '10:11:12' + time = datetime.strptime(str_time, '%H:%M:%S') + msg = BaseMessage(txt='coucou', time=time) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '10:11:12 ' + assert size == len(buffer.text) + +def test_write_pre_message_simple(buffer, time): + msg = Message(txt='coucou', nickname='toto', time=time) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '10:11:12 toto> ' + assert size == len(buffer.text) + + +def test_write_pre_message_simple_history(buffer, time): + msg = Message(txt='coucou', nickname='toto', time=time, history=True) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '2019-09-27 10:11:12 toto> ' + assert size == len(buffer.text) + + +def test_write_pre_message_highlight(buffer, time): + msg = Message(txt='coucou', nickname='toto', time=time, highlight=True) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '10:11:12 toto> ' + assert size == len(buffer.text) + +def test_write_pre_message_no_timestamp(buffer): + msg = Message(txt='coucou', nickname='toto') + size = write_pre(msg, buffer, False, 10) + assert buffer.text == 'toto> ' + assert size == len(buffer.text) + + +def test_write_pre_message_me(buffer, time): + msg = Message(txt='/me coucou', nickname='toto', time=time) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '10:11:12 * toto ' + assert size == len(buffer.text) + + +def test_write_pre_message_revisions(buffer, time): + msg = Message(txt='coucou', nickname='toto', time=time, revisions=5) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '10:11:12 toto5> ' + assert size == len(buffer.text) + +def test_write_pre_message_revisions_me(buffer, time): + msg = Message(txt='/me coucou', nickname='toto', time=time, revisions=5) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '10:11:12 * toto5 ' + assert size == len(buffer.text) + + +def test_write_pre_message_ack(buffer, time): + ack = get_theme().CHAR_ACK_RECEIVED + expected = '10:11:12 %s toto> ' % ack + msg = Message(txt='coucou', nickname='toto', time=time, ack=1) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == expected + assert size == len(buffer.text) + + +def test_write_pre_message_nack(buffer, time): + nack = get_theme().CHAR_NACK + expected = '10:11:12 %s toto> ' % nack + msg = Message(txt='coucou', nickname='toto', time=time, ack=-1) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == expected + assert size == len(buffer.text) + + +def test_write_pre_xmllog_in(buffer): + msg = XMLLog(txt="coucou", incoming=True) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '%s IN ' % msg.time.strftime('%H:%M:%S') + assert size == len(buffer.text) + + +def test_write_pre_xmllog_out(buffer): + msg = XMLLog(txt="coucou", incoming=False) + size = write_pre(msg, buffer, True, 10) + assert buffer.text == '%s OUT ' % msg.time.strftime('%H:%M:%S') + assert size == len(buffer.text) diff --git a/test/test_ui/test_types.py b/test/test_ui/test_types.py new file mode 100644 index 00000000..e4c6c010 --- /dev/null +++ b/test/test_ui/test_types.py @@ -0,0 +1,126 @@ +import pytest +from datetime import datetime + +from poezio.ui.types import BaseMessage, Message, XMLLog + + +def test_create_message(): + now = datetime.now() + msg = Message( + txt="coucou", + nickname="toto", + ) + assert now < msg.time < datetime.now() + + msg = Message( + txt="coucou", + nickname="toto", + time=now, + ) + assert msg.time == now + + +def test_message_offset_simple(): + msg = Message( + txt="coucou", + nickname="toto", + ) + example = "10:10:10 toto> " + assert msg.compute_offset(True, 10) == len(example) + + msg = Message( + txt="coucou", + nickname="toto", + history=True, + ) + example = "2019:09:01 10:10:10 toto> " + assert msg.compute_offset(True, 10) == len(example) + +def test_message_offset_no_nick(): + msg = Message( + txt="coucou", + nickname="", + ) + example = "10:10:10 " + assert msg.compute_offset(True, 10) == len(example) + +def test_message_offset_ack(): + msg = Message( + txt="coucou", + nickname="toto", + ack=1, + ) + example = "10:10:10 V toto> " + assert msg.compute_offset(True, 10) == len(example) + + msg = Message( + txt="coucou", + nickname="toto", + ack=-1, + ) + example = "10:10:10 X toto> " + assert msg.compute_offset(True, 10) == len(example) + + +def test_message_offset_me(): + msg = Message( + txt="/me coucou", + nickname="toto", + ) + example = "10:10:10 * toto " + assert msg.compute_offset(True, 10) == len(example) + + +def test_message_offset_revisions(): + msg = Message( + txt="coucou", + nickname="toto", + revisions=3, + ) + example = "10:10:10 toto3> " + assert msg.compute_offset(True, 10) == len(example) + + msg = Message( + txt="coucou", + nickname="toto", + revisions=250, + ) + example = "10:10:10 toto250> " + assert msg.compute_offset(True, 10) == len(example) + + +def test_message_repr_works(): + msg1 = Message( + txt="coucou", + nickname="toto", + revisions=250, + ) + msg2 = Message( + txt="coucou", + nickname="toto", + old_message=msg1 + ) + + assert repr(msg2) is not None + +def test_xmllog_offset(): + msg = XMLLog( + txt='toto', + incoming=True, + ) + example = '10:10:10 IN ' + assert msg.compute_offset(True, 10) == len(example) + + msg = XMLLog( + txt='toto', + incoming=False, + ) + example = '10:10:10 OUT ' + assert msg.compute_offset(True, 10) == len(example) + +def test_basemessage_offset(): + msg = BaseMessage( + txt='coucou', + ) + example = '10:10:10 ' + assert msg.compute_offset(True, 10) == len(example) diff --git a/test/test_user.py b/test/test_user.py new file mode 100644 index 00000000..cda85577 --- /dev/null +++ b/test/test_user.py @@ -0,0 +1,44 @@ +""" +Tests for the User class +""" + +import pytest +from datetime import datetime +from slixmpp import JID +from poezio.user import User + + +@pytest.fixture +def user1(): + return User( + nick='nick1', + affiliation='member', + show='xa', + status='My Status!', + role='moderator', + jid=JID('foo@muc/nick1'), + color='red', + ) + + +def test_new_user(user1): + assert user1.last_talked == datetime(1, 1, 1) + assert user1.jid == JID('foo@muc/nick1') + assert user1.chatstate is None + assert user1.affiliation == 'member' + assert user1.show == 'xa' + assert user1.status == 'My Status!' + assert user1.role == 'moderator' + assert user1.nick == 'nick1' + assert user1.color == (196, -1) + assert str(user1) == '>nick1<' + + +def test_change_nick(user1): + user1.change_nick('nick2') + assert user1.nick == 'nick2' + + +def test_change_color(user1): + user1.change_color('blue') + assert user1.color == (21, -1) diff --git a/test/test_windows.py b/test/test_windows.py index cb7c86b7..3be96172 100644 --- a/test/test_windows.py +++ b/test/test_windows.py @@ -1,19 +1,31 @@ import pytest +from poezio.windows import Input, HistoryInput, MessageInput +from poezio import config + -class ConfigShim(object): +class ConfigShim: def get(self, *args, **kwargs): return '' -from poezio import config + def getbool(self, *args, **kwargs): + return True + + config.config = ConfigShim() -from poezio.windows import Input, HistoryInput, MessageInput + +class SubInput(Input): + + def rewrite_text(self, *args, **kwargs): + return None + @pytest.fixture def input(): - input = Input() - input.rewrite_text = lambda: None - return input + from poezio.windows import base_wins + base_wins.TAB_WIN = True # The value is not relevant + return SubInput() + class TestInput(object): @@ -27,9 +39,9 @@ class TestInput(object): assert input.text == 'acoucou' def test_empty(self, input): - assert input.is_empty() == True + assert input.is_empty() input.do_command('a') - assert input.is_empty() == False + assert not input.is_empty() def test_key_left(self, input): for char in 'this is a line': diff --git a/test/test_xhtml.py b/test/test_xhtml.py index 472991c6..333a10c3 100644 --- a/test/test_xhtml.py +++ b/test/test_xhtml.py @@ -8,11 +8,15 @@ import poezio.xhtml from poezio.xhtml import (poezio_colors_to_html, xhtml_to_poezio_colors, _parse_css as parse_css, clean_text) -class ConfigShim(object): + +class ConfigShim: def __init__(self): self.value = True def get(self, *args, **kwargs): return self.value + def getbool(self, *args, **kwargs): + return self.value + config = ConfigShim() poezio.xhtml.config = config |