diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-01-04 16:58:55 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-01-04 16:59:36 -0500 |
| commit | 127ead7452f326509cde38fcf7c9f38f69d9ae0a (patch) | |
| tree | 1304c833e8936532f6e981592d5d829a858497dc /test/orm/test_options.py | |
| parent | 350671ff86070ca17c09dab7631221ac1eb33d65 (diff) | |
| download | sqlalchemy-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.py | 92 |
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') |
