summaryrefslogtreecommitdiff
path: root/test/ext/declarative/test_basic.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2019-01-29 23:53:10 -0600
committerMike Bayer <mike_mp@zzzcomputing.com>2019-01-30 21:06:27 -0600
commit147f6d382c3b6f06c8efa5a24c07c9849473e7af (patch)
treeb3c1288d8d493bba638a3b07fd2bfdc7defa8fa6 /test/ext/declarative/test_basic.py
parentb8f9517cddf41dbb47ae4ad120141c7ab1a29ac5 (diff)
downloadsqlalchemy-147f6d382c3b6f06c8efa5a24c07c9849473e7af.tar.gz
Add informative failure modes to _DeferredMapperConfig
Added some helper exceptions that invoke when a mapping based on :class:`.AbstractConcreteBase`, :class:`.DeferredReflection`, or :class:`.AutoMap` is used before the mapping is ready to be used, which contain descriptive information on the class, rather than falling through into other failure modes that are less informative. Fixes: #4470 Change-Id: I9bc51697f63cedaa7809a0adb17b2398c209e289
Diffstat (limited to 'test/ext/declarative/test_basic.py')
-rw-r--r--test/ext/declarative/test_basic.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/test/ext/declarative/test_basic.py b/test/ext/declarative/test_basic.py
index 8b60a1176..3fe2f1bfe 100644
--- a/test/ext/declarative/test_basic.py
+++ b/test/ext/declarative/test_basic.py
@@ -15,6 +15,7 @@ from sqlalchemy import util
from sqlalchemy.ext import declarative as decl
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.declarative import synonym_for
+from sqlalchemy.ext.declarative.base import _DeferredMapperConfig
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import backref
from sqlalchemy.orm import class_mapper
@@ -25,6 +26,7 @@ from sqlalchemy.orm import composite
from sqlalchemy.orm import configure_mappers
from sqlalchemy.orm import create_session
from sqlalchemy.orm import deferred
+from sqlalchemy.orm import exc as orm_exc
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import mapper
from sqlalchemy.orm import properties
@@ -116,6 +118,37 @@ class DeclarativeTest(DeclarativeTestBase):
eq_(a1, Address(email="two"))
eq_(a1.user, User(name="u1"))
+ def test_deferred_reflection_default_error(self):
+ class MyExt(object):
+ @classmethod
+ def prepare(cls):
+ "sample prepare method"
+ to_map = _DeferredMapperConfig.classes_for_base(cls)
+ for thingy in to_map:
+ thingy.map()
+
+ @classmethod
+ def _sa_decl_prepare(cls):
+ pass
+
+ class User(MyExt, Base):
+ __tablename__ = "user"
+ id = Column(Integer, primary_key=True)
+
+ assert_raises_message(
+ orm_exc.UnmappedClassError,
+ "Class test.ext.declarative.test_basic.User has a deferred "
+ "mapping on it. It is not yet usable as a mapped class.",
+ Session().query,
+ User,
+ )
+
+ User.prepare()
+
+ self.assert_compile(
+ Session().query(User), 'SELECT "user".id AS user_id FROM "user"'
+ )
+
def test_unicode_string_resolve(self):
class User(Base, fixtures.ComparableEntity):
__tablename__ = "users"