class SyncUserTestCase(unittest.TestCase): def setUp(self): self.user = SyncUser(["test", "Twitter"]) def tearDown(self): self.user = None def testSanitizesId(self): ids = [["blabla", "Twitter"], {"nick": "blabla", "protocol": "Twitter"}, "test_Twitter"] user = SyncUser(ids[0]) self.assertEquals(user.id["nick"], ids[0][0]) self.assertEquals(user.id["protocol"], ids[0][1]) user = SyncUser(ids[1]) self.assertEquals(user.id["nick"], ids[1]["nick"]) self.assertEquals(user.id["protocol"], ids[1]["protocol"]) user = SyncUser(ids[2]) self.assertEquals(user.id["nick"], "test") self.assertEquals(user.id["protocol"], "Twitter") def testRefusesWrongId(self): ids = [1, "lol", ["ha"], {"nick": "blabla"}, {"protocol": "Twitter"}, {"hehe": "haha", "hoho": "hihi"}] for id in ids: self.assertRaises(InvalidUserIdException, SyncUser, id) def testUserToHash(self): hash = "" + str(self.user) self.assertEquals(hash, "test_Twitter") def testAcceptsAndReturnsData(self): data = { "searches": ["bla", "lol", "hah"], "groups": ["meh", "moh"], "seen": [1, 2, 3, 4], "ranks": {"lol1": 0.3, "lol2": 0.1}, } fixture = self.user.data(data) for k in ["searches", "groups", "seen", "ranks"]: self.assertEquals(data[k], fixture[k].items) def testCanTakeSyncDataAsInput(self): data = SyncData( { "searches": ["bla", "lol", "hah"], "groups": ["meh", "moh"], "seen": [1, 2, 3, 4], "ranks": {"lol1": 0.3, "lol2": 0.1}, } ) self.user.data(data)
def testAcceptsData (self): user = SyncUser( ["test", "Twitter"] ) user.data({ "searches" : ["bla", "lol"], "groups" : ["hah", "heh"], "seen" : [1,2,3], "ranks" : {"lol1": 0.3, "lol2" : 0.1 } }) self.manager.write( user ) fixture = self.manager.read( str(user) ) for k in self.keys: self.assertEquals( fixture[k].items, user.data()[k].items )
def testSyncsUnknownUser (self): data = { "searches" : SyncDataEntry( ["bla"] ), "groups" : SyncDataEntry( ["hah", "heh", "hoho"] ), "seen" : SyncDataEntry( [1,2,3,5,6] ), "ranks" : SyncDataEntry( {"lol1": 0.6, "lol2" : 0.1 } ) } user = SyncUser( ["dontexist", "nope"] ) user.data( data ) self.manager.sync( user ) fixture = self.manager.read( user ) for k in self.keys: self.assertEquals( fixture[k].items, data[k].items )
def testCanReadWithSyncUserAsArgument (self): data = { "searches" : SyncDataEntry( ["bla"] ), "groups" : SyncDataEntry( ["hah", "heh", "hoho"] ), "seen" : SyncDataEntry( [1,2,3,5,6] ), "ranks" : SyncDataEntry( {"lol1": 0.6, "lol2" : 0.1 } ) } user = SyncUser( ["bla", "Twitter"] ) user.data( data ) self.manager.write( user ) fixture = self.manager.read( user ) for k in self.keys: self.assertEquals( fixture[k].items, user.data()[k].items )
def testSyncEqualData (self): data1 = { "searches" : SyncDataEntry( ["bla", "lol"] ), "groups" : SyncDataEntry( ["hah", "heh"] ), "seen" : SyncDataEntry( [1,2,3] ), "ranks" : SyncDataEntry( {"lol1": 0.3, "lol2" : 0.1 } ) } equalData = copy.deepcopy( data1 ) user = SyncUser( ["syncer", "Twitter"] ) user.data( data1 ) self.manager.write( user ) user.data( equalData ) changedData = self.manager.sync( user ) self.assert_( len( changedData ) == 0 )
def testStoresOnDeath (self): data = { "searches" : ["bla", "lol"], "groups" : ["hah", "heh"], "seen" : [1,2,3], "ranks" : {"lol1": 0.3, "lol2" : 0.1 } } user = SyncUser( ["testicles", "Twitter"] ) user.data(data) self.manager.write( user ) self.tearDown() self.setUp() fixture = self.manager.read( str(user) ) for k in self.keys: self.assertEquals( fixture[k].items, data[k] )
def testSyncChangesAreNewerAndStateIsStored (self): origTime = time.time() serverData = { "searches" : SyncDataEntry( ["bla", "lol"] ), "groups" : SyncDataEntry( ["hah", "heh"] ), "seen" : SyncDataEntry( [1,2,3] ), "ranks" : SyncDataEntry( {"lol1": 0.3, "lol2" : 0.1 } ) } userData = { "searches" : SyncDataEntry( ["bla"] ), "groups" : SyncDataEntry( ["hah", "heh", "hoho"] ), "seen" : SyncDataEntry( [1,2,3,5,6] ), "ranks" : SyncDataEntry( {"lol1": 0.6, "lol2" : 0.1 } ) } origUser = SyncUser( ["syncer", "Twitter"] ) origUser.data( serverData ) random.seed( time.time() ) # permute a random amount of changed entries over random timestamp differences for i in range(100): data = {} user = SyncUser( ["syncer", "Twitter"] ) expectedChange = {} usedKeys = [] for j in range(random.randint(0,4)): t = origTime+random.choice( [-1,1] ) k = random.choice( self.keys ) if k in usedKeys: continue usedKeys.append( k ) data[k] = userData[k] data[k].timestamp = t if t < origTime: expectedChange[k] = serverData[k] for k in self.keys: if k not in usedKeys: data[k] = serverData[k] self.manager.write( origUser ) user.data( data ) changes = self.manager.sync( user ) self.assertEquals( len(expectedChange), len(changes) ) for k in expectedChange.keys(): self.assertEquals( expectedChange[k].items, changes[k].items ) data[k] = changes[k] fixture = self.manager.read( user ) for k in self.keys: self.assertEquals( fixture[k].items, data[k].items )
def setUp(self): self.user = SyncUser(["test", "Twitter"])