diff --git a/plugins/Gameknot.py b/plugins/Gameknot.py index d7d6f91f2..35ba118d5 100644 --- a/plugins/Gameknot.py +++ b/plugins/Gameknot.py @@ -145,7 +145,7 @@ class Gameknot(callbacks.PrivmsgCommandAndRegexp): wp, lp, dp, seen) return s except AttributeError: - if ('User %s not found!' % name) in profile: + if ('User %s not found!' % name.lower()) in profile: raise callbacks.Error, 'No user %s exists.' % name else: raise callbacks.Error,'The format of the page was odd. %s' % \ @@ -166,7 +166,7 @@ class Gameknot(callbacks.PrivmsgCommandAndRegexp): _gkPlayer = re.compile(r"popd\('(Rating[^']+)'\).*?>([^<]+)<") _gkRating = re.compile(r": (\d+)[^:]+:
(\d+)[^,]+, (\d+)[^,]+, (\d+)") - _gkGameTitle = re.compile(r"

(.*?)\s* \s*\(started") + _gkGameTitle = re.compile(r"

(.*?)\s* ") _gkWon = re.compile(r'>(\S+)\s+won') _gkReason = re.compile(r'won\s+\(\S+\s+(\S+)\)') def gameknotSnarfer(self, irc, msg, match): diff --git a/plugins/Infobot.py b/plugins/Infobot.py index a7d87a73f..e705afbb3 100755 --- a/plugins/Infobot.py +++ b/plugins/Infobot.py @@ -79,6 +79,19 @@ def configure(advanced): filename = os.path.join(conf.supybot.directories.data(), 'Infobot.db') class InfobotDB(object): + _ends = ['!', + '.', + ', $who.',] + _dunnos = ['Dunno', + 'No idea', + 'I don\'t know', + 'I have no idea', + 'I don\'t have a clue',] + _confirms = ['10-4', + 'Okay', + 'Got it', + 'Gotcha', + 'I hear ya'] def __init__(self): try: fd = file(filename) @@ -89,19 +102,6 @@ class InfobotDB(object): (self._is, self._are) = pickle.load(fd) self._changes = 0 self._responses = 0 - self._ends = ['!', - '.', - ', $who.',] - self._dunnos = ['Dunno', - 'No idea', - 'I don\'t know', - 'I have no idea', - 'I don\'t have a clue',] - self._confirms = ['10-4', - 'Okay', - 'Got it', - 'Gotcha', - 'I hear ya'] def flush(self): fd = utils.transactionalFile(filename, 'wb') @@ -175,6 +175,7 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): self.msg = None self.force = False self.replied = False + self.badForce = False self.addressed = False def die(self): @@ -230,8 +231,11 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): else: value = random.choice(value.split('|')) if value.startswith(''): - self.reply(value[7:].strip(), - irc=irc, msg=msg) + value = value[7:].strip() + if value: + self.reply(value, irc=irc, msg=msg) + else: + self.log.debug('Not sending empty factoid.') elif value.startswith(''): self.reply(value[8:].strip(), irc=irc, msg=msg, action=True) @@ -267,6 +271,18 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): maybeForced = self._forceRe.sub('', payload) if maybeForced != payload: self.force = True + # Infobot requires that forces have the form "no, botname, ..." + # We think that's stupid to require the bot name if the bot is + # being directly addressed. The following makes sure both + # "botname: no, botname, ..." and "botname: no, ..." work the + # same and non-addressed forms require the bots nick. + nick = irc.nick.lower() + if not self.addressed: + if not maybeForced.lower().startswith(nick): + self.badForce = True + self.force = False + if maybeForced.lower().startswith(nick): + maybeForced = maybeForced[len(nick):].lstrip(', ') payload = maybeForced # Let's make sure we dump out of Infobot if the privmsg is an # actual command otherwise we could get multiple responses. @@ -289,6 +305,7 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): finally: self.force = False self.replied = False + self.badForce = False self.addressed = False def callCommand(self, f, irc, msg, *L, **kwargs): @@ -322,7 +339,9 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): key = match.group(1) if self.addressed or self.registryValue('answerUnaddressedQuestions'): self.factoid(key) # Does the dunno'ing for us itself. - # TODO: Add invalidCommand. + + def invalidCommand(self, irc, msg, tokens): + self.replied = True def doFactoid(self, irc, msg, match): r"^(.+)\s+(?(.*?)', re.I | re.S) def getDb(self, channel): return URLDB(channel, self.log) - + def doPrivmsg(self, irc, msg): channel = msg.args[0] db = self.getDb(channel) @@ -184,7 +181,6 @@ class URL(callbacks.PrivmsgCommandAndRegexp): text = msg.args[1] for url in webutils.urlRe.findall(text): r = self.registryValue('nonSnarfingRegexp', channel) - #self.log.warning(repr(r)) if r and r.search(url): self.log.debug('Skipping adding %r to db.', url) continue @@ -193,14 +189,15 @@ class URL(callbacks.PrivmsgCommandAndRegexp): callbacks.PrivmsgCommandAndRegexp.doPrivmsg(self, irc, msg) def tinyurlSnarfer(self, irc, msg, match): - r"https?://[^\])>\s]{18,}" + r"https?://[^\])>\s]{13,}" channel = msg.args[0] if not ircutils.isChannel(channel): return r = self.registryValue('nonSnarfingRegexp', channel) if self.registryValue('tinyurlSnarfer', channel): url = match.group(0) - if r and r.search(url): + if r and r.search(url) is not None: + self.log.debug('Not tinyUrlSnarfing %r', url) return minlen = self.registryValue('tinyurlSnarfer.minimumLength',channel) if len(url) >= minlen: @@ -243,19 +240,16 @@ class URL(callbacks.PrivmsgCommandAndRegexp): _tinyRe = re.compile(r'

(http://tinyurl\.com/\w+)') def _getTinyUrl(self, url, channel, cmd=False): try: - fd = urllib2.urlopen('http://tinyurl.com/create.php?url=%s' % - url) - s = fd.read() - fd.close() + s = webutils.getUrl('http://tinyurl.com/create.php?url=%s' % url) m = self._tinyRe.search(s) if m is None: tinyurl = None else: tinyurl = m.group(1) return tinyurl - except urllib2.HTTPError, e: + except webutils.WebError, e: if cmd: - raise callbacks.Error, e.msg() + raise callbacks.Error, e else: self.log.warning(str(e)) @@ -271,13 +265,19 @@ class URL(callbacks.PrivmsgCommandAndRegexp): channel = msg.args[0] snarf = self.registryValue('tinyurlSnarfer', channel) minlen = self.registryValue('tinyurlSnarfer.minimumLength', channel) + dontSnarf = False r = self.registryValue('nonSnarfingRegexp', channel) - if snarf and len(url) >= minlen and not r.search(url): + if r is not None: + dontSnarf = r.search(url) + dontSnarf = not dontSnarf + if snarf and len(url) >= minlen and dontSnarf: self.log.debug('Not applying tiny command, snarfer is active.') return tinyurl = self._getTinyUrl(url, channel, cmd=True) + domain = webutils.getDomain(url) + s = '%s (at %s)' % (ircutils.bold(tinyurl), domain) if tinyurl is not None: - irc.reply(tinyurl) + irc.reply(s) else: s = 'Could not parse the TinyURL.com results page.' irc.errorPossibleBug(s) diff --git a/plugins/__init__.py b/plugins/__init__.py index 237dc66fd..382b74180 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -308,6 +308,9 @@ class PeriodicFileDownloader(object): except IOError, e: self.log.warning('Error downloading %s: %s', url, e) return + except webutils.WebError, e: + self.log.warning('Error downloading %s: %s', url, e) + return confDir = conf.supybot.directories.data() newFilename = os.path.join(confDir, utils.mktemp()) outfd = file(newFilename, 'wb') diff --git a/scripts/supybot b/scripts/supybot index 83bc36dcb..3cc8cffff 100755 --- a/scripts/supybot +++ b/scripts/supybot @@ -234,6 +234,8 @@ if __name__ == '__main__': os.mkdir(conf.supybot.directories.conf()) if not os.path.exists(conf.supybot.directories.data()): os.mkdir(conf.supybot.directories.data()) + if not os.path.exists(conf.supybot.directories.data.tmp()): + os.mkdir(conf.supybot.directories.tmp()) userdataFilename = os.path.join(conf.supybot.directories.conf(), 'userdata.conf') diff --git a/src/callbacks.py b/src/callbacks.py index 6e1e04be7..6f74a7d6e 100644 --- a/src/callbacks.py +++ b/src/callbacks.py @@ -138,7 +138,7 @@ def reply(msg, s, prefixName=True, private=False, to = msg.nick # Ok, now let's make the payload: s = ircutils.safeArgument(s) - if not s: + if not s and not action: s = 'Error: I tried to send you an empty message.' # Let's may sure we don't do, "#channel: foo.". if prefixName and ircutils.isChannel(target): diff --git a/test/test.py b/test/test.py index 46eebba47..408f21a76 100755 --- a/test/test.py +++ b/test/test.py @@ -45,7 +45,7 @@ fd.write(""" supybot.directories.data: test-data supybot.directories.conf: test-conf supybot.directories.log: test-logs -supybot.reply.whenNotCommand: False +supybot.reply.whenNotCommand: True supybot.log.stdout: False supybot.log.level: DEBUG supybot.log.detailedTracebacks: False diff --git a/test/test_Alias.py b/test/test_Alias.py index 13b26331b..f5f608386 100644 --- a/test/test_Alias.py +++ b/test/test_Alias.py @@ -85,7 +85,7 @@ class AliasTestCase(ChannelPluginTestCase, PluginDocumentation): self.assertNotError('alias add foo echo bar') self.assertResponse('foo', 'bar') self.assertNotError('alias remove foo') - self.assertNoResponse('foo', 2) + self.assertError('foo') def testDollars(self): self.assertNotError('alias add rot26 "rot13 [rot13 $1]"') @@ -133,7 +133,7 @@ class AliasTestCase(ChannelPluginTestCase, PluginDocumentation): self.assertRaises(Alias.AliasError, cb.removeAlias, 'foobar') cb.removeAlias('foobar', evenIfLocked=True) self.failIf('foobar' in cb.aliases) - self.assertNoResponse('foobar', 2) + self.assertError('foobar') def testOptionalArgs(self): self.assertNotError('alias add myrepr "repr @1"') diff --git a/test/test_Amazon.py b/test/test_Amazon.py index 098852ff8..a0fb558f9 100644 --- a/test/test_Amazon.py +++ b/test/test_Amazon.py @@ -60,9 +60,9 @@ if LICENSE_KEY != 'INITIAL_NON_LICENSE_KEY' and network: r'Short Bus.*/exec/obidos') def testAuthor(self): - self.assertHelp('author') - self.assertRegexp('author torvalds', r'Just for Fun') - self.assertRegexp('author --url torvalds', r'Reilly.*/exec/obidos') + self.assertHelp('amazon author') + self.assertRegexp('amazon author torvalds', r'Just for Fun') + self.assertRegexp('amazon author --url torvalds', r'Reilly') def testArtist(self): self.assertHelp('artist') diff --git a/test/test_BadWords.py b/test/test_BadWords.py index 6d931af8f..583360ace 100644 --- a/test/test_BadWords.py +++ b/test/test_BadWords.py @@ -35,8 +35,10 @@ class BadWordsTestCase(PluginTestCase): plugins = ('BadWords', 'Utilities', 'Format') badwords = ('shit', 'ass') def tearDown(self): - default = conf.supybot.plugins.BadWords.words.default - conf.supybot.plugins.BadWords.words.setValue(default) + # .default() doesn't seem to be working for BadWords.words + #default = conf.supybot.plugins.BadWords.words.default() + #conf.supybot.plugins.BadWords.words.setValue(default) + conf.supybot.plugins.BadWords.words.setValue([]) def _test(self): for word in self.badwords: diff --git a/test/test_Bugzilla.py b/test/test_Bugzilla.py index 1e9f6050d..220244b2a 100644 --- a/test/test_Bugzilla.py +++ b/test/test_Bugzilla.py @@ -39,10 +39,10 @@ if network: self.assertNotError('bug gcc 5') def testAddRemove(self): - self.assertNotError('add xiph http://bugs.xiph.org/ Xiph') - self.assertNotError('bug xiph 413') - self.assertNotError('remove xiph') - self.assertError('bug xiph 413') + self.assertNotError('add gcc http://gcc.gnu.org/bugzilla gcc') + self.assertNotError('bug gcc 5') + self.assertNotError('remove gcc') + self.assertError('bug gcc 413') def testSearch(self): self.assertNotError('add gcc http://gcc.gnu.org/bugzilla gcc') diff --git a/test/test_Dunno.py b/test/test_Dunno.py index c8f356cc6..e0b1118d5 100644 --- a/test/test_Dunno.py +++ b/test/test_Dunno.py @@ -57,21 +57,21 @@ if sqlite is not None: self.assertError('dunno search moo') self.assertNotError('dunno add moo') self.assertResponse('dunno search moo', 'Dunno search for \'moo\' ' - '(1 found): 2') + '(1 found): 2.') self.assertResponse('dunno search m', 'Dunno search for \'m\' ' - '(1 found): 2') + '(1 found): 2.') # Test multiple adds for i in range(5): self.assertNotError('dunno add moo%s' % i) self.assertResponse('dunno search moo', 'Dunno search for \'moo\' (6 found): ' - '2, 3, 4, 5, 6, and 7') + '2, 3, 4, 5, 6, and 7.') def testDunnoGet(self): self.assertNotError('dunno add moo') - self.assertResponse('dunno get 1', 'Dunno #1: \'moo\'') + self.assertResponse('dunno get 1', 'Dunno #1: \'moo\'.') self.assertNotError('dunno add $who') - self.assertResponse('dunno get 2', 'Dunno #2: \'$who\'') + self.assertResponse('dunno get 2', 'Dunno #2: \'$who\'.') self.assertError('dunno get 3') self.assertError('dunno get a') diff --git a/test/test_Ebay.py b/test/test_Ebay.py index e5dfe8590..42d13f544 100644 --- a/test/test_Ebay.py +++ b/test/test_Ebay.py @@ -41,36 +41,49 @@ if network: self.assertError('auction foobar') def testSnarfer(self): - conf.supybot.plugins.Ebay.auctionSnarfer.setValue(True) - self.assertRegexp('http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem' - '&category=176&item=3053767552', - r'.*Cisco NP-4T.*Serial Module.*US \$74\.95.*') - self.assertRegexp('http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&' - 'category=28033&item=3053353651', - r'.*Cisco 2524 Router - NO RESERVE.*izontech \(.*') - # test snarfing other countries - self.assertRegexp('http://cgi.ebay.ca/ws/eBayISAPI.dll?ViewItem&' - 'item=3636820075', - r'NEW 34" Itech 8.8 Profile') - self.assertRegexp('http://cgi.ebay.co.uk/ws/eBayISAPI.dll?ViewItem&' - 'item=2355464443', - r'Any Clear Crazy') - self.assertRegexp('http://cgi.ebay.com.au/ws/eBayISAPI.dll?ViewItem&' - 'item=2762983161&category=4607', - r'Apple Mac G4') - # test .com/.*/ws/eBat compatibility - self.assertRegexp('http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?' - 'ViewItem&item=2439393310&category=33708', - r'88-89 CRX amber') + orig = conf.supybot.plugins.Ebay.auctionSnarfer() + try: + conf.supybot.plugins.Ebay.auctionSnarfer.setValue(True) + self.assertSnarfRegexp( + 'http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem' + '&category=176&item=3053767552', + r'.*Cisco NP-4T.*Serial Module.*US \$74\.95.*') + self.assertSnarfRegexp( + 'http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&' + 'category=28033&item=3053353651', + r'.*Cisco 2524 Router - NO RESERVE.*izontech \(.*') + # test snarfing other countries + self.assertSnarfRegexp( + 'http://cgi.ebay.ca/ws/eBayISAPI.dll?ViewItem&' + 'item=3636820075', + r'NEW 34" Itech 8.8 Profile') + self.assertSnarfRegexp( + 'http://cgi.ebay.co.uk/ws/eBayISAPI.dll?ViewItem&' + 'item=2355464443', + r'Any Clear Crazy') + self.assertSnarfRegexp( + 'http://cgi.ebay.com.au/ws/eBayISAPI.dll?ViewItem&' + 'item=2762983161&category=4607', + r'Apple Mac G4') + # test .com/.*/ws/eBat compatibility + self.assertSnarfRegexp( + 'http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?' + 'ViewItem&item=2439393310&category=33708', + r'88-89 CRX amber') + finally: + conf.supybot.plugins.Ebay.auctionSnarfer.setValue(orig) def testConfigSnarfer(self): - conf.supybot.plugins.Ebay.auctionSnarfer.setValue(False) - self.assertNoResponse('http://cgi.ebay.com/ebaymotors/ws/' - 'eBayISAPI.dll?ViewItem&item=2439393310&' - 'category=33708') - conf.supybot.plugins.Ebay.auctionSnarfer.setValue(True) - self.assertNotError('http://cgi.ebay.com/ebaymotors/ws/' - 'eBayISAPI.dll?ViewItem&item=2439393310&' - 'category=33708') + try: + conf.supybot.plugins.Ebay.auctionSnarfer.setValue(False) + self.assertSnarfNoResponse( + 'http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?' + 'ViewItem&item=2439393310&category=33708') + conf.supybot.plugins.Ebay.auctionSnarfer.setValue(True) + self.assertSnarfNotError( + 'http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?' + 'ViewItem&item=2439393310&category=33708') + finally: + conf.supybot.plugins.Ebay.auctionSnarfer.setValue(False) # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/test/test_Fun.py b/test/test_Fun.py index 051dd6ade..b5dcd3916 100644 --- a/test/test_Fun.py +++ b/test/test_Fun.py @@ -38,14 +38,15 @@ import supybot.utils as utils class FunTest(ChannelPluginTestCase, PluginDocumentation): plugins = ('Fun',) + _nonKickRe = re.compile(r'bang|click|spin', re.I) def testRoulette(self): self.irc.feedMsg(ircmsgs.op(self.channel, self.irc.nick)) sawKick = False for i in xrange(100): m = self.getMsg('roulette', frm='someoneElse') if m.command == 'PRIVMSG': - self.failUnless('click' in m.args[1].lower(), - 'Got a PRIVMSG without click in it.') + self.failUnless(self._nonKickRe.search(m.args[1]), + 'Got a PRIVMSG without bang|click|spin in it.') elif m.command == 'KICK': sawKick = True self.failUnless('bang' in m.args[2].lower(), diff --git a/test/test_Gameknot.py b/test/test_Gameknot.py index a9800efa6..072c7e944 100644 --- a/test/test_Gameknot.py +++ b/test/test_Gameknot.py @@ -39,21 +39,28 @@ if network: def testGkstats(self): self.assertNotRegexp('gkstats jemfinch', 'Old GK rating') self.assertError('gkstats %s' % utils.mktemp()) - self.assertNotError('gkstats Strike') + self.assertError('gkstats Strike') def testNoHtmlInTeam(self): self.assertNotRegexp('gkstats jeffuk', '9608') def testUrlSnarfer(self): - conf.supybot.plugins.Gameknot.gameSnarfer.setValue(True) - self.assertNotError('http://gameknot.com/chess.pl?bd=1019508') - self.assertNotError('here\'s a link: ' - 'http://gameknot.com/chess.pl?bd=1077350&r=394 ' - 'and here\'s another one: ' - 'http://gameknot.com/chess.pl?bd=1116828&r=250') - self.assertNotError(' ') # The next snarfed response. - self.assertNotRegexp('http://gameknot.com/chess.pl?bd=1019508', - self.nick) + orig = conf.supybot.plugins.Gameknot.gameSnarfer() + try: + conf.supybot.plugins.Gameknot.gameSnarfer.setValue(True) + self.assertSnarfNotError( + 'http://gameknot.com/chess.pl?bd=1019508') + self.assertSnarfNotError( + 'here\'s a link: ' + 'http://gameknot.com/chess.pl?bd=1077350&r=394 ' + 'and here\'s another one: ' + 'http://gameknot.com/chess.pl?bd=1116828&r=250') + self.irc.takeMsg() # The next snarfed response. + self.assertSnarfNotRegexp( + 'http://gameknot.com/chess.pl?bd=1019508', + self.nick) + finally: + conf.supybot.plugins.Gameknot.gameSnarfer.setValue(orig) def testStatsUrlSnarfer(self): conf.supybot.plugins.Gameknot.statSnarfer.setValue(True) @@ -73,17 +80,17 @@ if network: def testSnarfer(self): - conf.supybot.plugins.Gameknot.gameSnarfer.setValue(True) - # This game expired. -## self.assertRegexp('http://gameknot.com/chess.pl?bd=907498', -## '\x02ddipaolo\x0f won') - # As did this :( -## self.assertRegexp('http://gameknot.com/chess.pl?bd=907498', -## '\x02chroniqueur\x0f resigned') - self.assertRegexp('http://gameknot.com/chess.pl?bd=955432', - '\x02ddipaolo\x0f lost') - self.assertRegexp('http://gameknot.com/chess.pl?bd=1077345&r=365', - 'draw') + orig = conf.supybot.plugins.Gameknot.gameSnarfer() + try: + conf.supybot.plugins.Gameknot.gameSnarfer.setValue(True) + self.assertSnarfRegexp( + 'http://gameknot.com/chess.pl?bd=955432', + '\x02ddipaolo\x02 lost') + self.assertSnarfRegexp( + 'http://gameknot.com/chess.pl?bd=1077345&r=365', + 'draw') + finally: + conf.supybot.plugins.Gameknot.gameSnarfer.setValue(orig) diff --git a/test/test_Infobot.py b/test/test_Infobot.py index 0a7bbc240..0ea265009 100644 --- a/test/test_Infobot.py +++ b/test/test_Infobot.py @@ -31,32 +31,73 @@ from testsupport import * -try: - import sqlite -except ImportError: - sqlite = None +import supybot.plugins.Infobot +confirms = supybot.plugins.Infobot.InfobotDB._confirms +dunnos = supybot.plugins.Infobot.InfobotDB._dunnos -if sqlite is not None: - class InfobotTestCase(PluginTestCase): - plugins = ('Infobot',) - def testIsSnarf(self): - self.assertNoResponse('foo is at http://bar.com/', 2) - self.assertRegexp('foo?', r'foo.*is.*http://bar.com/') - self.assertNoResponse('foo is at http://baz.com/', 2) - self.assertNotRegexp('foo?', 'baz') +class InfobotTestCase(ChannelPluginTestCase): + plugins = ('Infobot',) + _endRe = re.compile(r'!|, \S+\.|\.') + def testIsSnarf(self): + ibot = conf.supybot.plugins.Infobot + learn = ibot.snarfUnaddressedDefinitions() + answer = ibot.answerUnaddressedQuestions() + try: + ibot.snarfUnaddressedDefinitions.setValue(True) + ibot.answerUnaddressedQuestions.setValue(True) + self.assertSnarfNoResponse('foo is at http://bar.com/', 2) + self.assertSnarfRegexp('foo?', r'foo.*is.*http://bar.com/') + self.assertSnarfNoResponse('foo is at http://baz.com/', 2) + self.assertSnarfNotRegexp('foo?', 'baz') + m = self.getMsg('bar is at http://foo.com/') + self.failUnless(self._endRe.sub('', m.args[1]) in confirms) + self.assertRegexp('bar?', r'bar.*is.*http://foo.com/') + finally: + ibot.snarfUnaddressedDefinitions.setValue(learn) + ibot.answerUnaddressedQuestions.setValue(answer) - def testAreSnarf(self): - self.assertNoResponse('bars are dirty', 2) - self.assertRegexp('bars?', 'bars.*are.*dirty') - self.assertNoResponse('bars are not dirty', 2) - self.assertNotRegexp('bars?', 'not') + def testAreSnarf(self): + ibot = conf.supybot.plugins.Infobot + learn = ibot.snarfUnaddressedDefinitions() + answer = ibot.answerUnaddressedQuestions() + try: + ibot.snarfUnaddressedDefinitions.setValue(True) + ibot.answerUnaddressedQuestions.setValue(True) + self.assertSnarfNoResponse('bars are dirty', 2) + self.assertSnarfRegexp('bars?', 'bars.*are.*dirty') + self.assertSnarfNoResponse('bars are not dirty', 2) + self.assertSnarfNotRegexp('bars?', 'not') + finally: + ibot.snarfUnaddressedDefinitions.setValue(learn) + ibot.answerUnaddressedQuestions.setValue(answer) - def testIsResponses(self): - self.assertNoResponse('foo is bar', 2) - self.assertRegexp('foo?', 'foo.*is.*bar') - self.assertNoResponse('when is foo?', 2) - self.assertNoResponse('why is foo?', 2) - self.assertNoResponse('why foo?', 2) - self.assertNoResponse('when is foo?', 2) + def testIsResponses(self): + ibot = conf.supybot.plugins.Infobot + learn = ibot.snarfUnaddressedDefinitions() + answer = ibot.answerUnaddressedQuestions() + try: + ibot.snarfUnaddressedDefinitions.setValue(True) + ibot.answerUnaddressedQuestions.setValue(True) + self.assertSnarfNoResponse('foo is bar', 2) + self.assertSnarfRegexp('foo?', 'foo.*is.*bar') + self.assertSnarfNoResponse('when is foo?', 2) + self.assertSnarfNoResponse('why is foo?', 2) + self.assertSnarfNoResponse('why foo?', 2) + self.assertSnarfNoResponse('when is foo?', 2) + finally: + ibot.snarfUnaddressedDefinitions.setValue(learn) + ibot.answerUnaddressedQuestions.setValue(answer) + + def testAnswerUnaddressed(self): + ibot = conf.supybot.plugins.Infobot + answer = ibot.answerUnaddressedQuestions() + try: + ibot.answerUnaddressedQuestions.setValue(True) + self.assertNotError('foo is bar') + self.assertSnarfRegexp('foo?', 'bar') + ibot.answerUnaddressedQuestions.setValue(False) + self.assertSnarfNoResponse('foo?', 2) + finally: + ibot.answerUnaddressedQuestions.setValue(answer) # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/test/test_Karma.py b/test/test_Karma.py index 2bb26daeb..89c9e780d 100644 --- a/test/test_Karma.py +++ b/test/test_Karma.py @@ -43,7 +43,7 @@ if sqlite is not None: plugins = ('Karma',) def testKarma(self): self.assertError('karma') - self.assertRegexp('karma foobar', 'no karma') + self.assertRegexp('karma foobar', 'neutral karma') try: conf.replyWhenNotCommand = True self.assertNoResponse('foobar++', 2) @@ -139,7 +139,7 @@ if sqlite is not None: conf.supybot.plugins.Karma.allowSelfRating.setValue(False) self.assertNoResponse('%s++' % nick, 2) self.assertResponse('karma %s' % nick, - '%s has no karma.' % nick) + '%s has neutral karma.' % nick) conf.supybot.plugins.Karma.allowSelfRating.setValue(True) self.assertNoResponse('%s++' % nick, 2) self.assertRegexp('karma %s' % nick, @@ -177,7 +177,7 @@ if sqlite is not None: def testIncreaseKarmaWithNickNotCallingInvalidCommand(self): - self.assertNoResponse('%s: foo++' % self.irc.nick, 3) + self.assertSnarfNoResponse('%s: foo++' % self.irc.nick, 3) # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/test/test_Misc.py b/test/test_Misc.py index 19f3b0d5d..96028daf7 100644 --- a/test/test_Misc.py +++ b/test/test_Misc.py @@ -52,12 +52,16 @@ class MiscTestCase(ChannelPluginTestCase): if network: def testNotReplyWhenRegexpsMatch(self): try: - original = str(conf.supybot.reply.whenNotCommand) - conf.supybot.reply.whenNotCommand.set('True') + orig = conf.supybot.reply.whenNotCommand() + gk = conf.supybot.plugins.Gameknot.gameSnarfer() + conf.supybot.reply.whenNotCommand.setValue(True) + conf.supybot.plugins.Gameknot.gameSnarfer.setValue(True) self.prefix = 'somethingElse!user@host.domain.tld' - self.assertNotError('http://gameknot.com/chess.pl?bd=1019508') + self.assertSnarfNotError( + 'http://gameknot.com/chess.pl?bd=1019508') finally: - conf.supybot.reply.whenNotCommand.set(original) + conf.supybot.reply.whenNotCommand.setValue(orig) + conf.supybot.plugins.Gameknot.gameSnarfer.setValue(gk) def testNotReplyWhenNotCanonicalName(self): try: @@ -130,11 +134,9 @@ class MiscTestCase(ChannelPluginTestCase): def testTell(self): m = self.getMsg('tell foo [plugin tell]') - self.failUnless(m.args[0] == 'foo') - self.failUnless('Misc' in m.args[1]) + self.failUnless('let you do' in m.args[1]) m = self.getMsg('tell #foo [plugin tell]') - self.failUnless(m.args[0] == '#foo') - self.failUnless('Misc' in m.args[1]) + self.failUnless('No need for' in m.args[1]) m = self.getMsg('tell me you love me') self.failUnless(m.args[0] == self.nick) @@ -162,7 +164,7 @@ class MiscTestCase(ChannelPluginTestCase): self.assertNotRegexp('more', 'more') def testInvalidCommand(self): - self.assertResponse('echo []', '[]') + self.assertError('echo []') def testMoreIsCaseInsensitive(self): self.assertNotError('echo %s' % ('abc'*2000)) diff --git a/test/test_Sourceforge.py b/test/test_Sourceforge.py index 6c15a4329..ed85be528 100644 --- a/test/test_Sourceforge.py +++ b/test/test_Sourceforge.py @@ -123,49 +123,48 @@ if network: try: original = conf.supybot.plugins.Sourceforge.trackerSnarfer() conf.supybot.plugins.Sourceforge.trackerSnarfer.setValue(True) - self.assertRegexp('http://sourceforge.net/tracker/index.php?' - 'func=detail&aid=589953&group_id=58965&' - 'atid=489447', - s) - self.assertRegexp('http://sourceforge.net/tracker/index.php?' - 'func=detail&aid=712761&group_id=58965&' - 'atid=489450', - s) - self.assertRegexp('http://sourceforge.net/tracker/index.php?' - 'func=detail&aid=540223&group_id=235&' - 'atid=300235', - s) - self.assertRegexp('http://sourceforge.net/tracker/index.php?' - 'func=detail&aid=561547&group_id=235&' - 'atid=200235', - s) - self.assertRegexp('http://sourceforge.net/tracker/index.php?' - 'func=detail&aid=400942&group_id=235&' - 'atid=390395', - s) + self.assertSnarfRegexp('http://sourceforge.net/tracker/index.' + 'php?func=detail&aid=589953&group_id=' + '58965&atid=489447', + s) + self.assertSnarfRegexp('http://sourceforge.net/tracker/index.' + 'php?func=detail&aid=712761&group_id=' + '58965&atid=489450', + s) + self.assertSnarfRegexp('http://sourceforge.net/tracker/index.' + 'php?func=detail&aid=540223&group_id=' + '235&atid=300235', + s) + self.assertSnarfRegexp('http://sourceforge.net/tracker/index.' + 'php?func=detail&aid=561547&group_id=' + '235&atid=200235', + s) + self.assertSnarfRegexp('http://sourceforge.net/tracker/index.' + 'php?func=detail&aid=400942&group_id=' + '235&atid=390395', + s) # test that it works without index.php - self.assertNotError('http://sourceforge.net/tracker/?' - 'func=detail&aid=540223&group_id=235&' - 'atid=300235') + self.assertSnarfNotError('http://sourceforge.net/tracker/?' + 'func=detail&aid=540223&group_id=235&' + 'atid=300235') # test that it works with www - self.assertNotError('http://www.sourceforge.net/tracker/index.php?' - 'func=detail&aid=540223&group_id=235&' - 'atid=300235') + self.assertSnarfNotError('http://www.sourceforge.net/tracker/' + 'index.php?func=detail&aid=540223&' + 'group_id=235&atid=300235') # test that it works with www and without index.php - self.assertNotError('http://www.sourceforge.net/tracker/?' - 'func=detail&aid=540223&group_id=235&' - 'atid=300235') + self.assertSnarfNotError('http://www.sourceforge.net/tracker/?' + 'func=detail&aid=540223&group_id=235&' + 'atid=300235') # test that it works with sf.net - self.assertNotError('http://sf.net/tracker/?' - 'func=detail&aid=540223&group_id=235&' - 'atid=300235') + self.assertSnarfNotError('http://sf.net/tracker/?func=detail&' + 'aid=540223&group_id=235&atid=300235') # test that it works - self.assertNotError('https://sourceforge.net/tracker/?' - 'func=detail&atid=105470&aid=827260&' - 'group_id=5470') - self.assertNoResponse('https://sourceforge.net/tracker/?' - 'group_id=58965&atid=489447') + self.assertSnarfNotError('https://sourceforge.net/tracker/?' + 'func=detail&atid=105470&aid=827260&' + 'group_id=5470') + self.assertSnarfNoResponse('https://sourceforge.net/tracker/?' + 'group_id=58965&atid=489447') finally: conf.supybot.plugins.Sourceforge.trackerSnarfer.setValue( original) diff --git a/test/test_Topic.py b/test/test_Topic.py index 731f765e4..500b31758 100644 --- a/test/test_Topic.py +++ b/test/test_Topic.py @@ -87,7 +87,7 @@ class TopicTestCase(ChannelPluginTestCase, PluginDocumentation): m = self.getMsg('topic add bar') self.failUnless('<==>' in m.args[1]) finally: - default = conf.supybot.plugins.Topic.separator.default + default = conf.supybot.plugins.Topic.separator.default() conf.supybot.plugins.Topic.separator.setValue(default) def testReorder(self): diff --git a/test/test_URL.py b/test/test_URL.py index 83b5b6c31..cc86e14ad 100644 --- a/test/test_URL.py +++ b/test/test_URL.py @@ -51,19 +51,12 @@ http://www.sourcereview.net/forum/index.php? http://www.joelonsoftware.com/articles/BuildingCommunitieswithSo.html http://gameknot.com/stats.pl?ddipaolo http://slashdot.org/slashdot.rss -http://slashdot.org/slashdot.rss -http://gameknot.com/chess.pl?bd=1038943 -http://gameknot.com/chess.pl?bd=1038943 http://gameknot.com/chess.pl?bd=1038943 http://codecentral.sleepwalkers.org/ http://gameknot.com/chess.pl?bd=1037471&r=327 -http://gameknot.com/chess.pl?bd=1037471&r=327 -http://gameknot.com/chess.pl?bd=1037471&r=327 -http://gameknot.com/chess.pl?bd=1037471&r=327 http://dhcp065-024-059-168.columbus.rr.com:81/~jfincher/angryman.py https://sourceforge.net/projects/pyrelaychecker/ http://gameknot.com/tsignup.pl -http://lambda.weblogs.com/xml/rss.xml """.strip().splitlines() class URLTestCase(ChannelPluginTestCase, PluginDocumentation): @@ -81,12 +74,12 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): counter += 1 self.assertRegexp('url stats', str(counter)) self.assertRegexp('url last', re.escape(urls[-1])) - self.assertRegexp('url last --proto https', re.escape(urls[-3])) + self.assertRegexp('url last --proto https', re.escape(urls[-2])) self.assertRegexp('url last --with gameknot.com', - re.escape(urls[-2])) - self.assertRegexp('url last --with dhcp', re.escape(urls[-4])) + re.escape(urls[-1])) + self.assertRegexp('url last --with dhcp', re.escape(urls[-3])) self.assertRegexp('url last --from alsdkjf', '^No') - self.assertNotError('url random') + #self.assertNotError('url random') def testDefaultNotFancy(self): self.feedMsg(urls[0]) @@ -97,11 +90,11 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): self.assertNotRegexp('url last', '\\x01') def testNonSnarfingRegexpConfigurable(self): - self.assertNoResponse('http://foo.bar.baz/', 2) + self.assertSnarfNoResponse('http://foo.bar.baz/', 2) self.assertResponse('url last', 'http://foo.bar.baz/') try: - conf.supybot.plugins.URL.nonSnarfingRegexp.set('m/biff/i') - self.assertNoResponse('http://biff.bar.baz/', 2) + conf.supybot.plugins.URL.nonSnarfingRegexp.set('m/biff/') + self.assertSnarfNoResponse('http://biff.bar.baz/', 2) self.assertResponse('url last', 'http://foo.bar.baz/') finally: conf.supybot.plugins.URL.nonSnarfingRegexp.set('') @@ -125,10 +118,11 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): def testTinysnarf(self): try: conf.supybot.plugins.URL.tinyurlSnarfer.setValue(True) - self.assertRegexp('http://sourceforge.net/tracker/?' - 'func=add&group_id=58965&atid=489447', - r'http://tinyurl.com/rqac.* \(at') - self.assertRegexp( + self.assertSnarfRegexp( + 'http://sourceforge.net/tracker/?func=add&' + 'group_id=58965&atid=489447', + r'http://tinyurl.com/rqac.* \(at') + self.assertSnarfRegexp( 'http://www.urbandictionary.com/define.php?' 'term=all+your+base+are+belong+to+us', r'http://tinyurl.com/u479.* \(at') @@ -138,9 +132,9 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): def testTitleSnarfer(self): try: conf.supybot.plugins.URL.titleSnarfer.setValue(True) - self.assertResponse('http://microsoft.com/', - 'Title: Microsoft Corporation' - ' (at microsoft.com)') + self.assertSnarfResponse('http://microsoft.com/', + 'Title: Microsoft Corporation' + ' (at microsoft.com)') finally: conf.supybot.plugins.URL.titleSnarfer.setValue(False) @@ -152,16 +146,16 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): conf.supybot.plugins.URL.nonSnarfingRegexp.set('m/sf/') try: conf.supybot.plugins.URL.tinyurlSnarfer.setValue(True) - self.assertNoResponse('http://sf.net/', 2) - self.assertResponse('http://www.sourceforge.net/', - 'http://tinyurl.com/2cnkf') + self.assertSnarfNoResponse('http://sf.net/', 2) + self.assertSnarfResponse('http://www.sourceforge.net/', + 'http://tinyurl.com/2cnkf') finally: conf.supybot.plugins.URL.tinyurlSnarfer.setValue(tiny) try: conf.supybot.plugins.URL.titleSnarfer.setValue(True) - self.assertNoResponse('http://sf.net/', 2) - self.assertRegexp('http://www.sourceforge.net/', - r'Sourceforge\.net') + self.assertSnarfNoResponse('http://sf.net/', 2) + self.assertSnarfRegexp('http://www.sourceforge.net/', + r'Sourceforge\.net') finally: conf.supybot.plugins.URL.titleSnarfer.setValue(title) finally: diff --git a/test/test_User.py b/test/test_User.py index f6fd39d4a..2eaf2366d 100644 --- a/test/test_User.py +++ b/test/test_User.py @@ -86,13 +86,18 @@ class UserTestCase(PluginTestCase, PluginDocumentation): self.assertNotError('changename foo baz') def testSetpassword(self): - self.prefix = self.prefix1 - self.assertNotError('register foo bar') - self.assertEqual(ircdb.users.getUser(self.prefix).password, 'bar') - self.assertNotError('setpassword foo bar baz') - self.assertEqual(ircdb.users.getUser(self.prefix).password, 'baz') - self.assertNotError('setpassword --hashed foo baz biff') - self.assertNotEqual(ircdb.users.getUser(self.prefix).password, 'biff') + orig = conf.supybot.databases.users.hash() + try: + conf.supybot.databases.users.hash.setValue(False) + self.prefix = self.prefix1 + self.assertNotError('register foo bar') + self.assertEqual(ircdb.users.getUser(self.prefix).password, 'bar') + self.assertNotError('setpassword foo bar baz') + self.assertEqual(ircdb.users.getUser(self.prefix).password, 'baz') + self.assertNotError('setpassword --hashed foo baz biff') + self.assertNotEqual(ircdb.users.getUser(self.prefix).password, 'biff') + finally: + conf.supybot.databases.users.hash.setValue(orig) # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/test/test_Utilities.py b/test/test_Utilities.py index 6e9df5e23..ef6fee289 100644 --- a/test/test_Utilities.py +++ b/test/test_Utilities.py @@ -34,8 +34,8 @@ from testsupport import * class UtilitiesTestCase(PluginTestCase): plugins = ('Utilities', 'Status') def testIgnore(self): - self.assertNoResponse('ignore foo bar baz', 1) - self.assertError('ignore [re m/foo bar]') + self.assertNoResponse('utilities ignore foo bar baz', 1) + self.assertError('utilities ignore [re m/foo bar]') def testSuccess(self): self.assertNotError('success 1') diff --git a/test/test_Words.py b/test/test_Words.py index acc361ed6..606af8c90 100644 --- a/test/test_Words.py +++ b/test/test_Words.py @@ -33,29 +33,30 @@ from testsupport import * import supybot.utils as utils -try: - import sqlite -except ImportError: - sqlite = None +class WordsTestCase(ChannelPluginTestCase, PluginDocumentation): + plugins = ('Words',) + def setUp(self): + PluginTestCase.setUp(self) + # Add some words to for us to use + fd = file('%s/words' % conf.supybot.directories.data(), 'w') + fd.writelines(['hello']) + fd.close() -if sqlite is not None: - class WordsTestCase(ChannelPluginTestCase, PluginDocumentation): - plugins = ('Words',) - # Putting in a comment to make this different. - def testAddWord(self): - words = ('hello', 'world', 'mother', 'python') - for word in words: - self.assertNotError('add %s' % word) + # Putting in a comment to make this different. + #def testAddWord(self): + # words = ('hello', 'world', 'mother', 'python') + # for word in words: + # self.assertNotError('add %s' % word) - def testHangman(self): - self.assertNotError('add hello') - self.assertError('guess j') - self.assertError('letters') - self.assertNotError('hangman') - self.assertNotError('guess hello') - self.assertNotError('hangman') - self.assertNotError('guess j') - self.assertNotError('letters') + def testHangman(self): + #self.assertNotError('add hello') + self.assertError('guess j') + self.assertError('letters') + self.assertNotError('hangman') + self.assertNotError('guess hello') + self.assertNotError('hangman') + self.assertNotError('guess j') + self.assertNotError('letters') # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/test/test_callbacks.py b/test/test_callbacks.py index 24326908f..9f7a20549 100644 --- a/test/test_callbacks.py +++ b/test/test_callbacks.py @@ -229,7 +229,7 @@ class PrivmsgTestCase(ChannelPluginTestCase): conf.allowEval = True timeout = 2 def testEmptySquareBrackets(self): - self.assertResponse('echo []', '[]') + self.assertError('echo []') def testSimpleReply(self): self.assertResponse("eval irc.reply('foo')", 'foo') diff --git a/test/test_ircmsgs.py b/test/test_ircmsgs.py index 539674a5f..b297c5eb7 100644 --- a/test/test_ircmsgs.py +++ b/test/test_ircmsgs.py @@ -130,8 +130,8 @@ class FunctionsTestCase(SupyTestCase): self.failUnless(ircmsgs.isAction(msg)) def testIsCtcp(self): - self.failUnless(ircutils.isCtcp(ircmsgs.privmsg('foo', - '\x01VERSION\x01'))) + self.failUnless(ircmsgs.isCtcp(ircmsgs.privmsg('foo', + '\x01VERSION\x01'))) def testIsActionFalseWhenNoSpaces(self): msg = ircmsgs.IrcMsg('PRIVMSG #foo :\x01ACTIONfoobar\x01') diff --git a/test/testsupport.py b/test/testsupport.py index 9f4c27cc7..deaf6afe7 100644 --- a/test/testsupport.py +++ b/test/testsupport.py @@ -39,6 +39,7 @@ import re import sys import time started = time.time() +import shutil import unittest import supybot.log as log @@ -125,22 +126,19 @@ class PluginTestCase(SupyTestCase): # Set conf variables appropriately. conf.supybot.prefixChars.setValue('@') conf.supybot.reply.detailedErrors.setValue(True) - conf.supybot.reply.whenNotCommand.setValue(False) + conf.supybot.reply.whenNotCommand.setValue(True) self.myVerbose = world.myVerbose + def rmFiles(dir): + for filename in os.listdir(dir): + file = os.path.join(dir, filename) + if os.path.isfile(file): + os.remove(file) + else: + shutil.rmtree(file) if self.cleanConfDir: - confDir = conf.supybot.directories.conf() - for (dirpath, dirnames, filenames) in os.walk(confDir): - for filename in filenames: - filename = os.path.join(dirpath, filename) - if os.path.isfile(filename): - os.remove(filename) + rmFiles(conf.supybot.directories.conf()) if self.cleanDataDir: - dataDir = conf.supybot.directories.data() - for (dirpath, dirnames, filenames) in os.walk(dataDir): - for filename in filenames: - filename = os.path.join(dirpath, filename) - if os.path.isfile(filename): - os.remove(filename) + rmFiles(conf.supybot.directories.data()) ircdb.users.reload() ircdb.ignores.reload() ircdb.channels.reload() @@ -178,7 +176,8 @@ class PluginTestCase(SupyTestCase): ircdb.channels.close() gc.collect() - def _feedMsg(self, query, timeout=None, to=None, frm=None): + def _feedMsg(self, query, timeout=None, to=None, frm=None, + usePrefixChar=True): if to is None: to = self.irc.nick if frm is None: @@ -187,6 +186,8 @@ class PluginTestCase(SupyTestCase): timeout = self.timeout if self.myVerbose: print # Extra newline, so it's pretty. + if not usePrefixChar and query[0] in conf.supybot.prefixChars(): + query = query[1:] msg = ircmsgs.privmsg(to, query, prefix=frm) if self.myVerbose: print 'Feeding: %r' % msg @@ -225,6 +226,9 @@ class PluginTestCase(SupyTestCase): '%r did not error: %s' % (query, m.args[1])) return m + def assertSnarfError(self, query, **kwargs): + return self.assertError(query, usePrefixChar=False, **kwargs) + def assertNotError(self, query, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -235,6 +239,9 @@ class PluginTestCase(SupyTestCase): '%r returned the help string.' % query) return m + def assertSnarfNotError(self, query, **kwargs): + return self.assertNotError(query, usePrefixChar=False, **kwargs) + def assertHelp(self, query, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -248,6 +255,10 @@ class PluginTestCase(SupyTestCase): self.failIf(m, 'Unexpected response: %r' % m) return m + def assertSnarfNoResponse(self, query, timeout=0, **kwargs): + return self.assertNoResponse(query, timeout=timeout, + usePrefixChar=False, **kwargs) + def assertResponse(self, query, expectedResponse, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -256,6 +267,10 @@ class PluginTestCase(SupyTestCase): '%r != %r' % (expectedResponse, m.args[1])) return m + def assertSnarfResponse(self, query, expectedResponse, **kwargs): + return self.assertResponse(query, expectedResponse, + usePrefixChar=False, **kwargs) + def assertRegexp(self, query, regexp, flags=re.I, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -264,6 +279,10 @@ class PluginTestCase(SupyTestCase): '%r does not match %r' % (m.args[1], regexp)) return m + def assertSnarfRegexp(self, query, regexp, flags=re.I, **kwargs): + return self.assertRegexp(query, regexp, flags=re.I, + usePrefixChar=False, **kwargs) + def assertNotRegexp(self, query, regexp, flags=re.I, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -272,6 +291,10 @@ class PluginTestCase(SupyTestCase): '%r matched %r' % (m.args[1], regexp)) return m + def assertSnarfNotRegexp(self, query, regexp, flags=re.I, **kwargs): + return self.assertNotRegexp(query, regexp, flags=re.I, + usePrefixChar=False, **kwargs) + def assertAction(self, query, expectedResponse=None, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -281,6 +304,10 @@ class PluginTestCase(SupyTestCase): self.assertEqual(ircmsgs.unAction(m), expectedResponse) return m + def assertSnarfAction(self, query, expectedResponse=None, **kwargs): + return self.assertAction(query, expectedResponse=None, + usePrefixChar=False, **kwargs) + def assertActionRegexp(self, query, regexp, flags=re.I, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: @@ -290,6 +317,10 @@ class PluginTestCase(SupyTestCase): self.failUnless(re.search(regexp, s, flags), '%r does not match %r' % (s, regexp)) + def assertSnarfActionRegexp(self, query, regexp, flags=re.I, **kwargs): + return self.assertActionRegexp(query, regexp, flags=re.I, + usePrefixChar=False, **kwargs) + def testDocumentation(self): if self.__class__ in (PluginTestCase, ChannelPluginTestCase): return @@ -323,7 +354,8 @@ class ChannelPluginTestCase(PluginTestCase): self.failIf(m is None, 'No message back from joining channel.') self.assertEqual(m.command, 'WHO') - def _feedMsg(self, query, timeout=None, to=None, frm=None): + def _feedMsg(self, query, timeout=None, to=None, frm=None, + usePrefixChar=True): if to is None: to = self.channel if frm is None: @@ -332,7 +364,7 @@ class ChannelPluginTestCase(PluginTestCase): timeout = self.timeout if self.myVerbose: print # Newline, just like PluginTestCase. - if query[0] not in conf.supybot.prefixChars(): + if query[0] not in conf.supybot.prefixChars() and usePrefixChar: query = conf.supybot.prefixChars()[0] + query msg = ircmsgs.privmsg(to, query, prefix=frm) if self.myVerbose: @@ -376,8 +408,5 @@ class PluginDocumentation: pass # This is old stuff, it should be removed some day. - - - # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: