|
- # -*- coding: utf-8 -*-
-
- """
- EarwigBot's Unit Test Support
-
- This module provides some support code for unit tests.
-
- Importing this module will "fix" your path so that EarwigBot code from bot/ can
- be imported normally.
-
- CommandTestCase is a subclass of unittest.TestCase that provides setUp() for
- creating a fake connection and some other helpful methods. It uses
- FakeConnection, a subclass of classes.Connection, but with an internal string
- instead of a socket for data.
- """
-
- from os import path
- import re
- import sys
- from unittest import TestCase
-
- root_dir = path.split(path.dirname(path.abspath(__file__)))[0]
- code_dir = path.join(root_dir, "bot")
- sys.path.insert(0, code_dir)
-
- from classes import Connection, Data
-
- class CommandTestCase(TestCase):
- re_sender = re.compile(":(.*?)!(.*?)@(.*?)\Z")
-
- def setUp(self, command):
- self.connection = FakeConnection()
- self.connection.connect()
- self.command = command(self.connection)
-
- def get_single(self):
- data = self.connection.get().split("\n")
- line = data.pop(0)
- for remaining in data[1:]:
- self.connection.send(remaining)
- return line
-
- def assertSent(self, msg):
- line = self.get_single()
- self.assertEqual(line, msg)
-
- def assertSentIn(self, msgs):
- line = self.get_single()
- self.assertIn(line, msgs)
-
- def assertSaid(self, msg):
- self.assertSent("PRIVMSG #channel :{0}".format(msg))
-
- def assertSaidIn(self, msgs):
- msgs = ["PRIVMSG #channel :{0}".format(msg) for msg in msgs]
- self.assertSentIn(msgs)
-
- def assertReply(self, msg):
- self.assertSaid("\x02Foo\x0F: {0}".format(msg))
-
- def assertReplyIn(self, msgs):
- msgs = ["\x02Foo\x0F: {0}".format(msg) for msg in msgs]
- self.assertSaidIn(msgs)
-
- def maker(self, line, chan, msg=None):
- data = Data(line)
- data.nick, data.ident, data.host = self.re_sender.findall(line[0])[0]
- if msg is not None:
- data.msg = msg
- data.chan = chan
- data.parse_args()
- return data
-
- def make_msg(self, command, *args):
- line = ":Foo!bar@example.com PRIVMSG #channel :!{0}".format(command)
- line = line.strip().split()
- line.extend(args)
- return self.maker(line, line[2], " ".join(line[3:])[1:])
-
- def make_join(self):
- line = ":Foo!bar@example.com JOIN :#channel".strip().split()
- return self.maker(line, line[2][1:])
-
- class FakeConnection(Connection):
- def connect(self):
- self._buffer = ""
-
- def close(self):
- pass
-
- def get(self, size=4096):
- data, self._buffer = self._buffer, ""
- return data
-
- def send(self, msg):
- self._buffer += msg + "\n"
|