mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-26 20:59:27 +01:00
Almost out entire testsuite works, yet again. Yay!
This commit is contained in:
parent
b6ba7955ac
commit
d47d54bc82
@ -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+)[^:]+:<br>(\d+)[^,]+, (\d+)[^,]+, (\d+)")
|
||||
_gkGameTitle = re.compile(r"<p><b>(.*?)\s*</b> \s*<span.*?>\(started")
|
||||
_gkGameTitle = re.compile(r"<td[^<]+><p><b>(.*?)\s*</b> ")
|
||||
_gkWon = re.compile(r'>(\S+)\s+won')
|
||||
_gkReason = re.compile(r'won\s+\(\S+\s+(\S+)\)')
|
||||
def gameknotSnarfer(self, irc, msg, match):
|
||||
|
@ -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('<reply>'):
|
||||
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('<action>'):
|
||||
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+(?<!\\)(was|is|am|were|are)\s+(also\s+)?(.+?)[?!. ]*$"
|
||||
@ -345,10 +364,18 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp):
|
||||
value = '%s or %s' % (self.db.getIs(key), value)
|
||||
elif self.force:
|
||||
self.log.info('Forcing %r to %r.', key, value)
|
||||
elif self.badForce:
|
||||
value = self.db.getIs(key)
|
||||
self.reply('... but %s is %s, %s ...' % (key, value,
|
||||
msg.nick))
|
||||
return
|
||||
elif self.addressed:
|
||||
value = self.db.getIs(key)
|
||||
self.reply('But %s is %s, %s.' % (key, value, msg.nick))
|
||||
return
|
||||
else:
|
||||
self.log.info('Already have a %r key.', key)
|
||||
return
|
||||
self.db.setIs(key, value)
|
||||
else:
|
||||
if self.db.hasAre(key):
|
||||
@ -357,10 +384,18 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp):
|
||||
value = '%s or %s' % (self.db.getAre(key), value)
|
||||
elif self.force:
|
||||
self.log.info('Forcing %r to %r.', key, value)
|
||||
elif self.badForce:
|
||||
value = self.db.getAre(key)
|
||||
self.reply('... but %s are %s, %s ...' % (key, value,
|
||||
msg.nick))
|
||||
return
|
||||
elif self.addressed:
|
||||
value = self.db.getAre(key)
|
||||
self.reply('But %s are %s, %s.' % (key, value, msg.nick))
|
||||
return
|
||||
else:
|
||||
self.log.info('Already have a %r key.', key)
|
||||
return
|
||||
self.db.setAre(key, value)
|
||||
if self.addressed or self.force or also:
|
||||
self.confirm()
|
||||
|
@ -118,7 +118,7 @@ class Karma(callbacks.PrivmsgCommandAndRegexp, plugins.ChannelDBHandler):
|
||||
FROM karma
|
||||
WHERE normalized=%s""", normalized)
|
||||
if cursor.rowcount == 0:
|
||||
irc.reply('%s has no karma.' % name)
|
||||
irc.reply('%s has neutral karma.' % name)
|
||||
else:
|
||||
(added, subtracted) = imap(int, cursor.fetchone())
|
||||
total = added - subtracted
|
||||
|
@ -45,7 +45,6 @@ import sets
|
||||
import time
|
||||
import shutil
|
||||
import getopt
|
||||
import urllib2
|
||||
import urlparse
|
||||
import itertools
|
||||
|
||||
@ -166,15 +165,13 @@ class URLDB(object):
|
||||
out.close()
|
||||
self.log.info('Vacuumed %s, removed %s records.',
|
||||
self.filename, notAdded)
|
||||
|
||||
|
||||
|
||||
class URL(callbacks.PrivmsgCommandAndRegexp):
|
||||
regexps = ['tinyurlSnarfer', 'titleSnarfer']
|
||||
_titleRe = re.compile('<title>(.*?)</title>', 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'<blockquote><b>(http://tinyurl\.com/\w+)</b>')
|
||||
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)
|
||||
|
@ -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')
|
||||
|
@ -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')
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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"')
|
||||
|
@ -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')
|
||||
|
@ -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:
|
||||
|
@ -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')
|
||||
|
@ -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')
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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(),
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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))
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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')
|
||||
|
@ -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:
|
||||
|
@ -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')
|
||||
|
@ -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')
|
||||
|
@ -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:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user