|
|
@@ -5,17 +5,78 @@ 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. The run() function runs a given test case. |
|
|
|
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 |
|
|
|
import unittest |
|
|
|
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: |
|
|
|
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 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 |
|
|
|
|
|
|
|
root = path.join(path.split(path.dirname(path.abspath(__file__)))[0], "bot") |
|
|
|
sys.path.insert(0, root) |
|
|
|
def get(self, size=4096): |
|
|
|
data, self._buffer = self._buffer, "" |
|
|
|
return data |
|
|
|
|
|
|
|
def run(case): |
|
|
|
suite = unittest.TestLoader().loadTestsFromTestCase(case) |
|
|
|
text_runner = unittest.TextTestRunner(verbosity=2).run(suite) |
|
|
|
def send(self, msg): |
|
|
|
self._buffer += msg + "\n" |