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
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)

View File

@ -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)