summaryrefslogtreecommitdiff
path: root/test/orm/test_options.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-01-04 16:58:55 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2018-01-04 16:59:36 -0500
commit127ead7452f326509cde38fcf7c9f38f69d9ae0a (patch)
tree1304c833e8936532f6e981592d5d829a858497dc /test/orm/test_options.py
parent350671ff86070ca17c09dab7631221ac1eb33d65 (diff)
downloadsqlalchemy-127ead7452f326509cde38fcf7c9f38f69d9ae0a.tar.gz
Don't try to iterate chopped path if it's None
Fixed regression caused by new lazyload caching scheme in :ticket:`3954` where a query that makes use of loader options with of_type would cause lazy loads of unrelated paths to fail with a TypeError. Change-Id: I705ea0ac012bcc3856ca04109454952cb07a2a8b Fixes: #4153
Diffstat (limited to 'test/orm/test_options.py')
-rw-r--r--test/orm/test_options.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/test/orm/test_options.py b/test/orm/test_options.py
index 44ebe81c3..731aee1e5 100644
--- a/test/orm/test_options.py
+++ b/test/orm/test_options.py
@@ -1093,6 +1093,98 @@ class CacheKeyTest(PathTest, QueryTest):
None
)
+ def test_unbound_cache_key_excluded_of_type_safe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+ # query of:
+ #
+ # query(User).options(
+ # subqueryload(User.orders).
+ # subqueryload(Order.items.of_type(SubItem)))
+ #
+ #
+ # we are lazy loading Address objects from User.addresses
+ # the path excludes our option so cache key should
+ # be None
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = subqueryload(User.orders).\
+ subqueryload(Order.items.of_type(SubItem))
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_unbound_cache_key_excluded_of_type_unsafe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+ # query of:
+ #
+ # query(User).options(
+ # subqueryload(User.orders).
+ # subqueryload(Order.items.of_type(aliased(SubItem))))
+ #
+ #
+ # we are lazy loading Address objects from User.addresses
+ # the path excludes our option so cache key should
+ # be None
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = subqueryload(User.orders).\
+ subqueryload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_bound_cache_key_excluded_of_type_safe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+ # query of:
+ #
+ # query(User).options(
+ # subqueryload(User.orders).
+ # subqueryload(Order.items.of_type(SubItem)))
+ #
+ #
+ # we are lazy loading Address objects from User.addresses
+ # the path excludes our option so cache key should
+ # be None
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = Load(User).subqueryload(User.orders).\
+ subqueryload(Order.items.of_type(SubItem))
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
+ def test_bound_cache_key_excluded_of_type_unsafe(self):
+ User, Address, Order, Item, SubItem = self.classes(
+ 'User', 'Address', 'Order', 'Item', 'SubItem')
+ # query of:
+ #
+ # query(User).options(
+ # subqueryload(User.orders).
+ # subqueryload(Order.items.of_type(aliased(SubItem))))
+ #
+ #
+ # we are lazy loading Address objects from User.addresses
+ # the path excludes our option so cache key should
+ # be None
+
+ query_path = self._make_path_registry([User, "addresses"])
+
+ opt = Load(User).subqueryload(User.orders).\
+ subqueryload(Order.items.of_type(aliased(SubItem)))
+ eq_(
+ opt._generate_cache_key(query_path),
+ None
+ )
+
def test_unbound_cache_key_included_of_type_safe(self):
User, Address, Order, Item, SubItem = self.classes(
'User', 'Address', 'Order', 'Item', 'SubItem')