home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / test / storedatabasetest.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  17.5 KB  |  507 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from datetime import datetime
  5. import os
  6. import tempfile
  7. import unittest
  8. import database
  9. import databaseupgrade
  10. import item
  11. import feed
  12. import schema
  13. import shutil
  14. import storedatabase
  15. from test.framework import DemocracyTestCase
  16. from schema import SchemaString, SchemaInt, SchemaFloat, SchemaSimpleContainer
  17. from schema import SchemaList, SchemaDict, SchemaObject
  18.  
  19. class Human:
  20.     
  21.     def __init__(self, name, age, meters_tall, friends, high_scores = None):
  22.         self.name = name
  23.         self.age = age
  24.         self.meters_tall = meters_tall
  25.         self.friends = friends
  26.         if high_scores is None:
  27.             self.high_scores = { }
  28.         else:
  29.             self.high_scores = high_scores
  30.  
  31.  
  32.  
  33. class RestorableHuman(Human):
  34.     
  35.     def onRestore(self):
  36.         self.iveBeenRestored = True
  37.  
  38.  
  39.  
  40. class Dog:
  41.     
  42.     def __init__(self, name, age, owner = None):
  43.         self.name = name
  44.         self.age = age
  45.         self.owner = owner
  46.  
  47.  
  48.  
  49. class House:
  50.     
  51.     def __init__(self, address, color, occupants, stuff = None):
  52.         self.address = address
  53.         self.color = color
  54.         self.occupants = occupants
  55.         self.stuff = stuff
  56.  
  57.  
  58.  
  59. class PCFProgramer(Human):
  60.     
  61.     def __init__(self, name, age, meters_tall, friends, position, superpower, high_scores = None):
  62.         Human.__init__(self, name, age, meters_tall, friends, high_scores)
  63.         self.position = position
  64.         self.superpower = superpower
  65.  
  66.  
  67.  
  68. class HumanSchema(schema.ObjectSchema):
  69.     klass = Human
  70.     classString = 'human'
  71.     fields = [
  72.         ('name', SchemaString()),
  73.         ('age', SchemaInt()),
  74.         ('meters_tall', SchemaFloat()),
  75.         ('friends', SchemaList(SchemaObject(Human))),
  76.         ('high_scores', SchemaDict(SchemaString(), SchemaInt()))]
  77.  
  78.  
  79. class RestorableHumanSchema(HumanSchema):
  80.     klass = RestorableHuman
  81.     classString = 'restorable-human'
  82.  
  83.  
  84. class DogSchema(schema.ObjectSchema):
  85.     klass = Dog
  86.     classString = 'dog'
  87.     fields = [
  88.         ('name', SchemaString()),
  89.         ('age', SchemaInt()),
  90.         ('owner', SchemaObject(Human, noneOk = True))]
  91.  
  92.  
  93. class HouseSchema(schema.ObjectSchema):
  94.     klass = House
  95.     classString = 'house'
  96.     fields = [
  97.         ('address', SchemaString()),
  98.         ('color', SchemaString()),
  99.         ('occupants', SchemaList(SchemaObject(Human))),
  100.         ('stuff', SchemaSimpleContainer(noneOk = True))]
  101.  
  102.  
  103. class PCFProgramerSchema(HumanSchema):
  104.     klass = PCFProgramer
  105.     classString = 'pcf-programmer'
  106.     fields = HumanSchema.fields + [
  107.         ('position', SchemaString()),
  108.         ('superpower', SchemaString())]
  109.  
  110. testObjectSchemas = [
  111.     HumanSchema,
  112.     DogSchema,
  113.     HouseSchema,
  114.     PCFProgramerSchema,
  115.     RestorableHumanSchema]
  116.  
  117. class SchemaTest(DemocracyTestCase):
  118.     
  119.     def setUp(self):
  120.         DemocracyTestCase.setUp(self)
  121.         storedatabase.skipUpgrade = True
  122.         self.lee = Human(u'lee', 25, 1.4, [], {
  123.             u'virtual bowling': 212 })
  124.         self.joe = Human(u'joe', 14, 1.4, [
  125.             self.lee])
  126.         self.forbesSt = House(u'45 Forbs St', u'Blue', [
  127.             self.lee,
  128.             self.joe], {
  129.             'view': u'pretty',
  130.             'next-party': datetime(2005, 4, 5) })
  131.         self.scruffy = Dog(u'Scruffy', 3, self.lee)
  132.         self.spike = Dog(u'Spike', 4, owner = None)
  133.         self.db = [
  134.             self.lee,
  135.             self.joe,
  136.             self.forbesSt,
  137.             self.scruffy,
  138.             self.spike]
  139.         self.savePath = tempfile.mktemp()
  140.  
  141.     
  142.     def tearDown(self):
  143.         storedatabase.skipUpgrade = False
  144.         
  145.         try:
  146.             os.unlink(self.savePath)
  147.         except OSError:
  148.             pass
  149.  
  150.         DemocracyTestCase.tearDown(self)
  151.  
  152.     
  153.     def addSubclassObjects(self):
  154.         self.ben = PCFProgramer(u'ben', 25, 3.4, [], u'programmer', u'Teleportation')
  155.         self.holmes = PCFProgramer(u'ben', 25, 3.4, [], u'co-director', u'Mind Control')
  156.         self.forbesSt.occupants.extend([
  157.             self.ben,
  158.             self.holmes])
  159.         self.db.extend([
  160.             self.ben,
  161.             self.holmes])
  162.  
  163.  
  164.  
  165. class TestValidation(SchemaTest):
  166.     
  167.     def assertDbValid(self):
  168.         storedatabase.objectsToSavables(self.db, testObjectSchemas)
  169.  
  170.     
  171.     def assertDbInvalid(self):
  172.         self.assertRaises(schema.ValidationError, storedatabase.objectsToSavables, self.db, testObjectSchemas)
  173.  
  174.     
  175.     def tesntValidDb(self):
  176.         self.assertDbValid()
  177.  
  178.     
  179.     def testNoneValues(self):
  180.         self.lee.age = None
  181.         self.assertDbInvalid()
  182.         self.lee.age = 25
  183.         self.scruffy.owner = None
  184.         self.assertDbValid()
  185.  
  186.     
  187.     def testIntValidation(self):
  188.         self.lee.age = '25'
  189.         self.assertDbInvalid()
  190.         self.lee.age = 0x19L
  191.         self.assertDbValid()
  192.  
  193.     
  194.     def testStringValidation(self):
  195.         self.lee.name = 133
  196.         self.assertDbInvalid()
  197.         self.lee.name = u'lee'
  198.         self.assertDbValid()
  199.  
  200.     
  201.     def testFloatValidation(self):
  202.         self.lee.meters_tall = 3
  203.         self.assertDbInvalid()
  204.  
  205.     
  206.     def testListValidation(self):
  207.         self.lee.friends = [
  208.             u'joe']
  209.         self.assertDbInvalid()
  210.  
  211.     
  212.     def testDictValidation(self):
  213.         self.joe.high_scores['pong'] = u'One Million'
  214.         self.assertDbInvalid()
  215.         del self.joe.high_scores['pong']
  216.         self.joe.high_scores[1943] = 1234123
  217.         self.assertDbInvalid()
  218.  
  219.     
  220.     def testSubclassValidation(self):
  221.         self.addSubclassObjects()
  222.         self.assertDbValid()
  223.         
  224.         class HumanSubclassWithoutObjectSchema(Human):
  225.             pass
  226.  
  227.         jimmy = HumanSubclassWithoutObjectSchema(u'Luc', 23, 3.4, [])
  228.         self.joe.friends.append(jimmy)
  229.         self.assertDbInvalid()
  230.  
  231.  
  232.  
  233. class TestSave(SchemaTest):
  234.     
  235.     def testSimpleCircularReference(self):
  236.         self.lee.friends = [
  237.             self.joe]
  238.  
  239.     
  240.     def testSaveToDisk(self):
  241.         storedatabase.saveObjectList(self.db, self.savePath, testObjectSchemas)
  242.  
  243.     
  244.     def testExtraObjectsAreIgnored(self):
  245.         
  246.         class EpherialObject:
  247.             pass
  248.  
  249.         self.db.append(EpherialObject())
  250.         storedatabase.objectsToSavables(self.db, testObjectSchemas)
  251.  
  252.  
  253.  
  254. class TestRestore(SchemaTest):
  255.     
  256.     def testSaveThenRestore(self):
  257.         storedatabase.saveObjectList(self.db, self.savePath, testObjectSchemas)
  258.         db2 = storedatabase.restoreObjectList(self.savePath, testObjectSchemas)
  259.         (lee2, joe2, forbesSt2, scruffy2, spike2) = db2
  260.         for attr in ('name', 'age', 'meters_tall', 'high_scores'):
  261.             self.assertEquals(getattr(self.lee, attr), getattr(lee2, attr))
  262.             self.assertEquals(getattr(self.joe, attr), getattr(joe2, attr))
  263.         
  264.         self.assertEquals(joe2.friends, [
  265.             lee2])
  266.         self.assertEquals(forbesSt2.address, u'45 Forbs St')
  267.         self.assertEquals(forbesSt2.color, u'Blue')
  268.         self.assertEquals(forbesSt2.occupants, [
  269.             lee2,
  270.             joe2])
  271.         self.assertEquals(forbesSt2.stuff, {
  272.             'view': u'pretty',
  273.             'next-party': datetime(2005, 4, 5) })
  274.         self.assertEquals(scruffy2.name, u'Scruffy')
  275.         self.assertEquals(scruffy2.age, 3)
  276.         self.assertEquals(spike2.name, u'Spike')
  277.         self.assertEquals(spike2.age, 4)
  278.         self.assertEquals(scruffy2.owner, lee2)
  279.         self.assertEquals(spike2.owner, None)
  280.  
  281.     
  282.     def testRestoreSubclasses(self):
  283.         self.addSubclassObjects()
  284.         storedatabase.saveObjectList(self.db, self.savePath, testObjectSchemas)
  285.         db2 = storedatabase.restoreObjectList(self.savePath, testObjectSchemas)
  286.         (lee2, joe2, forbesSt2, scruffy2, spike2, ben2, holmes2) = db2
  287.         for attr in ('name', 'age', 'meters_tall', 'high_scores', 'position', 'superpower'):
  288.             self.assertEquals(getattr(self.ben, attr), getattr(ben2, attr))
  289.             self.assertEquals(getattr(self.holmes, attr), getattr(holmes2, attr))
  290.         
  291.         self.assertEquals(forbesSt2.occupants, [
  292.             lee2,
  293.             joe2,
  294.             ben2,
  295.             holmes2])
  296.  
  297.     
  298.     def testOnRestoreCalled(self):
  299.         resto = RestorableHuman(u'resto', 23, 1.3, [])
  300.         self.db.append(resto)
  301.         storedatabase.saveObjectList(self.db, self.savePath, testObjectSchemas)
  302.         db2 = storedatabase.restoreObjectList(self.savePath, testObjectSchemas)
  303.         (lee2, joe2, forbesSt2, scruffy2, spike2, resto2) = db2
  304.         self.assertEquals(resto2.name, u'resto')
  305.         self.assert_(hasattr(resto2, 'iveBeenRestored'))
  306.         self.assertEquals(resto2.iveBeenRestored, True)
  307.  
  308.  
  309.  
  310. class UpgradeTest(SchemaTest):
  311.     
  312.     def setUp(self):
  313.         super(UpgradeTest, self).setUp()
  314.         self.realSchemaVersion = schema.VERSION
  315.         
  316.         try:
  317.             self.realUpgrade2 = databaseupgrade.upgrade2
  318.         except AttributeError:
  319.             self.realUpgrade2 = None
  320.  
  321.         
  322.         try:
  323.             self.realUpgrade3 = databaseupgrade.upgrade3
  324.         except AttributeError:
  325.             self.realUpgrade3 = None
  326.  
  327.         schema.VERSION = 1
  328.         storedatabase.saveObjectList(self.db, self.savePath, testObjectSchemas)
  329.         schema.VERSION = 3
  330.         
  331.         def upgrade2(objects):
  332.             for o in objects:
  333.                 if o.classString == 'human':
  334.                     o.savedData['name'] = 'Sir %s' % o.savedData['name']
  335.                     continue
  336.             
  337.  
  338.         
  339.         def upgrade3(objects):
  340.             for o in objects:
  341.                 if o.classString == 'dog':
  342.                     o.savedData['color'] = u'Unknown'
  343.                     continue
  344.             
  345.  
  346.         databaseupgrade.upgrade2 = upgrade2
  347.         databaseupgrade.upgrade3 = upgrade3
  348.         storedatabase.skipUpgrade = False
  349.         
  350.         class DogSchema2(schema.ObjectSchema):
  351.             klass = Dog
  352.             classString = 'dog'
  353.             fields = [
  354.                 ('name', SchemaString()),
  355.                 ('age', SchemaInt()),
  356.                 ('owner', SchemaObject(Human, noneOk = True)),
  357.                 ('color', SchemaString())]
  358.  
  359.         self.nextGenObjectSchemas = [
  360.             HumanSchema,
  361.             DogSchema2,
  362.             HouseSchema,
  363.             PCFProgramerSchema,
  364.             RestorableHumanSchema]
  365.  
  366.     
  367.     def tearDown(self):
  368.         if self.realUpgrade3 is not None:
  369.             databaseupgrade.upgrade3 = self.realUpgrade3
  370.         else:
  371.             del databaseupgrade.upgrade3
  372.         if self.realUpgrade2 is not None:
  373.             databaseupgrade.upgrade2 = self.realUpgrade2
  374.         else:
  375.             del databaseupgrade.upgrade2
  376.         schema.VERSION = self.realSchemaVersion
  377.         super(UpgradeTest, self).tearDown()
  378.  
  379.     
  380.     def testChanges(self):
  381.         newDb = storedatabase.restoreObjectList(self.savePath, self.nextGenObjectSchemas)
  382.         for object in newDb:
  383.             if isinstance(object, Human):
  384.                 self.assert_(object.name.startswith('Sir '))
  385.                 continue
  386.             if isinstance(object, Dog):
  387.                 self.assert_('color' in object.__dict__)
  388.                 continue
  389.         
  390.  
  391.     
  392.     def testRestoreWithNewerVersion(self):
  393.         newDb = storedatabase.restoreObjectList(self.savePath, self.nextGenObjectSchemas)
  394.         storedatabase.saveObjectList(newDb, self.savePath, testObjectSchemas)
  395.         schema.VERSION = 1
  396.         self.assertRaises(databaseupgrade.DatabaseTooNewError, storedatabase.restoreObjectList, self.savePath, testObjectSchemas)
  397.  
  398.     
  399.     def testSavingUpgradedDb(self):
  400.         newDb = storedatabase.restoreObjectList(self.savePath, self.nextGenObjectSchemas)
  401.         storedatabase.saveObjectList(newDb, self.savePath, self.nextGenObjectSchemas)
  402.         newDb = storedatabase.restoreObjectList(self.savePath, self.nextGenObjectSchemas)
  403.  
  404.  
  405.  
  406. class LiveStorageTest(DemocracyTestCase):
  407.     
  408.     def setUp(self):
  409.         DemocracyTestCase.setUp(self)
  410.         storedatabase.skipUpgrade = True
  411.         self.savePath = os.path.join(tempfile.gettempdir(), 'democracy-temp-db')
  412.         self.database = database.defaultDatabase
  413.         self.database.liveStorage = storedatabase.LiveStorage(self.savePath, restore = False)
  414.  
  415.     
  416.     def tearDown(self):
  417.         storedatabase.skipUpgrade = False
  418.         
  419.         try:
  420.             self.database.liveStorage.close()
  421.             self.database.liveStorage = None
  422.         except:
  423.             pass
  424.  
  425.         
  426.         try:
  427.             shutil.rmtree(self.savePath)
  428.         except:
  429.             pass
  430.  
  431.         DemocracyTestCase.tearDown(self)
  432.  
  433.  
  434.  
  435. class TestConstraintChecking(LiveStorageTest):
  436.     
  437.     def testConstraintCheck(self):
  438.         self.assertRaises(database.DatabaseConstraintError, item.Item, 123123123, { })
  439.  
  440.     
  441.     def testConstraintCheck2(self):
  442.         f = feed.Feed(u'http://feed.uk')
  443.         i = item.Item({ }, feed_id = f.id)
  444.         i.feed_id = 123456789
  445.         self.assertRaises(database.DatabaseConstraintError, i.signalChange)
  446.  
  447.     
  448.     def testUpdateAfterRemove(self):
  449.         obj = database.DDBObject()
  450.         obj.remove()
  451.         self.assertRaises(database.DatabaseConstraintError, obj.signalChange)
  452.  
  453.  
  454.  
  455. class TestHighLevelFunctions(LiveStorageTest):
  456.     
  457.     def setUp(self):
  458.         LiveStorageTest.setUp(self)
  459.         self.f = feed.Feed(u'http://feed.uk')
  460.         i = item.Item({ }, feed_id = self.f.id)
  461.         i2 = item.Item({ }, feed_id = self.f.id)
  462.         self.objects = [
  463.             self.f,
  464.             i,
  465.             i2]
  466.  
  467.     
  468.     def checkDatabaseIsTheSame(self):
  469.         self.assertEquals(len(self.objects), len(self.database.objects))
  470.         i = 0
  471.         for newObject, copy in self.database.objects:
  472.             self.assertEquals(type(newObject), type(self.objects[i]))
  473.             self.assertEquals(newObject.id, self.objects[i].id)
  474.             i += 1
  475.         
  476.  
  477.     
  478.     def saveDatabase(self):
  479.         self.database.liveStorage.saveDatabase()
  480.  
  481.     
  482.     def restoreDatabase(self):
  483.         database.resetDefaultDatabase()
  484.         self.database.liveStorage = storedatabase.LiveStorage(self.savePath, restore = True)
  485.  
  486.     
  487.     def testSaveThenRestore(self):
  488.         self.saveDatabase()
  489.         self.restoreDatabase()
  490.         self.checkDatabaseIsTheSame()
  491.  
  492.     
  493.     def testUpdateThenRestore(self):
  494.         i3 = item.Item({ }, feed_id = self.f.id)
  495.         self.saveDatabase()
  496.         i3.remove()
  497.         i3 = item.Item({ }, feed_id = self.f.id)
  498.         self.objects.append(i3)
  499.         self.database.liveStorage.runUpdate()
  500.         self.restoreDatabase()
  501.         self.checkDatabaseIsTheSame()
  502.  
  503.  
  504. if __name__ == '__main__':
  505.     unittest.main()
  506.  
  507.