From 19a9804dee4dd01fdedaaa946213840138a0dcb0 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Tue, 26 Aug 2003 18:10:17 +0000 Subject: [PATCH] Added a test and fixed several bugs it found. --- plugins/Quotes.py | 34 +++++++++++++++-------- test/test_Quotes.py | 68 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 test/test_Quotes.py diff --git a/plugins/Quotes.py b/plugins/Quotes.py index 887d27d79..7574ce8d2 100644 --- a/plugins/Quotes.py +++ b/plugins/Quotes.py @@ -100,7 +100,7 @@ class Quotes(ChannelDBHandler, callbacks.Privmsg): channel = privmsgs.getChannel(msg, args) db = self.getDb(channel) cursor = db.cursor() - cursor.execute("""SELECT max(id) FROM quotes""") + cursor.execute("""SELECT COUNT(*) FROM quotes""") maxid = int(cursor.fetchone()[0]) if maxid is None: maxid = 0 @@ -142,22 +142,29 @@ class Quotes(ChannelDBHandler, callbacks.Privmsg): formats.append(argument) elif option == 'regexp': try: - r = re.compile(argument, re.I) - except re.error, e: - irc.error(msg, str(e)) - return + r = utils.perlReToPythonRe(argument) + except ValueError: + try: + r = re.compile(argument, re.I) + except re.error, e: + irc.error(msg, str(e)) + return def p(s): - return bool(r.match(s)) + return int(bool(r.search(s))) predicateName += 'p' db.create_function(predicateName, 1, p) criteria.append('%s(quote)' % predicateName) for s in rest: - s = '%%%s%%' % s - criteria.append('quote LIKE %s') - formats.append(s) + try: + i = int(s) + criteria.append('id=%s' % i) + except ValueError: + s = '%%%s%%' % s + criteria.append('quote LIKE %s') + formats.append(s) sql = """SELECT id, quote FROM quotes WHERE %s""" % ' AND '.join(criteria) - debug.printf(sql) + #debug.printf(sql) cursor = db.cursor() cursor.execute(sql, *formats) if cursor.rowcount == 0: @@ -214,7 +221,7 @@ class Quotes(ChannelDBHandler, callbacks.Privmsg): irc.reply(msg, 'Quote %r added by %s at %s.' % \ (quote, added_by, timestamp)) else: - irc.reply(msg, 'There isn\'t a quote with that id.') + irc.error(msg, 'There isn\'t a quote with that id.') def removequote(self, irc, msg, args): """[] @@ -229,7 +236,10 @@ class Quotes(ChannelDBHandler, callbacks.Privmsg): capability = ircdb.makeChannelCapability(channel, 'op') if ircdb.checkCapability(msg.prefix, capability): cursor.execute("""DELETE FROM quotes WHERE id=%s""", id) - irc.reply(msg, conf.replySuccess) + if cursor.rowcount == 0: + irc.error(msg, 'There was no such quote.') + else: + irc.reply(msg, conf.replySuccess) else: irc.error(msg, conf.replyNoCapability % capability) diff --git a/test/test_Quotes.py b/test/test_Quotes.py new file mode 100644 index 000000000..845e95d5a --- /dev/null +++ b/test/test_Quotes.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2002, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +from test import * + +class QuotesTestCase(PluginTestCase): + plugins = ('Quotes',) + def test(self): + self.assertRegexp('numquotes #foo', '0') + self.assertNotError('addquote #foo foo') + self.assertRegexp('numquotes #foo', '1') + self.assertResponse('quote #foo --id 1', '#1: foo') + self.assertResponse('quote #foo 1', '#1: foo') + self.assertNotError('addquote #foo bar') + self.assertResponse('quote #foo 2', '#2: bar') + self.assertResponse('quote #foo --id 2', '#2: bar') + self.assertNotError('addquote #foo baz') + self.assertRegexp('numquotes #foo', '3') + self.assertResponse('quote #foo 3', '#3: baz') + self.assertRegexp('quote #foo --regexp m/ba/', 'bar.*baz') + self.assertRegexp('quote #foo --regexp ba', 'bar.*baz') + self.assertNotError('quoteinfo #foo 1') + self.assertNotError('randomquote #foo') + self.assertError('removequote #foo 4') + self.assertError('quoteinfo #foo 4') + self.assertNotError('removequote #foo 3') + self.assertRegexp('numquotes #foo', '2') + self.assertNotError('removequote #foo 1') + self.assertError('quoteinfo #foo 3') + self.assertError('quoteinfo #foo 1') + self.assertRegexp('randomquote #foo', '#2') + self.assertError('removequote #foo 3') + self.assertNotError('removequote #foo 2') + self.assertRegexp('numquotes #foo', '0') + self.assertError('randomquote #foo') + + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: +