summaryrefslogtreecommitdiff
path: root/test/orm/test_pickled.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/test_pickled.py')
-rw-r--r--test/orm/test_pickled.py99
1 files changed, 75 insertions, 24 deletions
diff --git a/test/orm/test_pickled.py b/test/orm/test_pickled.py
index f2ef8e2e9..399c881ac 100644
--- a/test/orm/test_pickled.py
+++ b/test/orm/test_pickled.py
@@ -96,6 +96,32 @@ class PickleTest(fixtures.MappedTest):
test_needs_fk=True,
)
+ def _option_test_fixture(self):
+ users, addresses, dingalings = (
+ self.tables.users,
+ self.tables.addresses,
+ self.tables.dingalings,
+ )
+
+ mapper(
+ User,
+ users,
+ properties={"addresses": relationship(Address, backref="user")},
+ )
+ mapper(
+ Address,
+ addresses,
+ properties={"dingaling": relationship(Dingaling)},
+ )
+ mapper(Dingaling, dingalings)
+ sess = create_session()
+ u1 = User(name="ed")
+ u1.addresses.append(Address(email_address="ed@bar.com"))
+ sess.add(u1)
+ sess.flush()
+ sess.expunge_all()
+ return sess, User, Address, Dingaling
+
def test_transient(self):
users, addresses = (self.tables.users, self.tables.addresses)
@@ -418,40 +444,65 @@ class PickleTest(fixtures.MappedTest):
eq_(sa.inspect(u2).info["some_key"], "value")
@testing.requires.non_broken_pickle
- def test_options_with_descriptors(self):
- users, addresses, dingalings = (
- self.tables.users,
- self.tables.addresses,
- self.tables.dingalings,
- )
+ def test_unbound_options(self):
+ sess, User, Address, Dingaling = self._option_test_fixture()
- mapper(
- User,
- users,
- properties={"addresses": relationship(Address, backref="user")},
- )
- mapper(
- Address,
- addresses,
- properties={"dingaling": relationship(Dingaling)},
- )
- mapper(Dingaling, dingalings)
- sess = create_session()
- u1 = User(name="ed")
- u1.addresses.append(Address(email_address="ed@bar.com"))
- sess.add(u1)
- sess.flush()
- sess.expunge_all()
+ for opt in [
+ sa.orm.joinedload(User.addresses),
+ sa.orm.joinedload("addresses"),
+ sa.orm.defer("name"),
+ sa.orm.defer(User.name),
+ sa.orm.joinedload("addresses").joinedload(Address.dingaling),
+ ]:
+ opt2 = pickle.loads(pickle.dumps(opt))
+ eq_(opt.path, opt2.path)
+
+ u1 = sess.query(User).options(opt).first()
+ pickle.loads(pickle.dumps(u1))
+
+ @testing.requires.non_broken_pickle
+ def test_bound_options(self):
+ sess, User, Address, Dingaling = self._option_test_fixture()
+
+ for opt in [
+ sa.orm.Load(User).joinedload(User.addresses),
+ sa.orm.Load(User).joinedload("addresses"),
+ sa.orm.Load(User).defer("name"),
+ sa.orm.Load(User).defer(User.name),
+ sa.orm.Load(User)
+ .joinedload("addresses")
+ .joinedload(Address.dingaling),
+ sa.orm.Load(User)
+ .joinedload("addresses", innerjoin=True)
+ .joinedload(Address.dingaling),
+ ]:
+ opt2 = pickle.loads(pickle.dumps(opt))
+ eq_(opt.path, opt2.path)
+ eq_(opt.context.keys(), opt2.context.keys())
+ eq_(opt.local_opts, opt2.local_opts)
+
+ u1 = sess.query(User).options(opt).first()
+ pickle.loads(pickle.dumps(u1))
+
+ @testing.requires.non_broken_pickle
+ def test_became_bound_options(self):
+ sess, User, Address, Dingaling = self._option_test_fixture()
for opt in [
sa.orm.joinedload(User.addresses),
sa.orm.joinedload("addresses"),
sa.orm.defer("name"),
sa.orm.defer(User.name),
- sa.orm.joinedload("addresses", Address.dingaling),
+ sa.orm.joinedload("addresses").joinedload(Address.dingaling),
]:
+ q = sess.query(User).options(opt)
+ opt = [
+ v for v in q._attributes.values() if isinstance(v, sa.orm.Load)
+ ][0]
+
opt2 = pickle.loads(pickle.dumps(opt))
eq_(opt.path, opt2.path)
+ eq_(opt.local_opts, opt2.local_opts)
u1 = sess.query(User).options(opt).first()
pickle.loads(pickle.dumps(u1))