diff --git a/irctest/cases.py b/irctest/cases.py index bb0a4ce..8d9cbe0 100644 --- a/irctest/cases.py +++ b/irctest/cases.py @@ -86,3 +86,17 @@ class ClientNegociationHelper: else: return True + def negociateCapabilities(self, cap_ls): + self.sendLine('CAP * LS :') + while True: + m = self.getMessage(filter_pred=self.userNickPredicate) + self.assertEqual(m.command, 'CAP') + self.assertGreater(len(m.params), 0, m) + if m.params[0] == 'REQ': + self.assertEqual(len(m.params), 2, m) + requested = frozenset(m.params[1].split()) + if not requested.issubset(cap_ls): + self.sendLine('CAP * NAK :{}'.format(m.params[1])[0:100]) + else: + return m + diff --git a/irctest/clienttests/test_cap.py b/irctest/clienttests/test_cap.py index 2a6f1bc..d3075ae 100644 --- a/irctest/clienttests/test_cap.py +++ b/irctest/clienttests/test_cap.py @@ -7,6 +7,5 @@ class CapTestCase(cases.BaseClientTestCase, cases.ClientNegociationHelper): def testEmptyCapLs(self): self.readCapLs() - self.sendLine('CAP * LS :') - m = self.getMessage(filter_pred=self.userNickPredicate) + m = self.negociateCapabilities([]) self.assertEqual(m, Message([], None, 'CAP', ['END'])) diff --git a/irctest/controllers/sopel.py b/irctest/controllers/sopel.py new file mode 100644 index 0000000..f4e3c9f --- /dev/null +++ b/irctest/controllers/sopel.py @@ -0,0 +1,53 @@ +import os +import tempfile +import subprocess + +from irctest.basecontrollers import BaseClientController + +TEMPLATE_CONFIG = """ +[core] +nick = Sopel +host = {hostname} +use_ssl = false +port = {port} +owner = me +channels = +""" + +class SopelController(BaseClientController): + def __init__(self): + super().__init__() + self.filename = next(tempfile._get_candidate_names()) + self.proc = None + def __del__(self): + if self.proc: + self.proc.kill() + if self.filename: + try: + os.unlink(os.path.join(os.path.expanduser('~/.sopel/'), + self.filename)) + except OSError: # File does not exist + pass + + def open_file(self, filename): + return open(os.path.join(os.path.expanduser('~/.sopel/'), filename), + 'a') + + def create_config(self): + self.directory = tempfile.TemporaryDirectory() + with self.open_file(self.filename) as fd: + pass + + def run(self, hostname, port, authentication): + # Runs a client with the config given as arguments + self.create_config() + with self.open_file(self.filename) as fd: + fd.write(TEMPLATE_CONFIG.format( + hostname=hostname, + port=port, + )) + self.proc = subprocess.Popen(['sopel', '-c', self.filename]) + +def get_irctest_controller_class(): + return SopelController +