Source code for sqlobject.versioning.test.test_version
from sqlobject import ForeignKey, IntCol, SQLObject, StringCol
from sqlobject.inheritance import InheritableSQLObject
from sqlobject.versioning import Versioning
from sqlobject.tests.dbtest import setupClass
[docs]class MyClass(SQLObject):
name = StringCol()
versions = Versioning()
[docs]class Base(InheritableSQLObject):
name = StringCol()
so_value = IntCol(default=0)
versions = Versioning()
[docs]class Child(Base):
toy = StringCol()
[docs]class Government(InheritableSQLObject):
name = StringCol()
[docs]class Monarchy(Government):
monarch = StringCol()
versions = Versioning()
[docs]class VChild(Base):
weapon = StringCol()
versions = Versioning()
[docs]class HasForeign(SQLObject):
foreign = ForeignKey("Base")
versions = Versioning()
def _set_extra():
return "read all about it"
[docs]class HasAltId(SQLObject):
name = StringCol()
altid = IntCol(alternateID=True)
versions = Versioning()
[docs]def setup():
classes = [MyClass, Base, Child, Government,
Monarchy, VChild, Extra, HasAltId]
if hasattr(HasForeign, "_connection"):
classes.insert(0, HasForeign)
else:
classes.append(HasForeign)
for cls in classes:
if hasattr(cls, 'versions') and getattr(cls, "_connection", None) and \
cls._connection.tableExists(cls.sqlmeta.table):
setupClass(cls.versions.versionClass)
setupClass(cls)
if hasattr(cls, 'versions'):
setupClass(cls.versions.versionClass)
for version in cls.versions.versionClass.select():
version.destroySelf()
[docs]def test_versioning():
# the simple case
setup()
mc = MyClass(name='fleem')
mc.set(name='morx')
assert len(list(mc.versions)) == 1
assert mc.versions[0].name == "fleem"
assert len(list(MyClass.select())) == 1
[docs]def test_inheritable_versioning():
setup()
# base versioned, child unversioned
base = Base(name='fleem')
base.set(name='morx')
assert len(list(base.versions)) == 1
assert base.versions[0].name == "fleem"
assert len(list(Base.select())) == 1
child = Child(name='child', toy='nintendo')
child.set(name='teenager', toy='guitar')
assert len(list(child.versions)) == 0
# child versioned, base unversioned
government = Government(name='canada')
assert not hasattr(government, 'versions')
monarchy = Monarchy(name='UK', monarch='king george iv')
assert len(list(monarchy.versions)) == 0
monarchy.set(name='queen elisabeth ii')
assert len(list(monarchy.versions)) == 1
assert monarchy.versions[0].name == "UK"
assert len(list(Monarchy.select())) == 1
# both parent and child versioned
num_base_versions = len(list(base.versions))
vchild = VChild(name='kid', weapon='slingshot')
vchild.set(name='toon', weapon='dynamite')
assert len(list(base.versions)) == num_base_versions
assert len(list(vchild.versions)) == 1
# test setting using setattr directly rather than .set
vchild.name = "newname"
assert len(list(vchild.versions)) == 2
[docs]def test_restore():
setup()
base = Base(name='fleem')
base.set(name='morx')
assert base.name == "morx"
base.versions[0].restore()
assert base.name == "fleem"
monarchy = Monarchy(name='USA', monarch='Emperor Norton I')
monarchy.set(name='morx')
assert monarchy.name == "morx"
monarchy.versions[0].restore()
assert monarchy.name == "USA"
assert monarchy.monarch == "Emperor Norton I"
extra = Extra(name='fleem')
extra.set(name='morx')
assert extra.name == "morx"
extra.versions[0].restore()
assert extra.name == "fleem"
[docs]def test_next():
setup()
base = Base(name='first', so_value=1)
base.set(name='second')
base.set(name='third', so_value=2)
version = base.versions[0]
assert version.nextVersion() == base.versions[1]
assert version.nextVersion().nextVersion() == base
[docs]def test_get_changed():
setup()
base = Base(name='first', so_value=1)
base.set(name='second')
base.set(name='third', so_value=2)
assert base.versions[0].getChangedFields() == ['Name']
assert sorted(base.versions[1].getChangedFields()) == ['Name', 'So_Value']
[docs]def test_foreign_keys():
setup()
base1 = Base(name='first', so_value=1)
base2 = Base(name='first', so_value=1)
has_foreign = HasForeign(foreign=base1)
has_foreign.foreign = base2
assert has_foreign.versions[0].foreign == base1
[docs]def test_altid():
setup()
extra = HasAltId(name="fleem", altid=5)
extra.name = "morx"