summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_common.py23
-rw-r--r--test/test_completion.py24
-rw-r--r--test/test_config.py16
-rw-r--r--test/test_logger.py98
-rw-r--r--test/test_tabs.py50
-rw-r--r--test/test_text_buffer.py200
-rw-r--r--test/test_ui/test_funcs.py46
-rw-r--r--test/test_ui/test_render.py144
-rw-r--r--test/test_ui/test_types.py126
-rw-r--r--test/test_user.py44
-rw-r--r--test/test_windows.py28
-rw-r--r--test/test_xhtml.py6
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