def test_run_by_title(self): # Set up test servers and channels serv1 = ServerMock(self.hallo) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_name("test_chan1") chan2 = serv1.get_channel_by_name("test_chan2") serv2 = ServerMock(self.hallo) serv2.name = "test_serv2" chan3 = serv2.get_channel_by_name("test_chan1") try: self.hallo.add_server(serv1) self.hallo.add_server(serv2) # Set up rss feeds rfl = RssFeedList() rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_rss.xml?1" rf1.title = "test_feed1" rf1.server_name = chan1.server.name rf1.channel_name = chan1.name rf1.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_rss.xml?2" rf2.title = "test_feed2" rf2.server_name = chan2.server.name rf2.channel_name = chan2.name rf2.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_rss.xml?3" rf3.title = "test_feed1" rf3.server_name = chan3.server.name rf3.channel_name = chan3.name rf3.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf3) # Splice this rss feed list into the function dispatcher's rss check object rss_check_class = self.function_dispatcher.get_function_by_name("rss check") rss_check_obj = self.function_dispatcher.get_function_object(rss_check_class) # type: FeedCheck rss_check_obj.rss_feed_list = rfl # Invalid title self.function_dispatcher.dispatch("rss check Not a valid feed", self.test_user, self.test_chan) data = self.server.get_send_data(1, self.test_chan, Server.MSG_MSG) assert "error" in data[0][0].lower() # Correct title but wrong channel self.function_dispatcher.dispatch("rss check test_feed2", self.test_user, chan1) data = serv1.get_send_data(1, chan1, Server.MSG_MSG) assert "error" in data[0][0].lower() # Correct title check update self.function_dispatcher.dispatch("rss check test_feed2", self.test_user, chan2) data = serv1.get_send_data(1, chan2, Server.MSG_MSG) assert "feed updates were found" in data[0][0].lower() assert len(data[0][0].lower().split("\n")) == 4 # No updates rf2.title = "test_feed2" self.function_dispatcher.dispatch("rss check test_feed2", self.test_user, chan2) data = serv1.get_send_data(1, chan2, Server.MSG_MSG) assert "no updates" in data[0][0], "No further updates should be found." finally: self.hallo.remove_server(serv2) self.hallo.remove_server(serv1)
def test_remove_multiple_matching_titles(self): # Get feed list rss_check_class = self.function_dispatcher.get_function_by_name("rss check") rss_check_obj = self.function_dispatcher.get_function_object(rss_check_class) # type: FeedCheck rfl = rss_check_obj.rss_feed_list # Add RSS feeds to feed list rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_rss.xml?1" rf1.title = "test_feed1" rf1.server_name = self.server.name rf1.channel_name = self.test_chan.name rf1.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_rss.xml?2" rf2.title = "test_feed1" rf2.server_name = self.server.name rf2.channel_name = "another_channel" rf2.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_rss.xml?3" rf3.title = "test_feed1" rf3.server_name = self.server.name rf3.channel_name = self.test_chan.name rf3.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf3) # Remove test feed self.function_dispatcher.dispatch("rss remove test_feed1", self.test_user, self.test_chan) data = self.server.get_send_data(1, self.test_chan, Server.MSG_MSG) assert "error" in data[0][0].lower() assert rf1 in rfl.feed_list assert rf2 in rfl.feed_list assert rf3 in rfl.feed_list
def test_list_feeds(self): # Get feed list rss_check_class = self.function_dispatcher.get_function_by_name("rss check") rss_check_obj = self.function_dispatcher.get_function_object(rss_check_class) # type: FeedCheck rfl = rss_check_obj.rss_feed_list # Add RSS feeds to feed list rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_rss.xml?1" rf1.title = "test_feed1" rf1.server_name = self.server.name rf1.channel_name = self.test_chan.name rf1.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_rss.xml?2" rf2.title = "test_feed2" rf2.server_name = self.server.name rf2.channel_name = "another_channel" rf2.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_rss.xml?3" rf3.title = "test_feed3" rf3.server_name = self.server.name rf3.channel_name = self.test_chan.name rf3.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf3) # Run FeedList and check output self.function_dispatcher.dispatch("rss list", self.test_user, self.test_chan) data = self.server.get_send_data(1, self.test_chan, Server.MSG_MSG) data_split = data[0][0].split("\n") assert "rss feeds posting" in data_split[0].lower() assert "test_feed1" in data_split[1].lower() or "test_feed1" in data_split[2].lower() assert "test_feed3" in data_split[1].lower() or "test_feed3" in data_split[2].lower() assert ( "http://spangle.org.uk/hallo/test_rss.xml?1" in data_split[1].lower() or "http://spangle.org.uk/hallo/test_rss.xml?1" in data_split[2].lower() ) assert ( "http://spangle.org.uk/hallo/test_rss.xml?3" in data_split[1].lower() or "http://spangle.org.uk/hallo/test_rss.xml?3" in data_split[2].lower() ) assert "test_feed2" not in data_split[1].lower() and "test_feed2" not in data_split[2].lower() assert ( "http://spangle.org.uk/hallo/test_rss.xml?2" not in data_split[1].lower() and "http://spangle.org.uk/hallo/test_rss.xml?2" not in data_split[2].lower() )
def test_get_feeds_by_title(self): serv1 = ServerMock(None) serv1.name = "test_serv1" serv2 = ServerMock(None) serv2.name = "test_serv2" chan1 = serv1.get_channel_by_name("test_chan1") user2 = serv1.get_user_by_name("test_user2") chan3 = serv2.get_channel_by_name("test_chan3") # Setup a feed list rfl = RssFeedList() rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_feed.xml?1" rf1.title = "test_feed1" rf1.server_name = chan1.server.name rf1.channel_name = chan1.name rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_feed.xml?2" rf2.title = "test_feed2" rf2.server_name = user2.server.name rf2.user_name = user2.name rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_feed.xml?3" rf3.title = "test_feed3" rf3.server_name = chan3.server.name rf3.channel_name = chan3.name rfl.add_feed(rf3) rf4 = RssFeed() rf4.url = "http://spangle.org.uk/hallo/test_feed.xml?4" rf4.title = "test_feed4" rf4.server_name = chan3.server.name rf4.channel_name = chan3.name rfl.add_feed(rf4) rf5 = RssFeed() rf5.url = "http://spangle.org.uk/hallo/test_feed.xml?5" rf5.title = "test_feed3" rf5.server_name = chan3.server.name rf5.channel_name = chan3.name rfl.add_feed(rf5) # Check function feed_list = rfl.get_feeds_by_title("test_feed3", chan3) assert len(feed_list) == 2 assert rf3 in feed_list assert rf5 in feed_list
def test_xml(self): # Setup a feed list rfl = RssFeedList() rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_feed.xml?1" rf1.title = "test_feed1" rf1.update_frequency = Commons.load_time_delta("P0T3600S") rf1.server_name = "test_serv1" rf1.channel_name = "test_chan1" rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_feed.xml?2" rf2.title = "test_feed2" rf2.update_frequency = Commons.load_time_delta("P1TS") rf2.server_name = "test_serv2" rf2.channel_name = "test_chan2" rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_feed.xml?3" rf3.title = "test_feed3" rf3.update_frequency = Commons.load_time_delta("PT60S") rf3.server_name = "test_serv3" rf3.user_name = "test_user3" rfl.add_feed(rf3) # Save to XML and load try: try: os.rename("store/rss_feeds.xml", "store/rss_feeds.xml.tmp") except OSError: pass rfl.to_xml() new_rfl = RssFeedList.from_xml() assert len(new_rfl.feed_list) == 3 finally: try: os.remove("store/rss_feeds.xml") except OSError: pass try: os.rename("store/rss_feeds.xml.tmp", "store/rss_feeds.xml") except OSError: pass
def test_xml(self): test_rss_url = "http://spangle.org.uk/hallo/test_rss.xml" test_seconds = 3600 test_days = 0 # Create example feed rf = RssFeed() rf.url = test_rss_url rf.update_frequency = Commons.load_time_delta("P"+str(test_days)+"T"+str(test_seconds)+"S") rf.server_name = "test_serv" rf.channel_name = "test_chan" # Clear off the current items rf.check_feed() # Ensure there are no new items new_items = rf.check_feed() assert len(new_items) == 0 # Save to XML and load up new RssFeed rf_xml = rf.to_xml_string() rf2 = RssFeed.from_xml_string(rf_xml) # Ensure there's still no new items new_items = rf2.check_feed() assert len(new_items) == 0 assert rf2.update_frequency.days == test_days assert rf2.update_frequency.seconds == test_seconds
def test_run_all(self): # Set up test servers and channels serv1 = ServerMock(None) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_name("test_chan1") chan2 = serv1.get_channel_by_name("test_chan2") serv2 = ServerMock(None) serv2.name = "test_serv2" chan3 = serv2.get_channel_by_name("test_chan1") try: self.hallo.add_server(serv1) self.hallo.add_server(serv2) # Set up rss feeds rfl = RssFeedList() rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_rss.xml?1" rf1.title = "test_feed1" rf1.server_name = chan1.server.name rf1.channel_name = chan1.name rf1.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_rss.xml?2" rf2.title = "test_feed2" rf2.server_name = chan2.server.name rf2.channel_name = chan2.name rf2.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_rss.xml?3" rf3.title = "test_feed1" rf3.server_name = chan3.server.name rf3.channel_name = chan3.name rf3.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf3) # Splice this rss feed list into the function dispatcher's rss check object rss_check_class = self.function_dispatcher.get_function_by_name("rss check") rss_check_obj = self.function_dispatcher.get_function_object(rss_check_class) # type: FeedCheck rss_check_obj.rss_feed_list = rfl # Test running all feed updates self.function_dispatcher.dispatch("rss check all", self.test_user, self.test_chan) # Check original calling channel data serv0_data = self.server.get_send_data(1, self.test_chan, Server.MSG_MSG) assert "feed updates were found" in serv0_data[0][0] # Check test server 1 data serv1_data = serv1.get_send_data(6) chan1_count = 0 chan2_count = 0 for data_line in serv1_data: if data_line[1] == chan1: chan1_count += 1 if data_line[1] == chan2: chan2_count += 1 assert chan1_count == 3 assert chan2_count == 3 # Check test server 2 data serv2_data = serv2.get_send_data(3, chan3, Server.MSG_MSG) # Test running with no new updates. self.function_dispatcher.dispatch("rss check all", self.test_user, self.test_chan) data = self.server.get_send_data(1, self.test_chan, Server.MSG_MSG) assert "no feed updates" in data[0][0], "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(None) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_name("test_chan1") chan2 = serv1.get_channel_by_name("test_chan2") serv2 = ServerMock(None) serv2.name = "test_serv2" chan3 = serv2.get_channel_by_name("test_chan1") try: self.hallo.add_server(serv1) self.hallo.add_server(serv2) # Set up rss feeds rfl = RssFeedList() rf1 = RssFeed() rf1.url = "http://spangle.org.uk/hallo/test_rss.xml?1" rf1.title = "test_feed1" rf1.server_name = chan1.server.name rf1.channel_name = chan1.name rf1.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf1) rf2 = RssFeed() rf2.url = "http://spangle.org.uk/hallo/test_rss.xml?2" rf2.title = "test_feed2" rf2.server_name = chan2.server.name rf2.channel_name = chan2.name rf2.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf2) rf3 = RssFeed() rf3.url = "http://spangle.org.uk/hallo/test_rss.xml?3" rf3.title = "test_feed1" rf3.server_name = chan3.server.name rf3.channel_name = chan3.name rf3.update_frequency = Commons.load_time_delta("PT3600S") rfl.add_feed(rf3) # Splice this rss feed list into the function dispatcher's rss check object rss_check_class = self.function_dispatcher.get_function_by_name("rss check") rss_check_obj = self.function_dispatcher.get_function_object(rss_check_class) # type: FeedCheck rss_check_obj.rss_feed_list = rfl # Test passive feed updates self.function_dispatcher.dispatch_passive(Function.EVENT_MINUTE, None, None, None, None) # Check test server 1 data serv1_data = serv1.get_send_data(6) chan1_count = 0 chan2_count = 0 for data_line in serv1_data: if data_line[1] == chan1: chan1_count += 1 if data_line[1] == chan2: chan2_count += 1 assert chan1_count == 3 assert chan2_count == 3 # Check test server 2 data serv2_data = serv2.get_send_data(3, chan3, Server.MSG_MSG) # 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(Function.EVENT_MINUTE, None, None, None, None) 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(Function.EVENT_MINUTE, None, None, None, None) 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)
def test_output_item(self): # Create example rss item element item_title = "test_title1" item_link = "http://example.com/item1" feed_title = "feed_title1" rss_data = "<channel><item><title>" + item_title + "</title><link>" + item_link + "</link></item></channel>" rss_elem = ElementTree.fromstring(rss_data) item_elem = rss_elem.find("item") # Check output works with given server and channel rf1 = RssFeed() rf1.update_frequency = Commons.load_time_delta("P1TS") rf1.title = feed_title serv1 = ServerMock(None) serv1.name = "test_serv1" chan1 = serv1.get_channel_by_name("test_chan1") rf1.output_item(item_elem, None, serv1, chan1) data = serv1.get_send_data(1, chan1, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check output works with given server not channel rf2 = RssFeed() rf2.update_frequency = Commons.load_time_delta("P1TS") rf2.title = feed_title rf2.channel_name = "test_chan2" serv2 = ServerMock(None) serv2.name = "test_serv2" chan2 = serv2.get_channel_by_name("test_chan2") rf2.output_item(item_elem, None, serv2) data = serv2.get_send_data(1, chan2, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check output works with given server not user rf3 = RssFeed() rf3.update_frequency = Commons.load_time_delta("P1TS") rf3.title = feed_title rf3.user_name = "test_user3" serv3 = ServerMock(None) serv3.name = "test_serv3" user3 = serv3.get_user_by_name("test_user3") rf3.output_item(item_elem, None, serv3) data = serv3.get_send_data(1, user3, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check output works without given server with given channel rf4 = RssFeed() rf4.update_frequency = Commons.load_time_delta("P1TS") rf4.title = feed_title rf4.server_name = "test_serv4" serv4 = ServerMock(None) serv4.name = "test_serv4" hallo4 = Hallo() hallo4.add_server(serv4) chan4 = serv4.get_channel_by_name("test_chan4") rf4.output_item(item_elem, hallo4, None, chan4) data = serv4.get_send_data(1, chan4, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check output works without given server with given user rf5 = RssFeed() rf5.update_frequency = Commons.load_time_delta("P1TS") rf5.title = feed_title rf5.server_name = "test_serv5" serv5 = ServerMock(None) serv5.name = "test_serv5" hallo5 = Hallo() hallo5.add_server(serv5) chan5 = serv5.get_channel_by_name("test_chan5") rf5.output_item(item_elem, hallo5, None, chan5) data = serv5.get_send_data(1, chan5, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check output works without given server or channel to channel rf6 = RssFeed() rf6.update_frequency = Commons.load_time_delta("P1TS") rf6.title = feed_title rf6.server_name = "test_serv6" rf6.channel_name = "test_chan6" serv6 = ServerMock(None) serv6.name = "test_serv6" hallo6 = Hallo() hallo6.add_server(serv6) chan6 = serv6.get_channel_by_name("test_chan6") rf6.output_item(item_elem, hallo6) data = serv6.get_send_data(1, chan6, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check output works without given server or channel to user rf7 = RssFeed() rf7.update_frequency = Commons.load_time_delta("P1TS") rf7.title = feed_title rf7.server_name = "test_serv7" rf7.user_name = "test_user7" serv7 = ServerMock(None) serv7.name = "test_serv7" hallo7 = Hallo() hallo7.add_server(serv7) user7 = serv7.get_user_by_name("test_user7") rf7.output_item(item_elem, hallo7) data = serv7.get_send_data(1, user7, Server.MSG_MSG) assert feed_title in data[0][0] assert item_title in data[0][0] assert item_link in data[0][0] # Check invalid server output (server name is none) rf8 = RssFeed() rf8.update_frequency = Commons.load_time_delta("P1TS") rf8.title = feed_title hallo8 = Hallo() resp = rf8.output_item(item_elem, hallo8) assert "error" in resp.lower() assert "server" in resp.lower() # Check invalid server output ( server name is not in hallo obj) rf9 = RssFeed() rf9.update_frequency = Commons.load_time_delta("P1TS") rf9.title = feed_title rf9.server_name = "not_a_server" hallo9 = Hallo() resp = rf9.output_item(item_elem, hallo9) assert "error" in resp.lower() assert "server" in resp.lower() # Check invalid channel/user output (only possible if channel name and user name are none) (with given server) rf10 = RssFeed() rf10.update_frequency = Commons.load_time_delta("P1TS") rf10.title = feed_title serv10 = ServerMock(None) serv10.name = "test_serv10" hallo10 = Hallo() hallo10.add_server(serv10) resp = rf10.output_item(item_elem, hallo10, serv10) assert "error" in resp.lower() assert "destination" in resp.lower() # Check invalid channel/user output (only possible if channel name and user name are none) (with named server) rf11 = RssFeed() rf11.update_frequency = Commons.load_time_delta("P1TS") rf11.title = feed_title rf11.server_name = "test_serv11" serv11 = ServerMock(None) serv11.name = "test_serv11" hallo11 = Hallo() hallo11.add_server(serv11) resp = rf11.output_item(item_elem, hallo11) assert "error" in resp.lower() assert "destination" in resp.lower()