Move version checks to a separate function, add test

This commit is contained in:
flan 2017-11-01 16:41:41 +01:00
parent 8195e58e3b
commit 2dc1f28b04
2 changed files with 42 additions and 25 deletions

View File

@ -52,6 +52,18 @@ class SyncCollectionHandler(Syncer):
# So that 'server' (the 3rd argument) can't get set # So that 'server' (the 3rd argument) can't get set
Syncer.__init__(self, col) 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): def meta(self):
# Make sure the media database is open! # Make sure the media database is open!
if self.col.media.db is None: if self.col.media.db is None:
@ -498,15 +510,11 @@ class SyncApp(object):
del data['v'] del data['v']
if data.has_key('cv'): if data.has_key('cv'):
session.client_version = data['cv'] session.client_version = data['cv']
client, version, platform = data['cv'].split(',')
del data['cv'] del data['cv']
version_int = [ int(str(x).translate(None, string.ascii_letters)) if self.session.collection_handler._old_client(session.client_version):
for x in version.split('.') ]
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 return Response(status="501") # client needs upgrade
self.session_manager.save(hkey, session) self.session_manager.save(hkey, session)
session = self.session_manager.load(hkey, self.create_session) session = self.session_manager.load(hkey, self.create_session)

View File

@ -21,26 +21,35 @@ class SyncCollectionHandlerTest(CollectionTestBase):
CollectionTestBase.tearDown(self) CollectionTestBase.tearDown(self)
self.syncCollectionHandler = None self.syncCollectionHandler = None
def test_meta(self): def test_old_client(self):
version_info = (None, old = (
','.join(('ankidesktop', '2.0.12', 'lin::')), ','.join(('ankidesktop', '2.0.12', 'lin::')),
','.join(('ankidesktop', '2.0.32', 'lin::'))) ','.join(('ankidesktop', '2.0.26', 'lin::')),
','.join(('ankidroid', '2.1', '')),
','.join(('ankidroid', '2.2', '')),
#','.join(('ankidroid', '2.2.2', '')),
#','.join(('ankidroid', '2.3alpha3', '')),
)
meta = self.syncCollectionHandler.meta(version_info[0]) current = (
self.assertEqual(meta[0], self.collection.mod) None,
self.assertEqual(meta[1], self.collection.scm) ','.join(('ankidesktop', '2.0.27', 'lin::')),
self.assertEqual(meta[2], self.collection._usn) ','.join(('ankidesktop', '2.0.32', 'lin::')),
self.assertTrue((type(meta[3]) == int) and meta[3] > 0) ','.join(('ankidesktop', '2.1.0', 'lin::')),
self.assertEqual(meta[4], self.collection.media.usn()) ','.join(('ankidroid', '2.2.3', '')),
','.join(('ankidroid', '2.3alpha4', '')),
','.join(('ankidroid', '2.9', '')),
)
meta = self.syncCollectionHandler.meta(version_info[1]) # FIXME: unittest is too dumb to print the failing version
self.assertEqual(meta[0], self.collection.mod) for cv in old:
self.assertEqual(meta[1], self.collection.scm) self.assertTrue(self.syncCollectionHandler._old_client(cv))
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]) for cv in current:
self.assertFalse(self.syncCollectionHandler._old_client(cv))
def test_meta(self):
meta = self.syncCollectionHandler.meta()
self.assertEqual(meta['scm'], self.collection.scm) self.assertEqual(meta['scm'], self.collection.scm)
self.assertTrue((type(meta['ts']) == int) and meta['ts'] > 0) self.assertTrue((type(meta['ts']) == int) and meta['ts'] > 0)
self.assertEqual(meta['mod'], self.collection.mod) self.assertEqual(meta['mod'], self.collection.mod)