From 2dc1f28b0487c1ee3847aed0eb1ac2c57afcd514 Mon Sep 17 00:00:00 2001 From: flan Date: Wed, 1 Nov 2017 16:41:41 +0100 Subject: [PATCH] Move version checks to a separate function, add test --- ankisyncd/sync_app.py | 20 ++++++++++++------ tests/test_sync_app.py | 47 +++++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/ankisyncd/sync_app.py b/ankisyncd/sync_app.py index 2fd93e9..f5a33b7 100644 --- a/ankisyncd/sync_app.py +++ b/ankisyncd/sync_app.py @@ -52,6 +52,18 @@ class SyncCollectionHandler(Syncer): # So that 'server' (the 3rd argument) can't get set Syncer.__init__(self, col) + @staticmethod + def _old_client(cv): + if not cv: + return False + + client, version, platform = cv.split(',') + version_int = [ int(str(x).translate(None, string.ascii_letters)) + for x in version.split('.') ] + + return (client == 'ankidroid' and version_int < [2, 3, 0]) \ + or (client == 'ankidesktop' and version_int < [2, 0, 27]) + def meta(self): # Make sure the media database is open! if self.col.media.db is None: @@ -498,15 +510,11 @@ class SyncApp(object): del data['v'] if data.has_key('cv'): session.client_version = data['cv'] - client, version, platform = data['cv'].split(',') del data['cv'] - version_int = [ int(str(x).translate(None, string.ascii_letters)) - for x in version.split('.') ] + if self.session.collection_handler._old_client(session.client_version): + return Response(status="501") # client needs upgrade - if (client == 'ankidroid' and version_int < [2, 3, 0]) \ - or (client == 'ankidesktop' and version_int < [2, 0, 27]): - return Response(status="501") # client needs upgrade self.session_manager.save(hkey, session) session = self.session_manager.load(hkey, self.create_session) diff --git a/tests/test_sync_app.py b/tests/test_sync_app.py index b5a85d5..6641505 100644 --- a/tests/test_sync_app.py +++ b/tests/test_sync_app.py @@ -21,26 +21,35 @@ class SyncCollectionHandlerTest(CollectionTestBase): CollectionTestBase.tearDown(self) self.syncCollectionHandler = None + def test_old_client(self): + old = ( + ','.join(('ankidesktop', '2.0.12', 'lin::')), + ','.join(('ankidesktop', '2.0.26', 'lin::')), + ','.join(('ankidroid', '2.1', '')), + ','.join(('ankidroid', '2.2', '')), + #','.join(('ankidroid', '2.2.2', '')), + #','.join(('ankidroid', '2.3alpha3', '')), + ) + + current = ( + None, + ','.join(('ankidesktop', '2.0.27', 'lin::')), + ','.join(('ankidesktop', '2.0.32', 'lin::')), + ','.join(('ankidesktop', '2.1.0', 'lin::')), + ','.join(('ankidroid', '2.2.3', '')), + ','.join(('ankidroid', '2.3alpha4', '')), + ','.join(('ankidroid', '2.9', '')), + ) + + # FIXME: unittest is too dumb to print the failing version + for cv in old: + self.assertTrue(self.syncCollectionHandler._old_client(cv)) + + for cv in current: + self.assertFalse(self.syncCollectionHandler._old_client(cv)) + def test_meta(self): - version_info = (None, - ','.join(('ankidesktop', '2.0.12', 'lin::')), - ','.join(('ankidesktop', '2.0.32', 'lin::'))) - - meta = self.syncCollectionHandler.meta(version_info[0]) - self.assertEqual(meta[0], self.collection.mod) - self.assertEqual(meta[1], self.collection.scm) - self.assertEqual(meta[2], self.collection._usn) - self.assertTrue((type(meta[3]) == int) and meta[3] > 0) - self.assertEqual(meta[4], self.collection.media.usn()) - - meta = self.syncCollectionHandler.meta(version_info[1]) - self.assertEqual(meta[0], self.collection.mod) - self.assertEqual(meta[1], self.collection.scm) - self.assertEqual(meta[2], self.collection._usn) - self.assertTrue((type(meta[3]) == int) and meta[3] > 0) - self.assertEqual(meta[4], self.collection.media.usn()) - - meta = self.syncCollectionHandler.meta(version_info[2]) + meta = self.syncCollectionHandler.meta() self.assertEqual(meta['scm'], self.collection.scm) self.assertTrue((type(meta['ts']) == int) and meta['ts'] > 0) self.assertEqual(meta['mod'], self.collection.mod)