From 7a96672f0ed8efaa4e60e1b94f19dd9afb3bf517 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 26 Dec 2009 03:46:54 +0100 Subject: [PATCH] Return 'ACK Not implemented' instead of 'OK' for unimplemented commands --- mopidy/handler.py | 100 +++++++++++++-------------- mopidy/session.py | 7 +- tests/handlertest.py | 158 +++++++++++++++++++++---------------------- 3 files changed, 130 insertions(+), 135 deletions(-) diff --git a/mopidy/handler.py b/mopidy/handler.py index a96d7b89..5b985dd0 100644 --- a/mopidy/handler.py +++ b/mopidy/handler.py @@ -42,7 +42,10 @@ class MpdHandler(object): matches = re.match(pattern, request) if matches is not None: groups = matches.groupdict() - result = _request_handlers[pattern](self, **groups) + try: + result = _request_handlers[pattern](self, **groups) + except MpdAckError, e: + return self.handle_response(u'ACK %s' % e, add_ok=False) if self.command_list is not False: return None else: @@ -70,20 +73,19 @@ class MpdHandler(object): @register(r'^add "(?P[^"]*)"$') def _add(self, uri): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^addid "(?P[^"]*)"( (?P\d+))*$') def _add(self, uri, songpos=None): - # TODO - return {'id': 0} + raise MpdNotImplemented # TODO @register(r'^clear$') def _clear(self): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^clearerror$') def _clearerror(self): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^close$') def _close(self): @@ -116,18 +118,18 @@ class MpdHandler(object): def _consume(self, state): state = int(state) if state: - pass # TODO + raise MpdNotImplemented # TODO else: - pass # TODO + raise MpdNotImplemented # TODO @register(r'^count (?P\S+) (?P\S+)$') def _count(self, tag, needle): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^crossfade "(?P\d+)"$') def _crossfade(self, seconds): seconds = int(seconds) - pass # TODO + raise MpdNotImplemented # TODO @register(r'^currentsong$') def _currentsong(self): @@ -135,11 +137,11 @@ class MpdHandler(object): @register(r'^delete ((?P\d+)|(?P\d+):(?P\d+)*)$') def _delete(self, songpos=None, start=None, end=None): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^deleteid (?P.*)$') def _deleteid(self, songid): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^$') def _empty(self): @@ -147,17 +149,17 @@ class MpdHandler(object): @register(r'^find (?P(album|artist|title)) (?P.*)$') def _find(self, type, what): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^findadd (?P(album|artist|title)) (?P.*)$') def _findadd(self, type, what): result = self._find(type, what) # TODO Add result to current playlist - return result + #return result @register(r'^idle( (?P.+))*$') def _idle(self, subsystems=None): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^kill$') def _kill(self): @@ -166,23 +168,23 @@ class MpdHandler(object): @register(r'^list (?Partist)$') @register(r'^list (?Palbum)( (?P.*))*$') def _list(self, type, artist=None): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^listall "(?P[^"]+)"') def _listall(self, uri): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^listallinfo "(?P[^"]+)"') def _listallinfo(self, uri): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^listplaylist (?P.+)$') def _listplaylist(self, name): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^listplaylistinfo (?P.+)$') def _listplaylistinfo(self, name): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^listplaylists$') def _listplaylists(self): @@ -196,15 +198,15 @@ class MpdHandler(object): def _lsinfo(self, uri): if uri == u'/' or uri is None: return self._listplaylists() - pass # TODO + raise MpdNotImplemented # TODO @register(r'^move ((?P\d+)|(?P\d+):(?P\d+)*) (?P\d+)$') def _move(self, songpos=None, start=None, end=None, to=None): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^moveid (?P\S+) (?P\d+)$') def _moveid(self, songid, to): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^next$') def _next(self): @@ -212,7 +214,7 @@ class MpdHandler(object): @register(r'^password "(?P[^"]+)"$') def _password(self, password): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^pause "(?P[01])"$') def _pause(self, state): @@ -239,19 +241,19 @@ class MpdHandler(object): @register(r'^playlistadd (?P\S+) "(?P[^"]+)"$') def _playlistadd(self, name, uri): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^playlistclear (?P\S+)$') def _playlistclear(self, name): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^playlistdelete (?P\S+) (?P\d+)$') def _playlistdelete(self, name, songpos): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^playlistfind (?P\S+) (?P\S+)$') def _playlistfind(self, tag, needle): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^playlistid( "(?P\S+)")*$') def _playlistid(self, songid=None): @@ -263,11 +265,11 @@ class MpdHandler(object): @register(r'^playlistmove (?P\S+) (?P\S+) (?P\d+)$') def _playlistdelete(self, name, songid, songpos): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^playlistsearch (?P\S+) (?P\S+)$') def _playlistsearch(self, tag, needle): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^plchanges "(?P\d+)"$') def _plchanges(self, version): @@ -275,7 +277,7 @@ class MpdHandler(object): @register(r'^plchangesposid (?P\d+)$') def _plchangesposid(self, version): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^previous$') def _previous(self): @@ -283,27 +285,27 @@ class MpdHandler(object): @register(r'^rename (?P\S+) (?P\S+)$') def _rename(self, old_name, new_name): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^random "(?P[01])"$') def _random(self, state): state = int(state) if state: - pass # TODO + raise MpdNotImplemented # TODO else: - pass # TODO + raise MpdNotImplemented # TODO @register(r'^repeat "(?P[01])"$') def _repeat(self, state): state = int(state) if state: - pass # TODO + raise MpdNotImplemented # TODO else: - pass # TODO + raise MpdNotImplemented # TODO @register(r'^replay_gain_mode (?P(off|track|album))$') def _replay_gain_mode(self, mode): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^replay_gain_status$') def _replay_gain_status(self): @@ -315,23 +317,23 @@ class MpdHandler(object): @register(r'^rm (?P\S+)$') def _rm(self, name): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^save (?P\S+)$') def _save(self, name): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^search "(?P(album|artist|filename|title))" "(?P.+)"$') def _search(self, type, what): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^seek (?P.+) (?P\d+)$') def _seek(self, songpos, seconds): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^seekid (?P.+) (?P\d+)$') def _seekid(self, songid, seconds): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^setvol "(?P-*\d+)"$') def _setvol(self, volume): @@ -340,23 +342,23 @@ class MpdHandler(object): volume = 0 if volume > 100: volume = 100 - pass # TODO + raise MpdNotImplemented # TODO @register(r'^shuffle( (?P\d+):(?P\d+)*)*$') def _shuffle(self, start=None, end=None): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^single "(?P[01])"$') def _single(self, state): state = int(state) if state: - pass # TODO + raise MpdNotImplemented # TODO else: - pass # TODO + raise MpdNotImplemented # TODO @register(r'^stats$') def _stats(self): - # TODO + pass # TODO return { 'artists': 0, 'albums': 0, @@ -389,11 +391,11 @@ class MpdHandler(object): @register(r'^swap (?P\d+) (?P\d+)$') def _swap(self, songpos1, songpos2): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^swapid (?P\S+) (?P\S+)$') def _swapid(self, songid1, songid2): - pass # TODO + raise MpdNotImplemented # TODO @register(r'^update( "(?P[^"]+)")*$') def _update(self, uri=None, rescan_unmodified_files=False): diff --git a/mopidy/session.py b/mopidy/session.py index 6de5bbe2..e588b9fd 100644 --- a/mopidy/session.py +++ b/mopidy/session.py @@ -37,11 +37,8 @@ class MpdSession(asynchat.async_chat): self.handle_request(input) def handle_request(self, input): - try: - response = self.handler.handle_request(input) - self.handle_response(response) - except MpdAckError, e: - self.send_response(u'ACK %s' % e) + response = self.handler.handle_request(input) + self.handle_response(response) def handle_response(self, response): for line in response: diff --git a/tests/handlertest.py b/tests/handlertest.py index 54dcb097..79b8a079 100644 --- a/tests/handlertest.py +++ b/tests/handlertest.py @@ -77,7 +77,7 @@ class StatusHandlerTest(unittest.TestCase): def test_clearerror(self): result = self.h.handle_request(u'clearerror') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_currentsong(self): result = self.h.handle_request(u'currentsong') @@ -85,11 +85,11 @@ class StatusHandlerTest(unittest.TestCase): def test_idle_without_subsystems(self): result = self.h.handle_request(u'idle') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_idle_with_subsystems(self): result = self.h.handle_request(u'idle database playlist') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_stats_command(self): result = self.h.handle_request(u'stats') @@ -144,71 +144,71 @@ class PlaybackOptionsHandlerTest(unittest.TestCase): def test_consume_off(self): result = self.h.handle_request(u'consume "0"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_consume_on(self): result = self.h.handle_request(u'consume "1"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_crossfade(self): result = self.h.handle_request(u'crossfade "10"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_random_off(self): result = self.h.handle_request(u'random "0"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_random_on(self): result = self.h.handle_request(u'random "1"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_repeat_off(self): result = self.h.handle_request(u'repeat "0"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_repeat_on(self): result = self.h.handle_request(u'repeat "1"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_setvol_below_min(self): result = self.h.handle_request(u'setvol "-10"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_setvol_min(self): result = self.h.handle_request(u'setvol "0"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_setvol_middle(self): result = self.h.handle_request(u'setvol "50"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_setvol_max(self): result = self.h.handle_request(u'setvol "100"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_setvol_above_max(self): result = self.h.handle_request(u'setvol "110"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_single_off(self): result = self.h.handle_request(u'single "0"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_single_on(self): result = self.h.handle_request(u'single "1"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_replay_gain_mode_off(self): result = self.h.handle_request(u'replay_gain_mode off') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_replay_gain_mode_track(self): result = self.h.handle_request(u'replay_gain_mode track') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_replay_gain_mode_album(self): result = self.h.handle_request(u'replay_gain_mode album') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_replay_gain_status_default(self): expected = u'off' @@ -216,24 +216,26 @@ class PlaybackOptionsHandlerTest(unittest.TestCase): self.assert_(u'OK' in result) self.assert_(expected in result) - def test_replay_gain_status_off(self): - expected = u'off' - self.h._replay_gain_mode(expected) - result = self.h.handle_request(u'replay_gain_status') - self.assert_(u'OK' in result) - self.assert_(expected in result) + #def test_replay_gain_status_off(self): + # expected = u'off' + # self.h._replay_gain_mode(expected) + # result = self.h.handle_request(u'replay_gain_status') + # self.assert_(u'OK' in result) + # self.assert_(expected in result) #def test_replay_gain_status_track(self): # expected = u'track' # self.h._replay_gain_mode(expected) # result = self.h.handle_request(u'replay_gain_status') - # self.assertEquals(expected, result) + # self.assert_(u'OK' in result) + # self.assert_(expected in result) #def test_replay_gain_status_album(self): # expected = u'album' # self.h._replay_gain_mode(expected) # result = self.h.handle_request(u'replay_gain_status') - # self.assertEquals(expected, result) + # self.assert_(u'OK' in result) + # self.assert_(expected in result) class PlaybackControlHandlerTest(unittest.TestCase): @@ -271,11 +273,11 @@ class PlaybackControlHandlerTest(unittest.TestCase): def test_seek(self): result = self.h.handle_request(u'seek 0 30') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_seekid(self): result = self.h.handle_request(u'seekid 0 30') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_stop(self): result = self.h.handle_request(u'stop') @@ -289,57 +291,51 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_add(self): result = self.h.handle_request(u'add "file:///dev/urandom"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_addid_without_songpos(self): result = self.h.handle_request(u'addid "file:///dev/urandom"') - self.assert_(u'OK' in result) - result = result[0] - self.assert_(u'id' in result) - - self.assert_(u'id' in result) + self.assert_(u'ACK Not implemented' in result) def test_addid_with_songpos(self): result = self.h.handle_request(u'addid "file:///dev/urandom" 0') - self.assert_(u'OK' in result) - result = result[0] - self.assert_(u'id' in result) + self.assert_(u'ACK Not implemented' in result) def test_clear(self): result = self.h.handle_request(u'clear') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_delete_songpos(self): result = self.h.handle_request(u'delete 5') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_delete_open_range(self): result = self.h.handle_request(u'delete 10:') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_delete_closed_range(self): result = self.h.handle_request(u'delete 10:20') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_deleteid(self): result = self.h.handle_request(u'deleteid 0') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_move_songpos(self): result = self.h.handle_request(u'move 5 0') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_move_open_range(self): result = self.h.handle_request(u'move 10: 0') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_move_closed_range(self): result = self.h.handle_request(u'move 10:20 0') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_moveid(self): result = self.h.handle_request(u'moveid 0 10') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_playlist_returns_same_as_playlistinfo(self): playlist_result = self.h.handle_request(u'playlist') @@ -348,7 +344,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_playlistfind(self): result = self.h.handle_request(u'playlistfind tag needle') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_playlistid_without_songid(self): result = self.h.handle_request(u'playlistid') @@ -376,7 +372,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_playlistsearch(self): result = self.h.handle_request(u'playlistsearch tag needle') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_plchanges(self): result = self.h.handle_request(u'plchanges "0"') @@ -384,27 +380,27 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): def test_plchangesposid(self): result = self.h.handle_request(u'plchangesposid 0') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_shuffle_without_range(self): result = self.h.handle_request(u'shuffle') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_shuffle_with_open_range(self): result = self.h.handle_request(u'shuffle 10:') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_shuffle_with_closed_range(self): result = self.h.handle_request(u'shuffle 10:20') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_swap(self): result = self.h.handle_request(u'swap 10 20') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_swapid(self): result = self.h.handle_request(u'swapid 10 20') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) class StoredPlaylistsHandlerTest(unittest.TestCase): @@ -413,11 +409,11 @@ class StoredPlaylistsHandlerTest(unittest.TestCase): def test_listplaylist(self): result = self.h.handle_request(u'listplaylist name') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_listplaylistinfo(self): result = self.h.handle_request(u'listplaylistinfo name') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_listplaylists(self): result = self.h.handle_request(u'listplaylists') @@ -430,31 +426,31 @@ class StoredPlaylistsHandlerTest(unittest.TestCase): def test_playlistadd(self): result = self.h.handle_request( u'playlistadd name "file:///dev/urandom"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_playlistclear(self): result = self.h.handle_request(u'playlistclear name') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_playlistdelete(self): result = self.h.handle_request(u'playlistdelete name 5') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_playlistmove(self): result = self.h.handle_request(u'playlistmove name 5a 10') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_rename(self): result = self.h.handle_request(u'rename name new_name') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_rm(self): result = self.h.handle_request(u'rm name') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_save(self): result = self.h.handle_request(u'save name') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) class MusicDatabaseHandlerTest(unittest.TestCase): @@ -463,19 +459,19 @@ class MusicDatabaseHandlerTest(unittest.TestCase): def test_count(self): result = self.h.handle_request(u'count tag needle') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_find_album(self): result = self.h.handle_request(u'find album what') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_find_artist(self): result = self.h.handle_request(u'find artist what') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_find_title(self): result = self.h.handle_request(u'find title what') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_find_else_should_fail(self): try: @@ -486,11 +482,11 @@ class MusicDatabaseHandlerTest(unittest.TestCase): def test_findadd(self): result = self.h.handle_request(u'findadd album what') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_list_artist(self): result = self.h.handle_request(u'list artist') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_list_artist_with_artist_should_fail(self): try: @@ -501,19 +497,19 @@ class MusicDatabaseHandlerTest(unittest.TestCase): def test_list_album_without_artist(self): result = self.h.handle_request(u'list album') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_list_album_with_artist(self): result = self.h.handle_request(u'list album anartist') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_listall(self): result = self.h.handle_request(u'listall "file:///dev/urandom"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_listallinfo(self): result = self.h.handle_request(u'listallinfo "file:///dev/urandom"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_lsinfo_without_path_returns_same_as_listplaylists(self): lsinfo_result = self.h.handle_request(u'lsinfo') @@ -522,7 +518,7 @@ class MusicDatabaseHandlerTest(unittest.TestCase): def test_lsinfo_with_path(self): result = self.h.handle_request(u'lsinfo ""') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_lsinfo_for_root_returns_same_as_listplaylists(self): lsinfo_result = self.h.handle_request(u'lsinfo "/"') @@ -531,19 +527,19 @@ class MusicDatabaseHandlerTest(unittest.TestCase): def test_search_album(self): result = self.h.handle_request(u'search "album" "analbum"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_search_artist(self): result = self.h.handle_request(u'search "artist" "anartist"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_search_filename(self): result = self.h.handle_request(u'search "filename" "afilename"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_search_title(self): result = self.h.handle_request(u'search "title" "atitle"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_search_else_should_fail(self): try: @@ -607,7 +603,7 @@ class ConnectionHandlerTest(unittest.TestCase): def test_password(self): result = self.h.handle_request(u'password "secret"') - self.assert_(u'OK' in result) + self.assert_(u'ACK Not implemented' in result) def test_ping(self): result = self.h.handle_request(u'ping')