From b6760d9a53594e0a781ad98604359fe42ad2d0f6 Mon Sep 17 00:00:00 2001 From: Shawn Wallis Date: Sun, 4 Oct 2020 15:50:08 -0400 Subject: [PATCH 1/6] Fix dateutil import --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 3c86e54..9f4974b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ aiohttp PyYAML -feedparser # bobbit.modules.feeds +feedparser # bobbit.modules.feeds -icalendar # bobbit.modules.events -dateutil # bobbit.modules.events +icalendar # bobbit.modules.events +python-dateutil # bobbit.modules.events From 158fecb9720f7b1091ea5a9738c22e8655df4e02 Mon Sep 17 00:00:00 2001 From: Shawn Wallis Date: Sun, 4 Oct 2020 15:51:07 -0400 Subject: [PATCH 2/6] default history type matches defaultdict type --- src/bobbit/history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bobbit/history.py b/src/bobbit/history.py index 248c639..2a8a78c 100644 --- a/src/bobbit/history.py +++ b/src/bobbit/history.py @@ -22,7 +22,7 @@ def search(self, channel, nick=None, pattern=None, limit=None, reverse=False): if pattern: pattern = re.compile(pattern) - messages = self.history[channel] + messages = self.history.get(channel, collections.deque()) if reverse: messages = reversed(messages) From 26bcffa05e9490002d68187b3c679e5cdf2bc849 Mon Sep 17 00:00:00 2001 From: Shawn Wallis Date: Sun, 4 Oct 2020 15:51:20 -0400 Subject: [PATCH 3/6] Use built-in deque reverse method --- src/bobbit/history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bobbit/history.py b/src/bobbit/history.py index 2a8a78c..23f0fff 100644 --- a/src/bobbit/history.py +++ b/src/bobbit/history.py @@ -24,7 +24,7 @@ def search(self, channel, nick=None, pattern=None, limit=None, reverse=False): messages = self.history.get(channel, collections.deque()) if reverse: - messages = reversed(messages) + messages.reverse() count = 0 limit = limit or len(messages) From c466d1a8ee53fe100878381a71b476300d77d025 Mon Sep 17 00:00:00 2001 From: Shawn Wallis Date: Sun, 4 Oct 2020 15:51:35 -0400 Subject: [PATCH 4/6] Add tests for bobbit.history --- tests/test_history.py | 134 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 tests/test_history.py diff --git a/tests/test_history.py b/tests/test_history.py new file mode 100644 index 0000000..ca32be6 --- /dev/null +++ b/tests/test_history.py @@ -0,0 +1,134 @@ +''' Test history module ''' + +import os +import sys +import unittest + +sys.path.insert(0, 'src') + +from bobbit.history import History +from bobbit.message import Message + +from bobbit.bot import Bobbit +from bobbit.message import Message + +# Test Cases + +class HistoryInsertTestCase(unittest.IsolatedAsyncioTestCase): + TEST_CHANNEL1 = "foo" + TEST_CHANNEL2 = "fu" + + TEST_USER1 = "woof" + TEST_USER2 = "m3ow" + + async def test_insert(self): + hs = History() + + msg1 = Message("bar", channel=self.TEST_CHANNEL1) + msg2 = Message("baz", channel=self.TEST_CHANNEL1) + msg3 = Message("qux", channel=self.TEST_CHANNEL1) + msg4 = Message("bar", channel=self.TEST_CHANNEL2) + + hs.insert(msg1) + hs.insert(msg2) + hs.insert(msg4) + hs.insert(msg3) + + chan1 = hs.history.get(self.TEST_CHANNEL1) + self.assertEqual(len(chan1), 3) + self.assertEqual(msg1, chan1[0]) + self.assertEqual(msg2, chan1[1]) + self.assertEqual(msg3, chan1[2]) + + chan2 = hs.history.get(self.TEST_CHANNEL2) + self.assertEqual(len(chan2), 1) + self.assertEqual(msg4, chan2[0]) + + async def test_history_limit(self): + hs = History(maxlen=5) + + msg1 = Message("bar", channel=self.TEST_CHANNEL1) + msg2 = Message("baz", channel=self.TEST_CHANNEL1) + msg3 = Message("qux", channel=self.TEST_CHANNEL1) + msg4 = Message("quz", channel=self.TEST_CHANNEL1) + msg5 = Message("var", channel=self.TEST_CHANNEL1) + msg6 = Message("ter", channel=self.TEST_CHANNEL1) + msg7 = Message("daz", channel=self.TEST_CHANNEL1) + + hs.insert(msg1) + hs.insert(msg2) + hs.insert(msg3) + hs.insert(msg4) + hs.insert(msg5) + + hs.insert(msg6) + + chan1 = hs.history.get(self.TEST_CHANNEL1) + + self.assertEqual(len(chan1), 5) + self.assertEqual(chan1[0], msg2) + self.assertEqual(chan1[4], msg6) + + hs.insert(msg7) + + self.assertEqual(chan1[0], msg3) + self.assertEqual(chan1[4], msg7) + +class HistorySearchTestCase(unittest.IsolatedAsyncioTestCase): + TEST_CHANNEL1 = "foo" + TEST_CHANNEL2 = "fu" + + TEST_USER1 = "woof" + TEST_USER2 = "m3ow" + + def setUp(self): + self.hs = History() + + self.hs.insert(Message("bar", nick=self.TEST_USER1, channel=self.TEST_CHANNEL1)) + self.hs.insert(Message("baz", nick=self.TEST_USER2, channel=self.TEST_CHANNEL1)) + self.hs.insert(Message("arbax", nick=self.TEST_USER2, channel=self.TEST_CHANNEL1)) + + self.hs.insert(Message("quz", nick=self.TEST_USER2, channel=self.TEST_CHANNEL2)) + self.hs.insert(Message("qux", nick=self.TEST_USER1, channel=self.TEST_CHANNEL2)) + + async def test_no_matches(self): + matches = [] + for m in self.hs.search(self.TEST_CHANNEL1): + matches.append(m) + + self.assertEqual(len(matches), 0) + + async def test_nick_match(self): + matches = [] + for m in self.hs.search(self.TEST_CHANNEL1, nick=self.TEST_USER2): + matches.append(m) + + self.assertEqual(len(matches), 2) + self.assertEqual(matches[0].body, "baz") + self.assertEqual(matches[1].body, "arbax") + + async def test_pattern_match(self): + matches = [] + for m in self.hs.search(self.TEST_CHANNEL1, pattern="^ba"): + matches.append(m) + + self.assertEqual(len(matches), 2) + self.assertEqual(matches[0].body, "bar") + self.assertEqual(matches[1].body, "baz") + + async def test_reversed_match(self): + matches = [] + for m in self.hs.search(self.TEST_CHANNEL1, nick=self.TEST_USER2, reverse=True): + matches.append(m) + + self.assertEqual(len(matches), 2) + self.assertEqual(matches[0].body, "arbax") + self.assertEqual(matches[1].body, "baz") + + async def test_match_limit(self): + matches = [] + for m in self.hs.search(self.TEST_CHANNEL1, nick=self.TEST_USER2, limit=1): + matches.append(m) + + self.assertEqual(len(matches), 1) + self.assertEqual(matches[0].body, "baz") From ec0ecf235cd8db782affefd0fec240b2e3070df6 Mon Sep 17 00:00:00 2001 From: Shawn Wallis Date: Sun, 4 Oct 2020 20:20:55 -0400 Subject: [PATCH 5/6] Create reversed copy of messages list --- src/bobbit/history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bobbit/history.py b/src/bobbit/history.py index 23f0fff..42f2296 100644 --- a/src/bobbit/history.py +++ b/src/bobbit/history.py @@ -24,7 +24,7 @@ def search(self, channel, nick=None, pattern=None, limit=None, reverse=False): messages = self.history.get(channel, collections.deque()) if reverse: - messages.reverse() + messages = list(reversed(messages)) count = 0 limit = limit or len(messages) From d33c749b71f858c1b686b6bde71cfd502bf23a1c Mon Sep 17 00:00:00 2001 From: shawalli Date: Mon, 5 Oct 2020 06:38:12 -0400 Subject: [PATCH 6/6] Update test_history.py Add script runner to history test --- tests/test_history.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_history.py b/tests/test_history.py index ca32be6..00cb081 100644 --- a/tests/test_history.py +++ b/tests/test_history.py @@ -74,6 +74,7 @@ async def test_history_limit(self): self.assertEqual(chan1[0], msg3) self.assertEqual(chan1[4], msg7) + class HistorySearchTestCase(unittest.IsolatedAsyncioTestCase): TEST_CHANNEL1 = "foo" TEST_CHANNEL2 = "fu" @@ -132,3 +133,7 @@ async def test_match_limit(self): self.assertEqual(len(matches), 1) self.assertEqual(matches[0].body, "baz") + + +if __name__ == '__main__': + unittest.main()