Source code for sqlobject.tests.test_ForeignKey
from formencode import validators
from sqlobject import ForeignKey, IntCol, SQLObject, StringCol
from sqlobject.tests.dbtest import getConnection, InstalledTestDatabase, \
raises, setupClass, setupCyclicClasses
[docs]class SOTestComposerKey(SQLObject):
name = StringCol()
id2 = IntCol(default=None, unique=True)
[docs]class SOTestWorkKey(SQLObject):
class sqlmeta:
idName = "work_id"
composer = ForeignKey('SOTestComposerKey', cascade=True)
title = StringCol()
[docs]class SOTestWorkKey2(SQLObject):
title = StringCol()
[docs]class SOTestOtherColumn(SQLObject):
key1 = ForeignKey('SOTestComposerKey', default=None)
key2 = ForeignKey('SOTestComposerKey', refColumn='id2', default=None)
[docs]def test1():
setupClass([SOTestComposerKey, SOTestWorkKey])
c = SOTestComposerKey(name='Mahler, Gustav')
w1 = SOTestWorkKey(composer=c, title='Symphony No. 9')
w2 = SOTestWorkKey(composer=None, title=None)
# Select by usual way
s = SOTestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9')
assert s.count() == 1
assert s[0] == w1
# selectBy object.id
s = SOTestWorkKey.selectBy(composer=c.id, title='Symphony No. 9')
assert s.count() == 1
assert s[0] == w1
# selectBy object
s = SOTestWorkKey.selectBy(composer=c, title='Symphony No. 9')
assert s.count() == 1
assert s[0] == w1
# selectBy id
s = SOTestWorkKey.selectBy(id=w1.id)
assert s.count() == 1
assert s[0] == w1
# is None handled correctly?
s = SOTestWorkKey.selectBy(composer=None, title=None)
assert s.count() == 1
assert s[0] == w2
s = SOTestWorkKey.selectBy()
assert s.count() == 2
# select with objects
s = SOTestWorkKey.select(SOTestWorkKey.q.composerID == c.id)
assert s.count() == 1
assert s[0] == w1
s = SOTestWorkKey.select(SOTestWorkKey.q.composer == c.id)
assert s.count() == 1
assert s[0] == w1
s = SOTestWorkKey.select(SOTestWorkKey.q.composerID == c)
assert s.count() == 1
assert s[0] == w1
s = SOTestWorkKey.select(SOTestWorkKey.q.composer == c)
assert s.count() == 1
assert s[0] == w1
s = SOTestWorkKey.select(
(SOTestWorkKey.q.composer == c)
& (SOTestWorkKey.q.title == 'Symphony No. 9'))
assert s.count() == 1
assert s[0] == w1
[docs]def test2():
SOTestWorkKey._connection = getConnection()
InstalledTestDatabase.drop(SOTestWorkKey)
setupClass([SOTestComposerKey, SOTestWorkKey2], force=True)
SOTestWorkKey2.sqlmeta.addColumn(ForeignKey('SOTestComposerKey'),
changeSchema=True)
[docs]def test_otherColumn():
setupClass([SOTestComposerKey, SOTestOtherColumn])
test_composer1 = SOTestComposerKey(name='Test1')
test_composer2 = SOTestComposerKey(name='Test2', id2=2)
test_fkey = SOTestOtherColumn(key1=test_composer1)
test_other = SOTestOtherColumn(key2=test_composer2.id2)
getConnection().cache.clear()
assert test_fkey.key1 == test_composer1
assert test_other.key2 == test_composer2
[docs]class SOTestFKValidationA(SQLObject):
name = StringCol()
bfk = ForeignKey("SOTestFKValidationB")
cfk = ForeignKey("SOTestFKValidationC", default=None)
[docs]class SOTestFKValidationB(SQLObject):
name = StringCol()
afk = ForeignKey("SOTestFKValidationA")
[docs]class SOTestFKValidationC(SQLObject):
class sqlmeta:
idType = str
name = StringCol()
[docs]def test_foreignkey_validation():
setupCyclicClasses(SOTestFKValidationA, SOTestFKValidationB,
SOTestFKValidationC)
a = SOTestFKValidationA(name="testa", bfk=None)
b = SOTestFKValidationB(name="testb", afk=a)
c = SOTestFKValidationC(id='testc', name="testc")
a.bfk = b
a.cfk = c
assert a.bfk == b
assert a.cfk == c
assert b.afk == a
raises(validators.Invalid,
SOTestFKValidationA, name="testa", bfk='testb', cfk='testc')
a = SOTestFKValidationA(name="testa", bfk=1, cfk='testc')
assert a.bfkID == 1
assert a.cfkID == 'testc'