2005-02-02 07:03:09 +01:00
###
# Copyright (c) 2002-2004, Jeremiah Fincher
2012-09-01 16:16:48 +02:00
# Copyright (c) 2009, James McCoy
2021-10-17 09:54:06 +02:00
# Copyright (c) 2010-2021, Valentin Lorentz
2005-02-02 07:03:09 +01:00
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
2020-09-19 10:15:23 +02:00
import functools
from unittest . mock import patch
2022-08-07 18:50:14 +02:00
import socket
2014-07-31 00:00:20 +02:00
import sys
2020-09-19 10:15:23 +02:00
2014-07-31 00:00:20 +02:00
import feedparser
2020-09-19 10:15:23 +02:00
2005-02-02 07:03:09 +01:00
from supybot . test import *
2014-07-31 00:00:20 +02:00
import supybot . conf as conf
2015-08-11 16:50:23 +02:00
import supybot . utils . minisix as minisix
2014-07-31 00:00:20 +02:00
xkcd_old = """ <?xml version= " 1.0 " encoding= " utf-8 " ?>
< rss version = " 2.0 " > < channel > < title > xkcd . com < / title > < link > http : / / xkcd . com / < / link > < description > xkcd . com : A webcomic of romance and math humor . < / description > < language > en < / language > < item > < title > Snake Facts < / title > < link > http : / / xkcd . com / 1398 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/snake_facts.png " title = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " alt = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " / & gt ; < / description > < pubDate > Wed , 23 Jul 2014 04 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1398 / < / guid > < / item > < / channel > < / rss >
"""
xkcd_new = """ <?xml version= " 1.0 " encoding= " utf-8 " ?>
2017-01-27 21:00:49 +01:00
< rss version = " 2.0 " > < channel > < title > xkcd . com < / title > < link > http : / / xkcd . com / < / link > < description > xkcd . com : A webcomic of romance and math humor . < / description > < language > en < / language > < item > < title > Telescopes : Refractor vs Reflector < / title > < link > http : / / xkcd . com / 1791 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/telescopes_refractor_vs_reflector.png " title = " On the other hand, the refractor ' s limited light-gathering means it ' s unable to make out shadow people or the dark god Chernabog. " alt = " On the other hand, the refractor ' s limited light-gathering means it ' s unable to make out shadow people or the dark god Chernabog. " / & gt ; < / description > < pubDate > Fri , 27 Jan 2017 05 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1791 / < / guid > < / item > < item > < title > Chaos < / title > < link > http : / / xkcd . com / 1399 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/chaos.png " title = " Although the oral exam for the doctorate was just ' can you do that weird laugh? ' " alt = " Although the oral exam for the doctorate was just ' can you do that weird laugh? ' " / & gt ; < / description > < pubDate > Fri , 25 Jul 2014 04 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1399 / < / guid > < / item > < item > < title > Snake Facts < / title > < link > http : / / xkcd . com / 1398 / < / link > < description > & lt ; img src = " http://imgs.xkcd.com/comics/snake_facts.png " title = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " alt = " Biologically speaking, what we call a ' snake ' is actually a human digestive tract which has escaped from its host. " / & gt ; < / description > < pubDate > Wed , 23 Jul 2014 04 : 00 : 00 - 0000 < / pubDate > < guid > http : / / xkcd . com / 1398 / < / guid > < / item > < / channel > < / rss >
2014-07-31 00:00:20 +02:00
"""
2018-10-14 21:41:43 +02:00
not_well_formed = """ <?xml version= " 1.0 " encoding= " utf-8 " ?>
< rss version = " 2.0 " >
< channel >
< title > this is missing a close tag
< link > http : / / example . com / < / link >
< description > this dummy feed has no elements < / description >
< language > en < / language >
< / channel >
< / rss >
"""
2014-08-01 00:16:17 +02:00
2020-09-19 10:15:23 +02:00
class MockResponse :
headers = { }
url = ' '
def read ( self ) :
return self . _data . encode ( )
def close ( self ) :
pass
2023-07-26 14:20:45 +02:00
def geturl ( self ) :
return url
2020-09-19 10:15:23 +02:00
def mock_urllib ( f ) :
mock = MockResponse ( )
@functools.wraps ( f )
def newf ( self ) :
with patch ( " urllib.request.OpenerDirector.open " , return_value = mock ) :
f ( self , mock )
return newf
2005-02-02 07:03:09 +01:00
url = ' http://www.advogato.org/rss/articles.xml '
class RSSTestCase ( ChannelPluginTestCase ) :
2024-05-12 16:34:36 +02:00
plugins = ( ' RSS ' , ' Plugin ' )
2020-04-11 00:17:16 +02:00
timeout = 1
2005-02-02 07:03:09 +01:00
def testRssAddBadName ( self ) :
self . assertError ( ' rss add " foo bar " %s ' % url )
def testCantAddFeedNamedRss ( self ) :
self . assertError ( ' rss add rss %s ' % url )
def testCantRemoveMethodThatIsntFeed ( self ) :
self . assertError ( ' rss remove rss ' )
2014-07-31 23:56:27 +02:00
def testCantAddDuplicatedFeed ( self ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
try :
self . assertError ( ' rss add xkcddup http://xkcd.com/rss.xml ' )
finally :
self . assertNotError ( ' rss remove xkcd ' )
2021-05-01 13:27:56 +02:00
@mock_urllib
def testRemoveAliasedFeed ( self , mock ) :
2021-08-22 19:23:05 +02:00
mock . _data = xkcd_old
2021-05-01 13:27:56 +02:00
try :
self . assertNotError ( ' rss announce add http://xkcd.com/rss.xml ' )
2021-08-22 19:23:05 +02:00
# Clear the queue or it's going to mess up the finally block
self . assertRegexp ( ' ' , ' Snake Facts ' )
self . assertNoResponse ( ' ' )
2021-05-01 13:27:56 +02:00
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
finally :
self . assertNotError ( ' rss announce remove http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss remove xkcd ' )
self . assertEqual ( self . irc . getCallback ( ' RSS ' ) . feed_names , { } )
2021-08-22 19:21:28 +02:00
self . assertTrue ( self . irc . getCallback ( ' RSS ' ) . get_feed ( ' http://xkcd.com/rss.xml ' ) )
2021-05-01 13:27:56 +02:00
2024-05-12 16:34:36 +02:00
@mock_urllib
def testChangeUrl ( self , mock ) :
try :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss remove xkcd ' )
self . assertNotError ( ' rss add xkcd https://xkcd.com/rss.xml ' )
self . assertRegexp ( ' help xkcd ' , ' https:// ' )
finally :
self . _feedMsg ( ' rss remove xkcd ' )
@mock_urllib
def testChangeName ( self , mock ) :
try :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss remove xkcd ' )
self . assertNotError ( ' rss add xkcd2 http://xkcd.com/rss.xml ' )
self . assertRegexp ( ' help xkcd2 ' , ' http://xkcd.com ' )
finally :
self . _feedMsg ( ' rss remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd2 ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testInitialAnnounceNewest ( self , mock ) :
mock . _data = xkcd_new
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2015-09-02 09:43:29 +02:00
try :
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' newestFirst ' ) :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 1 ) :
2015-09-02 09:43:29 +02:00
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
2015-09-02 09:43:29 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testInitialAnnounceOldest ( self , mock ) :
mock . _data = xkcd_new
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2015-09-02 09:43:29 +02:00
try :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 1 ) :
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
2015-09-02 09:43:29 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testNoInitialAnnounce ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2014-08-13 16:42:47 +02:00
try :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 0 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2014-08-13 16:42:47 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testAnnounce ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2014-07-31 00:00:20 +02:00
try :
2014-10-10 16:41:30 +02:00
self . assertError ( ' rss announce add xkcd ' )
2014-07-31 00:00:20 +02:00
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNotError ( ' ' )
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Chaos ' )
self . assertRegexp ( ' ' , ' Telescopes ' )
self . assertNoResponse ( ' ' )
2014-07-31 00:00:20 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testMaxAnnounces ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-10-12 21:21:50 +02:00
try :
self . assertError ( ' rss announce add xkcd ' )
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
self . assertNotError ( ' ' )
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
with conf . supybot . plugins . RSS . maximumAnnounceHeadlines . context ( 1 ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
2019-10-05 15:57:01 +02:00
log . debug ( ' set return value to: %r ' , xkcd_new )
self . assertNoResponse ( ' ' , timeout = 0.1 )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-10-12 21:21:50 +02:00
self . assertRegexp ( ' ' , ' Telescopes ' )
self . assertNoResponse ( ' ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testAnnounceAnonymous ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2015-10-10 20:40:25 +02:00
try :
self . assertNotError ( ' rss announce add http://xkcd.com/rss.xml ' )
self . assertNotError ( ' ' )
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
2021-05-01 14:29:09 +02:00
self . assertRegexp ( ' ' , ' Chaos ' )
self . assertNoResponse ( ' ' , timeout = 0.1 )
2021-05-28 17:56:59 +02:00
self . assertResponse ( ' announce list ' , ' http://xkcd.com/rss.xml ' )
2015-10-10 20:40:25 +02:00
finally :
self . _feedMsg ( ' rss announce remove http://xkcd.com/rss.xml ' )
self . _feedMsg ( ' rss remove http://xkcd.com/rss.xml ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testAnnounceReload ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2014-07-31 22:53:03 +02:00
try :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2019-10-05 15:57:01 +02:00
self . assertNotError ( ' ' , timeout = 0.1 )
2014-07-31 22:53:03 +02:00
self . assertNotError ( ' reload RSS ' )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2021-05-28 17:56:59 +02:00
self . assertResponse ( ' announce list ' , ' xkcd ' )
2014-07-31 22:53:03 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testReload ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-10-21 16:48:44 +02:00
try :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2019-10-05 15:57:01 +02:00
self . assertRegexp ( ' ' , ' Snake Facts ' )
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
2017-10-21 16:48:44 +02:00
self . assertNotError ( ' reload RSS ' )
self . assertRegexp ( ' ' , ' Telescopes ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
2017-12-10 09:38:27 +01:00
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testReloadNoDelay ( self , mock ) :
2021-09-14 20:30:47 +02:00
# https://github.com/progval/Limnoria/issues/922
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-12-10 09:38:27 +01:00
try :
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertRegexp ( ' xkcd ' , ' Snake Facts ' )
self . assertNotError ( ' reload RSS ' )
self . assertRegexp ( ' xkcd ' , ' Snake Facts ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
2017-10-21 16:48:44 +02:00
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testReannounce ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-01-27 21:00:49 +01:00
try :
self . assertError ( ' rss announce add xkcd ' )
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd ' )
2017-10-21 16:48:44 +02:00
self . assertRegexp ( ' ' , ' Snake Facts ' )
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . waitPeriod . context ( 1 ) :
with conf . supybot . plugins . RSS . initialAnnounceHeadlines . context ( 1 ) :
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2017-01-27 21:00:49 +01:00
self . _feedMsg ( ' rss announce remove xkcd ' )
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2017-01-27 21:00:49 +01:00
self . assertNotError ( ' rss announce add xkcd ' )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-10-21 16:48:44 +02:00
self . assertRegexp ( ' ' , ' Chaos ' )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' Telescopes ' )
self . assertNoResponse ( ' ' )
finally :
self . _feedMsg ( ' rss announce remove xkcd ' )
self . _feedMsg ( ' rss remove xkcd ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testFeedSpecificFormat ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2014-07-31 23:50:27 +02:00
try :
self . assertNotError ( ' rss add xkcd http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss add xkcdsec https://xkcd.com/rss.xml ' )
self . assertNotError ( ' config plugins.RSS.feeds.xkcd.format foo ' )
self . assertRegexp ( ' config plugins.RSS.feeds.xkcd.format ' , ' foo ' )
self . assertRegexp ( ' xkcd ' , ' foo ' )
self . assertNotRegexp ( ' xkcdsec ' , ' foo ' )
finally :
self . _feedMsg ( ' rss remove xkcd ' )
self . _feedMsg ( ' rss remove xkcdsec ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testFeedSpecificWaitPeriod ( self , mock ) :
mock . _data = xkcd_old
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2015-09-23 11:05:25 +02:00
try :
self . assertNotError ( ' rss add xkcd1 http://xkcd.com/rss.xml ' )
self . assertNotError ( ' rss announce add xkcd1 ' )
self . assertNotError ( ' rss add xkcd2 http://xkcd.com/rss.xml&foo ' )
self . assertNotError ( ' rss announce add xkcd2 ' )
self . assertNotError ( ' ' )
self . assertNotError ( ' ' )
2017-01-27 21:00:49 +01:00
with conf . supybot . plugins . RSS . sortFeedItems . context ( ' oldestFirst ' ) :
with conf . supybot . plugins . RSS . feeds . xkcd1 . waitPeriod . context ( 1 ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2017-01-27 21:00:49 +01:00
self . assertRegexp ( ' ' , ' xkcd1.*Chaos ' )
self . assertRegexp ( ' ' , ' xkcd1.*Telescopes ' )
self . assertNoResponse ( ' ' )
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2019-10-05 15:57:01 +02:00
self . assertNoResponse ( ' ' , timeout = 0.1 )
2015-09-23 11:05:25 +02:00
finally :
self . _feedMsg ( ' rss announce remove xkcd1 ' )
self . _feedMsg ( ' rss remove xkcd1 ' )
self . _feedMsg ( ' rss announce remove xkcd2 ' )
self . _feedMsg ( ' rss remove xkcd2 ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testDescription ( self , mock ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2016-09-08 21:42:31 +02:00
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
2020-09-19 10:15:23 +02:00
mock . _data = xkcd_new
self . assertRegexp ( ' rss http://xkcd.com/rss.xml ' ,
' On the other hand, the refractor \' s ' )
2023-10-17 19:00:03 +02:00
@mock_urllib
2023-10-17 19:57:29 +02:00
def testAtomContentHtmlOnly ( self , mock ) :
2023-10-17 19:00:03 +02:00
timeFastForward ( 1.1 )
2023-10-17 19:57:29 +02:00
mock . _data = """
2023-10-17 19:00:03 +02:00
< ? xml version = " 1.0 " encoding = " UTF-8 " ? >
< feed xmlns = " http://www.w3.org/2005/Atom " xmlns : media = " http://search.yahoo.com/mrss/ " xml : lang = " en-US " >
< title > Recent Commits to anope : 2.0 < / title >
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< entry >
2023-10-17 19:57:29 +02:00
< title > title with & lt ; pre & gt ; HTML & lt ; / pre & gt ; < / title >
2023-10-17 19:00:03 +02:00
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< content type = " html " >
2023-10-17 19:57:29 +02:00
content with & lt ; pre & gt ; HTML & lt ; / pre & gt ;
2023-10-17 19:00:03 +02:00
< / content >
< / entry >
< / feed > """
2023-10-17 19:57:29 +02:00
with conf . supybot . plugins . RSS . format . context ( ' $content ' ) :
self . assertRegexp ( ' rss https://example.org ' ,
' content with HTML ' )
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
2023-10-17 19:00:03 +02:00
self . assertRegexp ( ' rss https://example.org ' ,
' content with HTML ' )
@mock_urllib
2023-10-17 19:57:29 +02:00
def testAtomContentXhtmlOnly ( self , mock ) :
2023-10-17 19:00:03 +02:00
timeFastForward ( 1.1 )
2023-10-17 19:57:29 +02:00
mock . _data = """
2023-10-17 19:00:03 +02:00
< ? xml version = " 1.0 " encoding = " UTF-8 " ? >
< feed xmlns = " http://www.w3.org/2005/Atom " xmlns : media = " http://search.yahoo.com/mrss/ " xml : lang = " en-US " >
< title > Recent Commits to anope : 2.0 < / title >
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< entry >
2023-10-17 19:57:29 +02:00
< title > title with & lt ; pre & gt ; HTML & lt ; / pre & gt ; < / title >
2023-10-17 19:00:03 +02:00
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< content type = " xhtml " >
< div xmlns = " http://www.w3.org/1999/xhtml " >
2023-10-17 19:57:29 +02:00
content with < pre > XHTML < / pre >
2023-10-17 19:00:03 +02:00
< / div >
< / content >
< / entry >
< / feed > """
2023-10-17 19:57:29 +02:00
with conf . supybot . plugins . RSS . format . context ( ' $content ' ) :
self . assertRegexp ( ' rss https://example.org ' ,
' content with XHTML ' )
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
2023-10-17 19:00:03 +02:00
self . assertRegexp ( ' rss https://example.org ' ,
' content with XHTML ' )
@mock_urllib
2023-10-17 19:57:29 +02:00
def testAtomContentHtmlAndPlaintext ( self , mock ) :
2023-10-17 19:00:03 +02:00
timeFastForward ( 1.1 )
2023-10-17 19:57:29 +02:00
mock . _data = """
2023-10-17 19:00:03 +02:00
< ? xml version = " 1.0 " encoding = " UTF-8 " ? >
< feed xmlns = " http://www.w3.org/2005/Atom " xmlns : media = " http://search.yahoo.com/mrss/ " xml : lang = " en-US " >
< title > Recent Commits to anope : 2.0 < / title >
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< entry >
2023-10-17 19:57:29 +02:00
< title > title with & lt ; pre & gt ; HTML & lt ; / pre & gt ; < / title >
2023-10-17 19:00:03 +02:00
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< ! - - Atom spec says multiple contents is invalid , feedparser says it ' s not.
I like having the option , so let ' s make sure we support it. -->
< content type = " html " >
2023-10-17 19:57:29 +02:00
content with & lt ; pre & gt ; HTML & lt ; / pre & gt ;
2023-10-17 19:00:03 +02:00
< / content >
< content type = " text " >
content with plaintext
< / content >
< / entry >
< / feed > """
2023-10-17 19:57:29 +02:00
with conf . supybot . plugins . RSS . format . context ( ' $content ' ) :
self . assertRegexp ( ' rss https://example.org ' ,
' content with plaintext ' )
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
2023-10-17 19:00:03 +02:00
self . assertRegexp ( ' rss https://example.org ' ,
' content with plaintext ' )
@mock_urllib
2023-10-17 19:57:29 +02:00
def testAtomContentPlaintextAndHtml ( self , mock ) :
2023-10-17 19:00:03 +02:00
timeFastForward ( 1.1 )
2023-10-17 19:57:29 +02:00
mock . _data = """
2023-10-17 19:00:03 +02:00
< ? xml version = " 1.0 " encoding = " UTF-8 " ? >
< feed xmlns = " http://www.w3.org/2005/Atom " xmlns : media = " http://search.yahoo.com/mrss/ " xml : lang = " en-US " >
< title > Recent Commits to anope : 2.0 < / title >
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< entry >
2023-10-17 19:57:29 +02:00
< title > title with & lt ; pre & gt ; HTML & lt ; / pre & gt ; < / title >
2023-10-17 19:00:03 +02:00
< updated > 2023 - 10 - 04 T16 : 14 : 39 Z < / updated >
< ! - - Atom spec says multiple contents is invalid , feedparser says it ' s not.
I like having the option , so let ' s make sure we support it. -->
< content type = " text " >
content with plaintext
< / content >
< content type = " html " >
2023-10-17 19:57:29 +02:00
content with & lt ; pre & gt ; HTML & lt ; / pre & gt ;
2023-10-17 19:00:03 +02:00
< / content >
< / entry >
< / feed > """
2023-10-17 19:57:29 +02:00
with conf . supybot . plugins . RSS . format . context ( ' $content ' ) :
self . assertRegexp ( ' rss https://example.org ' ,
' content with plaintext ' )
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
2023-10-17 19:00:03 +02:00
self . assertRegexp ( ' rss https://example.org ' ,
' content with plaintext ' )
2023-10-17 19:57:29 +02:00
@mock_urllib
def testRssDescriptionHtml ( self , mock ) :
timeFastForward ( 1.1 )
mock . _data = """
< ? xml version = " 1.0 " encoding = " utf-8 " ? >
< rss xmlns : dc = " http://purl.org/dc/elements/1.1/ " xmlns : atom = " http://www.w3.org/2005/Atom " xmlns : content = " http://purl.org/rss/1.0/modules/content/ " xmlns : foaf = " http://xmlns.com/foaf/0.1/ " xmlns : og = " http://ogp.me/ns# " xmlns : rdfs = " http://www.w3.org/2000/01/rdf-schema# " xmlns : schema = " http://schema.org/ " xmlns : sioc = " http://rdfs.org/sioc/ns# " xmlns : sioct = " http://rdfs.org/sioc/types# " xmlns : skos = " http://www.w3.org/2004/02/skos/core# " xmlns : xsd = " http://www.w3.org/2001/XMLSchema# " version = " 2.0 " >
< channel >
< title > feed title < / title >
< description / >
< language > en < / language >
< item >
< title > title with & lt ; pre & gt ; HTML & lt ; / pre & gt ; < / title >
< description > description with & lt ; pre & gt ; HTML & lt ; / pre & gt ; < / description >
< / item >
< / channel >
< / feed > """
with conf . supybot . plugins . RSS . format . context ( ' $description ' ) :
self . assertRegexp ( ' rss https://example.org ' ,
' description with HTML ' )
2023-07-26 14:21:30 +02:00
@mock_urllib
def testFeedAttribute ( self , mock ) :
timeFastForward ( 1.1 )
with conf . supybot . plugins . RSS . format . context ( ' $feed_title: $title ' ) :
mock . _data = xkcd_new
self . assertRegexp ( ' rss http://xkcd.com/rss.xml ' ,
r ' xkcd \ .com: Telescopes ' )
2020-09-19 10:15:23 +02:00
@mock_urllib
def testBadlyFormedFeedWithNoItems ( self , mock ) :
2018-10-14 21:41:43 +02:00
# This combination will cause the RSS command to show the last parser
# error.
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2020-09-19 10:15:23 +02:00
mock . _data = not_well_formed
self . assertRegexp ( ' rss http://example.com/ ' ,
2022-08-07 18:50:14 +02:00
' Parser error: .*mismatch ' )
def testSocketError ( self ) :
class MockResponse :
headers = { }
url = ' '
def read ( self ) :
raise socket . error ( " oh no " )
def close ( self ) :
pass
mock = MockResponse ( )
with patch ( " urllib.request.OpenerDirector.open " , return_value = mock ) :
timeFastForward ( 1.1 )
self . assertRegexp ( ' rss http://example.com/ ' ,
' Parser error: .*oh no ' )
2018-10-14 21:41:43 +02:00
2005-02-02 07:03:09 +01:00
if network :
2020-04-11 00:17:16 +02:00
timeout = 5 # Note this applies also to the above tests
2005-02-02 07:03:09 +01:00
def testRssinfo ( self ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotError ( ' rss info %s ' % url )
self . assertNotError ( ' rss add advogato %s ' % url )
self . assertNotError ( ' rss info advogato ' )
self . assertNotError ( ' rss info AdVogATo ' )
self . assertNotError ( ' rss remove advogato ' )
def testRssinfoDoesTimeProperly ( self ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotRegexp ( ' rss info http://slashdot.org/slashdot.rss ' ,
' -1 years ' )
2014-07-31 00:00:20 +02:00
def testAnnounceAdd ( self ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2005-02-22 15:27:59 +01:00
self . assertNotError ( ' rss add advogato %s ' % url )
2009-02-28 06:10:10 +01:00
self . assertNotError ( ' rss announce add advogato ' )
2019-10-06 20:42:31 +02:00
self . assertRegexp ( ' rss announce channels advogato ' , ' advogato is announced to.* %s %s ' % ( self . irc . network , self . channel ) )
2005-02-22 15:27:59 +01:00
self . assertNotRegexp ( ' rss announce ' , r ' ValueError ' )
2019-10-06 20:42:31 +02:00
2009-02-28 06:10:10 +01:00
self . assertNotError ( ' rss announce remove advogato ' )
2019-10-06 20:42:31 +02:00
self . assertRegexp ( ' rss announce channels advogato ' , ' advogato is not announced to any channels ' )
2005-05-30 02:52:54 +02:00
self . assertNotError ( ' rss remove advogato ' )
2019-10-06 20:42:31 +02:00
self . assertRegexp ( ' rss announce channels advogato ' , ' Unknown feed ' )
2005-02-22 15:27:59 +01:00
2005-02-02 07:03:09 +01:00
def testRss ( self ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotError ( ' rss %s ' % url )
m = self . assertNotError ( ' rss %s 2 ' % url )
2022-11-20 19:32:38 +01:00
self . assertEqual ( m . args [ 1 ] . count ( ' | ' ) , 1 )
2005-02-02 07:03:09 +01:00
def testRssAdd ( self ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2005-02-02 07:03:09 +01:00
self . assertNotError ( ' rss add advogato %s ' % url )
self . assertNotError ( ' advogato ' )
self . assertNotError ( ' rss advogato ' )
self . assertNotError ( ' rss remove advogato ' )
2006-05-01 19:49:37 +02:00
self . assertNotRegexp ( ' list RSS ' , ' advogato ' )
2005-02-02 07:03:09 +01:00
self . assertError ( ' advogato ' )
self . assertError ( ' rss advogato ' )
2005-07-07 16:13:53 +02:00
def testNonAsciiFeeds ( self ) :
2019-10-05 12:12:46 +02:00
timeFastForward ( 1.1 )
2005-07-07 16:13:53 +02:00
self . assertNotError ( ' rss http://www.heise.de/newsticker/heise.rdf ' )
2006-04-06 17:00:53 +02:00
self . assertNotError ( ' rss info http://br-linux.org/main/index.xml ' )
2005-07-07 16:13:53 +02:00
2005-02-02 07:03:09 +01:00
2016-09-08 21:42:31 +02:00
2006-02-11 16:52:51 +01:00
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: