RelayNext: add tests for the database commands & fix the bugs they've helped me discover!

More specifically, test 'set', 'add', 'remove', 'clear', and 'list'. These are some relatively
complex functions that deal with: case-insensitive duplicate checking, requiring at least 2
channels per relay (auto-remove when a relay is below this threshold), adding/removing things
from existing relays, and more... Sometimes manual testing can't catch all of these complex
situations!

This fixes a bug where you could add duplicate channels using the 'add' command if the same
channel was given with differing cases (e.g. 'relaynext add new-relay channel1@net CHANNEl1@Net').

Also, add a notice when trying to remove a channel that doesn't exist in a relay.
This commit is contained in:
James Lu 2015-02-05 21:33:28 -08:00
parent 065ac41975
commit ca3fbc919b
2 changed files with 82 additions and 2 deletions

View File

@ -420,9 +420,9 @@ class RelayNext(callbacks.Plugin):
# returning a list IF there are more than one items. Otherwise,
# the object is returned alone.
if type(relays) == list:
relays = list(map(str.lower, relays))
relays = set(map(str.lower, relays))
else:
relays = [relays.lower()]
relays = set(relays.lower())
self.checkRelays(irc, relays)
if rid not in self.db.keys() and len(relays) < 2:
irc.error("Not enough channels to relay between (need at least "
@ -452,10 +452,19 @@ class RelayNext(callbacks.Plugin):
return
relays = list(map(str.lower, relays))
self.checkRelays(irc, relays)
missing = []
for relay in relays:
if relay not in current_relays:
missing.append(relay)
current_relays.discard(relay)
if len(current_relays) < 2:
del self.db[rid]
if missing:
s = format("However, the following channels were not removed "
"because they were not found in the original relay: %L",
missing)
irc.replySuccess(s)
return
irc.replySuccess()
remove = wrap(remove, ['admin', 'somethingWithoutSpaces',
any('somethingWithoutSpaces')])

View File

@ -33,4 +33,75 @@ from supybot.test import *
class RelayNextTestCase(PluginTestCase):
plugins = ('RelayNext',)
def testAdd(self):
self.assertNotError("relaynext add test #channel1@somenet #channel2@othernet")
self.assertRegexp("relaynext list", "#channel1@somenet")
self.assertRegexp("relaynext list", "#channel2@othernet")
# Incorrect amount of arguments
self.assertError("relaynext add test")
self.assertError("relaynext add test afdasfader agkajeoig #validchannel@othernet")
self.assertError("relaynext add nonexistant-relay #channel1@somenet")
def testSet(self):
self.assertNotError("relaynext set test #channel1@somenet #channel2@othernet")
self.assertRegexp("relaynext list", "#channel1@somenet")
self.assertRegexp("relaynext list", "#channel2@othernet")
self.assertError("relaynext set test")
self.assertError("relaynext set test #channel1@somenet")
def testList(self):
# This should error if no relays are defined
self.assertError("relaynext list")
self.assertNotError("relaynext set abcd #moo@moo #test@test")
self.assertRegexp("relaynext list", "#moo@moo")
self.assertRegexp("relaynext list", "#test@test")
def testSetCaseInsensitive(self):
self.assertError("relaynext set derp #dev@overdrive-irc #DEV@OVERdrive-IRC")
self.assertNotError("relaynext set abcd #moo@moo #MOO@mOO #test@test")
self.assertRegexp("relaynext list", "#moo@moo")
self.assertRegexp("relaynext list", "#test@test")
def testAddCaseInsensitive(self):
self.assertError("relaynext add derp #dev@overdrive-irc #DEV@OVERdrive-IRC")
self.assertNotError("relaynext add abcd #moo@moo #MOO@mOO #test@test")
self.assertRegexp("relaynext list", "#moo@moo")
self.assertRegexp("relaynext list", "#test@test")
def testRemoveEntireRelay(self):
self.assertError("relaynext remove some-relay")
self.assertNotError("relaynext add some-relay #channel1@somenet #channel2@othernet #abcd@test123")
# 'remove' without arguments removes an entire relay
self.assertNotError("relaynext remove some-relay")
# No relays should be defined now.
self.assertError("relaynext list")
def testRemoveChannelsFromExistingRelay(self):
self.assertNotError("relaynext add some-relay #channel1@somenet #channel2@othernet #abcd@test123")
# This should give a warning (removing a channel that's not in the specified relay)
self.assertRegexp("relaynext remove some-relay #asfdafaergea@random",
'not found in the original relay: '
'#asfdafaergea@random')
self.assertNotError("relaynext remove some-relay #abcd@test123")
self.assertRegexp("relaynext list", "#channel1@somenet")
self.assertRegexp("relaynext list", "#channel2@othernet")
self.assertNotRegexp("relaynext list", "#abcd@test123")
def testAutoremoveWhenLessThanTwoChannels(self):
self.assertNotError("relaynext add some-relay #channel1@somenet #channel2@othernet #abcd@test123")
self.assertNotError("relaynext remove some-relay #abcd@test123 #channel2@othernet")
self.assertError("relaynext list")
def testAddChannelsToExistingRelay(self):
self.assertNotError("relaynext add test #channel1@somenet #channel2@othernet")
self.assertNotError("relaynext add test #somewhereElse@mynet")
self.assertRegexp("relaynext list", "#channel1@somenet")
self.assertRegexp("relaynext list", "#channel2@otherne")
self.assertRegexp("relaynext list", "#somewhereelse@mynet")
def testClear(self):
self.assertNotError("relaynext set test #channel1@somenet #channel2@othernet")
self.assertNotError("relaynext clear")
self.assertError("relaynext list")
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: