def test_voice_1priv_is_op(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter( {"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan1.in_channel = True user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") user_hallo = serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) chan1.add_user(user1) chan1.add_user(user_hallo) chan1_user1 = chan1.get_membership_by_user(user1) chan1_user1.is_op = True chan1_hallo = chan1.get_membership_by_user(user_hallo) chan1_hallo.is_op = True try: hallo.function_dispatcher.dispatch( EventMessage(serv1, None, user1, "voice test_chan1")) data = serv1.get_send_data(1, user1, EventMessage) assert "error" in data[0].text.lower() assert "already has voice" in data[0].text.lower() finally: hallo.remove_server(serv1)
def test_unmute_0(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter( {"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan1.in_channel = True user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") user_hallo = serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) chan1.add_user(user1) chan1.add_user(user_hallo) chan1_user1 = chan1.get_membership_by_user(user1) chan1_user1.is_op = False chan1_hallo = chan1.get_membership_by_user(user_hallo) chan1_hallo.is_op = True try: hallo.function_dispatcher.dispatch( EventMessage(serv1, chan1, user1, "unmute")) data = serv1.get_send_data(2) assert "error" not in data[1].text.lower() assert data[0].channel == chan1 assert data[1].channel == chan1 assert data[0].__class__ == EventMode assert data[1].__class__ == EventMessage assert data[0].mode_changes == "-m" assert "set mute in " + chan1.name in data[1].text.lower() finally: hallo.remove_server(serv1)
def test_unmute_0_no_power(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter( {"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan1.in_channel = True user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") user_hallo = serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) chan1.add_user(user1) chan1.add_user(user_hallo) chan1_user1 = chan1.get_membership_by_user(user1) chan1_user1.is_op = False chan1_hallo = chan1.get_membership_by_user(user_hallo) chan1_hallo.is_op = False try: hallo.function_dispatcher.dispatch( EventMessage(serv1, chan1, user1, "unmute")) data = serv1.get_send_data(1, chan1, EventMessage) assert "error" in data[0].text.lower() assert "don't have power" in data[0].text.lower() finally: hallo.remove_server(serv1)
def test_run_add_off(hallo_getter): hallo, test_server, test_channel, test_user = hallo_getter( {"permission_control"}) # Set up a test hallo and server and channel and user hallo1 = Hallo() perm0 = PermissionMask() hallo1.permission_mask = perm0 serv1 = ServerMock(hallo1) serv1.name = "test_serv1" perm1 = PermissionMask() serv1.permission_mask = perm1 hallo1.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") perm2 = PermissionMask() chan1.permission_mask = perm2 user1 = serv1.get_user_by_address("test_user1", "test_user1") perm3 = PermissionMask() user1.permission_mask = perm3 # Get permission mask of given channel test_right = "test_right" hallo.function_dispatcher.dispatch( EventMessage( serv1, chan1, user1, "permissions server=test_serv1 channel=test_chan1 " + test_right + " off", )) data = serv1.get_send_data(1, chan1, EventMessage) assert "error" not in data[0].text.lower() assert "set " + test_right + " to false" in data[0].text.lower() assert test_right in perm2.rights_map assert not perm2.rights_map[test_right]
def test_deop_2_user_user_not_there(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter({"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan1.in_channel = True chan2 = serv1.get_channel_by_address("test_chan2".lower(), "test_chan2") chan2.in_channel = True user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") user2 = serv1.get_user_by_address("test_user2".lower(), "test_user2") serv1.get_user_by_address("test_user3".lower(), "test_user3") user_hallo = serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) chan1.add_user(user1) chan1_user1 = chan1.get_membership_by_user(user1) chan1_user1.is_op = False chan1.add_user(user_hallo) chan1_hallo = chan1.get_membership_by_user(user_hallo) chan1_hallo.is_op = True chan2.add_user(user2) chan2_user1 = chan2.get_membership_by_user(user2) chan2_user1.is_op = False chan2.add_user(user_hallo) chan2_hallo = chan2.get_membership_by_user(user_hallo) chan2_hallo.is_op = True try: hallo.function_dispatcher.dispatch( EventMessage(serv1, chan1, user1, "deop test_user3 test_chan2") ) data = serv1.get_send_data(1, chan1, EventMessage) assert "error" in data[0].text.lower() assert "test_user3 is not in test_chan2" in data[0].text.lower() finally: hallo.remove_server(serv1)
def test_run_fail_not_bool(hallo_getter): hallo, test_server, test_channel, test_user = hallo_getter( {"permission_control"}) # Set up a test hallo and server and channel and user hallo1 = Hallo() perm0 = PermissionMask() hallo1.permission_mask = perm0 serv1 = ServerMock(hallo1) serv1.name = "test_serv1" perm1 = PermissionMask() serv1.permission_mask = perm1 hallo1.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") perm2 = PermissionMask() chan1.permission_mask = perm2 user1 = serv1.get_user_by_address("test_user1", "test_user1") perm3 = PermissionMask() user1.permission_mask = perm3 # Get permission mask of given channel test_right = "test_right" perm1.set_right(test_right, True) hallo.function_dispatcher.dispatch( EventMessage( serv1, chan1, user1, "permissions server=test_serv1 " + test_right + " yellow", )) data = serv1.get_send_data(1, chan1, EventMessage) assert "error" in data[0].text.lower() assert "don't understand your boolean value" in data[0].text.lower() assert test_right in perm1.rights_map assert perm1.rights_map[test_right]
def test_invite_1priv(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter({"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan1.in_channel = True user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") user_hallo = serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) chan1.add_user(user_hallo) chan1_hallo = chan1.get_membership_by_user(user_hallo) chan1_hallo.is_op = True try: hallo.function_dispatcher.dispatch( EventMessage(serv1, None, user1, "invite test_chan1") ) data = serv1.get_send_data(2) assert "error" not in data[1].text.lower() assert data[0].channel == chan1 assert data[1].user == user1 assert data[0].__class__ == EventInvite assert data[1].__class__ == EventMessage assert data[0].invited_user == user1 assert "invite sent" in data[1].text.lower() finally: hallo.remove_server(serv1)
def function(modules=None): if modules is None: modules = { "ascii_art", "bio", "channel_control", "convert", "euler", "hallo_control", "math", "permission_control", "random", "server_control", "silly", "subscriptions", } function_dispatcher = FunctionDispatcher(modules, hallo) hallo.function_dispatcher = function_dispatcher # Create server server = ServerMock(hallo) server.name = "mock-server" hallo.add_server(server) # Start hallo thread hallo_thread.start() # Create test users and channel, and configure them hallo_user = server.get_user_by_address( server.get_nick().lower(), server.get_nick() ) test_user = server.get_user_by_address("test", "test") test_user.online = True test_chan = server.get_channel_by_address("#test", "#test") test_chan.in_channel = True test_chan.add_user(hallo_user) test_chan.add_user(test_user) # Wait until hallo is open count = 0 while not hallo.open: time.sleep(0.01) count += 1 assert count < 1000, "Hallo took too long to start." if count > 1000: break # Clear any data in the server server.get_send_data() return hallo, server, test_chan, test_user
def test_unmute_privmsg(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter( {"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") try: hallo.function_dispatcher.dispatch( EventMessage(serv1, None, user1, "unmute")) data = serv1.get_send_data(1, user1, EventMessage) assert "error" in data[0].text.lower() assert "can't unset mute on a private message" in data[0].text.lower() finally: hallo.remove_server(serv1)
def test_help_mock_func_disp(): # Set up mock objects mock_hallo = Hallo() mock_func_disp = FunctionDispatcher(set(), mock_hallo) mock_hallo.function_dispatcher = mock_func_disp mock_func_disp.load_function(None, FunctionMock) mock_func_disp.load_function(None, FunctionMockNoDoc) mock_func_disp.load_function(None, Help) mock_server = ServerMock(mock_hallo) mock_server.name = "test_serv1" mock_user = mock_server.get_user_by_address("test_user1".lower(), "test_user1") # Test things mock_func_disp.dispatch(EventMessage(mock_server, None, mock_user, "help")) data = mock_server.get_send_data(1, mock_user, EventMessage) assert "error" not in data[0].text.lower() assert "list of available functions:" in data[0].text.lower() assert "function mock" in data[0].text.lower() assert "function no doc" in data[0].text.lower()
def test_deop_not_irc(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter({"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = "NOT_IRC" hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") chan1.add_user(user1) chan1.add_user( serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) ) try: hallo.function_dispatcher.dispatch(EventMessage(serv1, chan1, user1, "deop")) data = serv1.get_send_data(1, chan1, EventMessage) assert "error" in data[0].text.lower() assert "only available for irc" in data[0].text.lower() finally: hallo.remove_server(serv1)
def test_deop_0_privmsg(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter({"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") user1 = serv1.get_user_by_address("test_user1", "test_user1") chan1.add_user(user1) chan1.add_user( serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) ) try: hallo.function_dispatcher.dispatch(EventMessage(serv1, None, user1, "deop")) data = serv1.get_send_data(1, user1, EventMessage) assert "error" in data[0].text.lower() assert "in a private message" in data[0].text.lower() finally: hallo.remove_server(serv1)
def test_voice_2_chan(hallo_getter): hallo, test_server, test_chan, test_user = hallo_getter( {"channel_control"}) serv1 = ServerMock(hallo) serv1.name = "test_serv1" serv1.type = Server.TYPE_IRC hallo.add_server(serv1) chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan1.in_channel = True chan2 = serv1.get_channel_by_address("test_chan2".lower(), "test_chan2") chan2.in_channel = True user1 = serv1.get_user_by_address("test_user1".lower(), "test_user1") user2 = serv1.get_user_by_address("test_user2".lower(), "test_user2") user_hallo = serv1.get_user_by_address(serv1.get_nick().lower(), serv1.get_nick()) chan1.add_user(user1) chan1_user1 = chan1.get_membership_by_user(user1) chan1_user1.is_op = False chan1.add_user(user_hallo) chan1_hallo = chan1.get_membership_by_user(user_hallo) chan1_hallo.is_op = True chan2.add_user(user2) chan2_user2 = chan2.get_membership_by_user(user2) chan2_user2.is_op = False chan2.add_user(user_hallo) chan2_hallo = chan2.get_membership_by_user(user_hallo) chan2_hallo.is_op = True try: hallo.function_dispatcher.dispatch( EventMessage(serv1, chan1, user1, "voice test_chan2 test_user2")) data = serv1.get_send_data(2) assert "error" not in data[1].text.lower() assert data[0].channel == chan2 assert data[1].channel == chan1 assert data[0].__class__ == EventMode assert data[1].__class__ == EventMessage assert data[0].mode_changes == "+v {}".format(user2.address) assert "status given" in data[1].text.lower() finally: hallo.remove_server(serv1)
def test_run_by_search(self): # Set up test servers and channels serv1 = ServerMock(self.hallo) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan2 = serv1.get_channel_by_address("test_chan2".lower(), "test_chan2") user1 = serv1.get_user_by_address("test_user1", "test_user1") serv2 = ServerMock(self.hallo) serv2.name = "test_serv2" chan3 = serv2.get_channel_by_address("test_chan1".lower(), "test_chan1") try: self.hallo.add_server(serv1) self.hallo.add_server(serv2) # Set up rss feeds sub_repo = SubscriptionRepo() rf1 = E621Source("cabinet") sub1 = Subscription(serv1, chan1, rf1, timedelta(days=1), None, None) sub_repo.add_sub(sub1) rf2 = E621Source("clefable") sub2 = Subscription(serv1, chan2, rf2, timedelta(days=1), None, None) sub_repo.add_sub(sub2) rf3 = E621Source("fez") sub3 = Subscription(serv2, chan3, rf3, timedelta(days=1), None, None) sub_repo.add_sub(sub3) # Splice this rss feed list into the function dispatcher's rss check object rss_check_class = self.function_dispatcher.get_function_by_name( "check subscription") rss_check_obj = self.function_dispatcher.get_function_object( rss_check_class) # type: SubscriptionCheck rss_check_obj.subscription_repo = sub_repo # Invalid title self.function_dispatcher.dispatch( EventMessage( self.server, self.test_chan, self.test_user, "e621 sub check Not a valid search", )) data = self.server.get_send_data(1, self.test_chan, EventMessage) assert "error" in data[0].text.lower() # Correct title but wrong channel self.function_dispatcher.dispatch( EventMessage(serv1, chan1, user1, "e621 sub check clefable")) data = serv1.get_send_data(1, chan1, EventMessage) assert "error" in data[0].text.lower() # Correct title check update self.function_dispatcher.dispatch( EventMessage(serv1, chan2, user1, "e621 sub check clefable")) data = serv1.get_send_data(51, chan2, EventMessage) has_photo_id = 0 for x in range(50): assert "update on" in data[x].text.lower() if hasattr(data[x], "photo_id") and data[x].photo_id is not None: has_photo_id += 1 assert "clefable" in data[x].text assert has_photo_id > 40, "Almost all subscription updates should have a photo" assert ("subscription updates were found" in data[50].text.lower()), "Actual message: {}".format( data[0].text) # No updates self.function_dispatcher.dispatch( EventMessage(serv1, chan2, user1, "e621 sub check clefable")) data = serv1.get_send_data(1, chan2, EventMessage) assert "no updates" in data[ 0].text, "No further updates should be found." finally: self.hallo.remove_server(serv2) self.hallo.remove_server(serv1)
def test_run_passive(self): # Set up test servers and channels serv1 = ServerMock(self.hallo) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan2 = serv1.get_channel_by_address("test_chan2".lower(), "test_chan2") serv2 = ServerMock(self.hallo) serv2.name = "test_serv2" chan3 = serv2.get_channel_by_address("test_chan1".lower(), "test_chan1") try: self.hallo.add_server(serv1) self.hallo.add_server(serv2) # Set up rss feeds sub_repo = SubscriptionRepo() rf1 = E621Source("cabinet") sub1 = Subscription(serv1, chan1, rf1, timedelta(days=1), None, None) sub_repo.add_sub(sub1) rf2 = E621Source("clefable") sub2 = Subscription(serv1, chan2, rf2, timedelta(days=1), None, None) sub_repo.add_sub(sub2) rf3 = E621Source("fez") sub3 = Subscription(serv2, chan3, rf3, timedelta(days=1), None, None) sub_repo.add_sub(sub3) # Splice this rss feed list into the function dispatcher's rss check object rss_check_class = self.function_dispatcher.get_function_by_name( "check subscription") rss_check_obj = self.function_dispatcher.get_function_object( rss_check_class) # type: SubscriptionCheck rss_check_obj.subscription_repo = sub_repo # Test passive feed updates self.function_dispatcher.dispatch_passive(EventMinute()) # Check test server 1 data serv1_data = serv1.get_send_data(100) chan1_count = 0 chan2_count = 0 for data_line in serv1_data: if data_line.channel == chan1: chan1_count += 1 if data_line.channel == chan2: chan2_count += 1 assert chan1_count == 50 assert chan2_count == 50 # Check test server 2 data serv2.get_send_data(50, chan3, EventMessage) # Test that no updates are found the second run rf1.last_check = None rf2.last_check = None rf3.last_check = None self.function_dispatcher.dispatch_passive(EventMinute()) serv1.get_send_data(0) serv2.get_send_data(0) # Test that no feeds are checked before timeout, set urls to none and see if anything explodes. self.failed = False rf1.check_feed = self.do_not_call rf2.check_feed = self.do_not_call rf3.check_feed = self.do_not_call self.function_dispatcher.dispatch_passive(EventMinute()) serv1.get_send_data(0) serv2.get_send_data(0) assert (not self.failed ), "check_feed() should not have been called on any feed." finally: self.hallo.remove_server(serv2) self.hallo.remove_server(serv1)
class TestBase(unittest.TestCase): def setUp(self): print("Starting test: " + self.id()) self.start_time = time.time() # Create a Hallo self.hallo = Hallo() # Only the required modules, only 1 (mock) server # Todo: specify modules by test? self.function_dispatcher = FunctionDispatcher( {"convert", "random", "server_control", "subscriptions"}, self.hallo ) self.hallo.function_dispatcher = self.function_dispatcher print( "Running test: " + self.id() + ". Init took: " + str(time.time() - self.start_time) + " seconds." ) self.server = ServerMock(self.hallo) self.server.name = "mock-server" self.hallo.add_server(self.server) # Start hallo thread self.hallo_thread = Thread(target=self.hallo.start,) self.hallo_thread.start() # Create test users and channel, and configure them self.hallo_user = self.server.get_user_by_address( self.server.get_nick().lower(), self.server.get_nick() ) self.test_user = self.server.get_user_by_address("test", "test") self.test_user.online = True self.test_chan = self.server.get_channel_by_address("#test", "#test") self.test_chan.in_channel = True self.test_chan.add_user(self.hallo_user) self.test_chan.add_user(self.test_user) # Wait until hallo is open count = 0 while not self.hallo.open: time.sleep(0.01) count += 1 assert count < 1000, "Hallo took too long to start." if count > 1000: break # Clear any data in the server self.server.get_send_data() # Print test startup time print( "Running test: " + self.id() + ". Startup took: " + str(time.time() - self.start_time) + " seconds." ) self.start_time = time.time() def tearDown(self): print( "Finishing test: " + self.id() + ". Test took: " + str(time.time() - self.start_time) + " seconds." ) self.hallo.close() self.hallo_thread.join() print( "Finished test: " + self.id() + ". Test took: " + str(time.time() - self.start_time) + " seconds." ) @classmethod def tearDownClass(cls): del cls gc.collect()
def test_run_all(self): # Set up test servers and channels serv1 = ServerMock(self.hallo) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_address("test_chan1".lower(), "test_chan1") chan2 = serv1.get_channel_by_address("test_chan2".lower(), "test_chan2") serv2 = ServerMock(self.hallo) serv2.name = "test_serv2" chan3 = serv2.get_channel_by_address("test_chan1".lower(), "test_chan1") try: self.hallo.add_server(serv1) self.hallo.add_server(serv2) # Set up rss feeds sub_repo = SubscriptionRepo() rf1 = E621Source("cabinet") sub1 = Subscription(serv1, chan1, rf1, timedelta(days=1), None, None) sub_repo.add_sub(sub1) rf2 = E621Source("clefable") sub2 = Subscription(serv1, chan2, rf2, timedelta(days=1), None, None) sub_repo.add_sub(sub2) rf3 = E621Source("fez") sub3 = Subscription(serv2, chan3, rf3, timedelta(days=1), None, None) sub_repo.add_sub(sub3) # Splice this rss feed list into the function dispatcher's rss check object e621_sub_check = self.function_dispatcher.get_function_by_name( "check subscription") e621_sub_obj = self.function_dispatcher.get_function_object( e621_sub_check) # type: SubscriptionCheck e621_sub_obj.subscription_repo = sub_repo # Test running all feed updates self.function_dispatcher.dispatch( EventMessage(self.server, self.test_chan, self.test_user, "e621 sub check all")) # Check original calling channel data serv0_data = self.server.get_send_data(1, self.test_chan, EventMessage) assert ( "subscription updates were found" in serv0_data[0].text.lower()), "Actual message: {}".format( serv0_data[0].text) # Check test server 1 data serv1_data = serv1.get_send_data(100) chan1_count = 0 chan2_count = 0 for data_line in serv1_data: if data_line.channel == chan1: chan1_count += 1 if data_line.channel == chan2: chan2_count += 1 assert chan1_count == 50 assert chan2_count == 50 # Check test server 2 data serv2.get_send_data(50, chan3, EventMessage) # Test running with no new updates. self.function_dispatcher.dispatch( EventMessage(self.server, self.test_chan, self.test_user, "e621 sub check all")) data = self.server.get_send_data(1, self.test_chan, EventMessage) assert "no updates" in data[ 0].text, "No further updates should be found." finally: self.hallo.remove_server(serv2) self.hallo.remove_server(serv1)