def test_delete(self): example_data.load() # delete object updates indexes fighter_writer = ModelWriter(Fighter) self.assertEqual(ds.hgetall('u:Fighter:name'), {'Alice': '1', 'Bob': '2'}) self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1', '2'])) self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2', '1']) fighter1 = Fighter(Fighter.by_id(1)) fighter_writer.delete(fighter1) self.assertRaises(NotFoundError, Fighter, Fighter.by_id(1)) self.assertTrue(fighter1.oid is None) self.assertEqual(ds.hgetall('u:Fighter:name'), {'Bob': '2'}) self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['2'])) self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2']) # delete container item updates indexes gang_members_writer = SetFieldWriter(Gang.members) self.assertEqual(ds.smembers('Gang:1:members'), set(['1', '2'])) self.assertEqual(ds.hgetall('u:Gang:members'), {'1': '1', '2': '1'}) gang1 = Gang(Gang.by_id(1)) gang_members_writer.remove(gang1.members, Fighter.by_id(1)) self.assertEqual(ds.smembers('Gang:1:members'), set(['2'])) self.assertEqual(ds.hgetall('u:Gang:members'), {'2': '1'}) gang_cities_writer = SetFieldWriter(Gang.cities) self.assertEqual(ds.smembers('Gang:1:cities'), set(['1', '3'])) self.assertEqual(ds.smembers('i:Gang:cities:1'), set(['1'])) self.assertEqual(ds.smembers('i:Gang:cities:3'), set(['1'])) gang1 = Gang(Gang.by_id(1)) gang_cities_writer.remove(gang1.cities, City.by_id(1)) self.assertEqual(ds.smembers('Gang:1:cities'), set(['3'])) self.assertFalse(ds.exists('i:Gang:cities:1')) self.assertEqual(ds.smembers('i:Gang:cities:3'), set(['1'])) # delete object updates lists of listed attributes self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['1', '2']) gang_writer = ModelWriter(Gang) gang_writer.delete(gang1) self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['2']) # autodelete owned item fighter_skill_list_writer = ModelWriter(FighterSkillList) skill_instance_writer = ModelWriter(SkillInstance) fighter_skills_writer = ListFieldWriter(FighterSkillList.skills, element_writer = skill_instance_writer) self.assertEqual(ds.lrange('FighterSkillList:1:skills', 0, -1), ['1', '2']) self.assertEqual(ds.lrange('FighterSkillList:2:skills', 0, -1), ['3', '4']) for i in range(1, 5): self.assertTrue(ds.exists('SkillInstance:{0}'.format(i))) handle = FighterSkillList.by_owner(Fighter.by_id(2)) fsl = FighterSkillList(handle) ski = SkillInstance(SkillInstance.by_id(3)) fighter_skills_writer.remove(fsl.skills, ski) self.assertTrue(ski.oid is None) self.assertEqual(ds.lrange('FighterSkillList:2:skills', 0, -1), ['4']) self.assertFalse(ds.exists('SkillInstance:3')) self.assertTrue(ds.exists('SkillInstance:4')) # don't allow removing not owned object ski = SkillInstance(SkillInstance.by_id(1)) self.assertRaises(NotFoundError, fighter_skills_writer.remove, fsl.skills, ski) self.assertTrue(ds.exists('SkillInstance:1'))