def test_update(self): example_data.load() fighter_writer = ModelWriter(Fighter) # update unique attribute fighter = Fighter(Fighter.by_id(2)) fighter.name = 'Bobby' fighter.age = 41 fighter_writer.update_all(fighter) self.assertEqual(ds.hgetall('u:Fighter:name'), {'Alice': '1', 'Bobby': '2'}) fighter2 = Fighter(Fighter.by_id(2)) self.assertEqual(fighter2.name, 'Bobby') self.assertEqual(fighter2.age, 41) fighter_writer.update(fighter2, name = 'Robert', weight = 99.9) self.assertEqual(ds.hgetall('u:Fighter:name'), {'Alice': '1', 'Robert': '2'}) self.assertEqual(fighter2.name, 'Robert') self.assertEqual(fighter2.weight, 99.9) fighter3 = Fighter(Fighter.by_id(2)) self.assertEqual(fighter3.name, 'Robert') self.assertEqual(fighter3.weight, 99.9) # update indexed attribute self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1', '2'])) self.assertEqual(ds.smembers('i:Fighter:city:2'), set()) fighter1 = Fighter(Fighter.by_id(1)) fighter2 = Fighter(Fighter.by_id(2)) fighter2.city = City.by_id(2) fighter_writer.update_all(fighter2) self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1'])) self.assertEqual(ds.smembers('i:Fighter:city:2'), set(['2'])) fighter_writer.update(fighter1, city = City.by_id(2)) self.assertEqual(ds.smembers('i:Fighter:city:1'), set()) self.assertEqual(ds.smembers('i:Fighter:city:2'), set(['1', '2'])) city1 = City(City.by_id(1)) fighter_writer.update(fighter1, city = city1) self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1'])) self.assertEqual(ds.smembers('i:Fighter:city:2'), set(['2'])) # update zindexed attribute self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2', '1']) fighter_writer.update(fighter1, weight = 99.91) self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2', '1']) fighter_writer.update(fighter1, weight = 99.89) self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['1', '2']) # update listed attribute self.assertEqual(ds.lrange('l:Gang:hqcity:1', 0, -1), []) self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['1', '2']) gang2 = Gang(Gang.by_id(2)) gang_writer = ModelWriter(Gang) gang_writer.update(gang2, hqcity = city1) self.assertEqual(ds.lrange('l:Gang:hqcity:1', 0, -1), ['2']) self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['1']) # update object and sorted set atomically self.assertEqual(ds.zrange('Fighter:1:weapons', 0, -1), ['2', '1', '3']) self.assertEqual(ds.hgetall('Weapon:2'), {'description': 'third', 'power': '34.2'}) weapon_writer = ModelWriter(Weapon) fighter_weapons_writer = SortedSetFieldWriter(Fighter.weapons, weapon_writer) w2 = Weapon(Weapon.by_id(2)) fighter_weapons_writer.update(fighter1.weapons, w2, power = 70, description = 'improved') self.assertEqual(ds.zrange('Fighter:1:weapons', 0, -1), ['1', '3', '2']) self.assertEqual(ds.hgetall('Weapon:2'), {'description': 'improved', 'power': '70'}) self.assertEqual(w2.power, 70) self.assertEqual(w2.description, 'improved') w2.power -= 60 w2.description = 'degraded' fighter_weapons_writer.update_all(fighter1.weapons, w2) self.assertEqual(ds.zrange('Fighter:1:weapons', 0, -1), ['2', '1', '3']) self.assertEqual(ds.hgetall('Weapon:2'), {'description': 'degraded', 'power': '10'})