from sqlobject import * from sqlobject.tests.dbtest import * ######################################## ## Joins ######################################## class PersonJoinerNew(SQLObject): name = StringCol(length=40, alternateID=True) addressJoiners = ManyToMany('AddressJoinerNew') class AddressJoinerNew(SQLObject): zip = StringCol(length=5, alternateID=True) personJoiners = ManyToMany('PersonJoinerNew') class ImplicitJoiningSONew(SQLObject): foo = ManyToMany('Bar') class ExplicitJoiningSONew(SQLObject): foo = OneToMany('Bar') class TestJoin: def setup_method(self, meth): setupClass(PersonJoinerNew) setupClass(AddressJoinerNew) for n in ['bob', 'tim', 'jane', 'joe', 'fred', 'barb']: PersonJoinerNew(name=n) for z in ['11111', '22222', '33333', '44444']: AddressJoinerNew(zip=z) def test_join(self): b = PersonJoinerNew.byName('bob') assert list(b.addressJoiners) == [] z = AddressJoinerNew.byZip('11111') b.addressJoiners.add(z) self.assertZipsEqual(b.addressJoiners, ['11111']) print str(z.personJoiners), repr(z.personJoiners) self.assertNamesEqual(z.personJoiners, ['bob']) z2 = AddressJoinerNew.byZip('22222') b.addressJoiners.add(z2) print str(b.addressJoiners) self.assertZipsEqual(b.addressJoiners, ['11111', '22222']) self.assertNamesEqual(z2.personJoiners, ['bob']) b.addressJoiners.remove(z) self.assertZipsEqual(b.addressJoiners, ['22222']) self.assertNamesEqual(z.personJoiners, []) def assertZipsEqual(self, zips, dest): assert [a.zip for a in zips] == dest def assertNamesEqual(self, people, dest): assert [p.name for p in people] == dest def test_joinAttributeWithUnderscores(self): # Make sure that the implicit setting of joinMethodName works assert hasattr(ImplicitJoiningSONew, 'foo') assert not hasattr(ImplicitJoiningSONew, 'bars') # And make sure explicit setting also works assert hasattr(ExplicitJoiningSONew, 'foo') assert not hasattr(ExplicitJoiningSONew, 'bars') class PersonJoinerNew2(SQLObject): name = StringCol('name', length=40, alternateID=True) addressJoiner2s = OneToMany('AddressJoinerNew2') class AddressJoinerNew2(SQLObject): class sqlmeta: defaultOrder = ['-zip', 'plus4'] zip = StringCol(length=5) plus4 = StringCol(length=4, default=None) personJoinerNew2 = ForeignKey('PersonJoinerNew2') class TestJoin2: def setup_method(self, meth): setupClass([PersonJoinerNew2, AddressJoinerNew2]) p1 = PersonJoinerNew2(name='bob') p2 = PersonJoinerNew2(name='sally') for z in ['11111', '22222', '33333']: a = AddressJoinerNew2(zip=z, personJoinerNew2=p1) #p1.addAddressJoinerNew2(a) AddressJoinerNew2(zip='00000', personJoinerNew2=p2) def test_basic(self): bob = PersonJoinerNew2.byName('bob') sally = PersonJoinerNew2.byName('sally') print bob.addressJoiner2s print bob assert len(list(bob.addressJoiner2s)) == 3 assert len(list(sally.addressJoiner2s)) == 1 bob.addressJoiner2s[0].destroySelf() assert len(list(bob.addressJoiner2s)) == 2 z = bob.addressJoiner2s[0] z.zip = 'xxxxx' id = z.id del z z = AddressJoinerNew2.get(id) assert z.zip == 'xxxxx' def test_defaultOrder(self): p1 = PersonJoinerNew2.byName('bob') assert ([i.zip for i in p1.addressJoiner2s] == ['33333', '22222', '11111']) _personJoiner3_getters = [] _personJoiner3_setters = [] class PersonJoinerNew3(SQLObject): name = StringCol('name', length=40, alternateID=True) addressJoinerNew3s = OneToMany('AddressJoinerNew3') class AddressJoinerNew3(SQLObject): zip = StringCol(length=5) personJoinerNew3 = ForeignKey('PersonJoinerNew3') def _get_personJoinerNew3(self): value = self._SO_get_personJoinerNew3() _personJoiner3_getters.append((self, value)) return value def _set_personJoinerNew3(self, value): self._SO_set_personJoinerNew3(value) _personJoiner3_setters.append((self, value)) class TestJoin3: def setup_method(self, meth): setupClass([PersonJoinerNew3, AddressJoinerNew3]) p1 = PersonJoinerNew3(name='bob') p2 = PersonJoinerNew3(name='sally') for z in ['11111', '22222', '33333']: a = AddressJoinerNew3(zip=z, personJoinerNew3=p1) AddressJoinerNew3(zip='00000', personJoinerNew3=p2) def test_accessors(self): assert len(list(_personJoiner3_getters)) == 0 assert len(list(_personJoiner3_setters)) == 4 bob = PersonJoinerNew3.byName('bob') for addressJoiner3 in bob.addressJoinerNew3s: addressJoiner3.personJoinerNew3 assert len(list(_personJoiner3_getters)) == 3 assert len(list(_personJoiner3_setters)) == 4