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 ) :
2006-05-01 19:49:37 +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
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-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: