Source code for irc.tests.test_bot

import time
import threading

import six

import pytest

import irc.client
import irc.bot
import irc.server
from irc.bot import ServerSpec

__metaclass__ = type


[docs]class TestServerSpec:
[docs] def test_with_host(self): server_spec = ServerSpec('irc.example.com') assert server_spec.host == 'irc.example.com' assert server_spec.port == 6667 assert server_spec.password is None
[docs] def test_with_host_and_port(self): server_spec = ServerSpec('irc.example.org', port=6669) assert server_spec.host == 'irc.example.org' assert server_spec.port == 6669 assert server_spec.password is None
[docs] def test_with_host_and_password(self): server_spec = ServerSpec('irc.example.net', password='heres johnny!') assert server_spec.host == 'irc.example.net' assert server_spec.port == 6667 assert server_spec.password == 'heres johnny!'
[docs] def test_with_host_and_port_and_password(self): server_spec = ServerSpec( 'irc.example.gov', port=6668, password='there-is-only-zuul') assert server_spec.host == 'irc.example.gov' assert server_spec.port == 6668 assert server_spec.password == 'there-is-only-zuul'
[docs]class TestChannel:
[docs] def test_add_remove_nick(self): channel = irc.bot.Channel() channel.add_user('tester1') channel.remove_user('tester1') assert 'tester1' not in channel.users() channel.add_user('tester1') assert 'tester1' in channel.users()
[docs] def test_change_nick(self): channel = irc.bot.Channel() channel.add_user('tester1') channel.change_nick('tester1', 'was_tester')
[docs] def test_has_user(self): channel = irc.bot.Channel() channel.add_user('tester1') assert channel.has_user('Tester1')
[docs] def test_set_mode_clear_mode(self): channel = irc.bot.Channel() channel.add_user('tester1') channel.set_mode('o', 'tester1') assert channel.is_oper('tester1') channel.clear_mode('o', 'tester1') assert not channel.is_oper('tester1')
[docs] def test_remove_add_clears_mode(self): channel = irc.bot.Channel() channel.add_user('tester1') channel.set_mode('v', 'tester1') assert channel.is_voiced('tester1') channel.remove_user('tester1') channel.add_user('tester1') assert not channel.is_voiced('tester1')
[docs]class DisconnectHandler(irc.server.IRCClient): """ Immediately disconnect the client after connecting """
[docs] def handle(self): self.request.close()
[docs]@pytest.yield_fixture def disconnecting_server(): """ An IRC server that disconnects the client immediately. """ # bind to localhost on an ephemeral port bind_address = '127.0.0.1', 0 try: srv = irc.server.IRCServer(bind_address, DisconnectHandler) threading.Thread(target=srv.serve_forever).start() yield srv finally: srv.shutdown() srv.server_close()
[docs]class TestBot:
[docs] def test_construct_bot(self): bot = irc.bot.SingleServerIRCBot( server_list=[('localhost', '9999')], realname='irclibbot', nickname='irclibbot', ) assert len(bot.server_list) == 1 svr = bot.server_list[0] assert svr.host == 'localhost' assert svr.port == '9999' assert svr.password is None
[docs] def test_namreply_no_channel(self): """ If channel is '*', _on_namreply should not crash. Regression test for #22 """ event = irc.client.Event( type=None, source=None, target=None, arguments=['*', '*', 'nick']) _on_namreply = six.get_unbound_function( irc.bot.SingleServerIRCBot._on_namreply) _on_namreply(None, None, event)
[docs] def test_reconnects_are_stable(self, disconnecting_server): """ Ensure that disconnects from the server don't lead to exponential growth in reconnect attempts. """ recon = irc.bot.ExponentialBackoff(min_interval=0.01) bot = irc.bot.SingleServerIRCBot( server_list=[disconnecting_server.socket.getsockname()], realname='reconnect_test', nickname='reconnect_test', recon=recon, ) bot._connect() for x in range(4): bot.reactor.process_once() time.sleep(0.01) assert len(bot.reactor.scheduler.queue) <= 1