summaryrefslogtreecommitdiff
path: root/test/orm/inheritance/test_basic.py
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2020-01-30 16:15:56 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2020-01-30 16:15:56 +0000
commit237724d338bf8fd88a24f2bb9dd0c800bda7dbde (patch)
tree04d126116fb6b48691a9996721d922953ba95a61 /test/orm/inheritance/test_basic.py
parent447dec2c15f7b749a3e98df93c001b1b9a36ed32 (diff)
parentc741b89bd57eb31b7a1bbd187a4d159bdfea5111 (diff)
downloadsqlalchemy-237724d338bf8fd88a24f2bb9dd0c800bda7dbde.tar.gz
Merge "Raise for unexpected polymorphic identity"
Diffstat (limited to 'test/orm/inheritance/test_basic.py')
-rw-r--r--test/orm/inheritance/test_basic.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py
index ebb485156..831781330 100644
--- a/test/orm/inheritance/test_basic.py
+++ b/test/orm/inheritance/test_basic.py
@@ -3410,6 +3410,96 @@ class DiscriminatorOrPkNoneTest(fixtures.DeclarativeMappedTest):
)
+class UnexpectedPolymorphicIdentityTest(fixtures.DeclarativeMappedTest):
+ run_setup_mappers = "once"
+ __dialect__ = "default"
+
+ @classmethod
+ def setup_classes(cls):
+ Base = cls.DeclarativeBasic
+
+ class AJoined(fixtures.ComparableEntity, Base):
+ __tablename__ = "ajoined"
+ id = Column(Integer, primary_key=True)
+ type = Column(String(10), nullable=False)
+ __mapper_args__ = {
+ "polymorphic_on": type,
+ "polymorphic_identity": "a",
+ }
+
+ class AJoinedSubA(AJoined):
+ __tablename__ = "ajoinedsuba"
+ id = Column(ForeignKey("ajoined.id"), primary_key=True)
+ __mapper_args__ = {"polymorphic_identity": "suba"}
+
+ class AJoinedSubB(AJoined):
+ __tablename__ = "ajoinedsubb"
+ id = Column(ForeignKey("ajoined.id"), primary_key=True)
+ __mapper_args__ = {"polymorphic_identity": "subb"}
+
+ class ASingle(fixtures.ComparableEntity, Base):
+ __tablename__ = "asingle"
+ id = Column(Integer, primary_key=True)
+ type = Column(String(10), nullable=False)
+ __mapper_args__ = {
+ "polymorphic_on": type,
+ "polymorphic_identity": "a",
+ }
+
+ class ASingleSubA(ASingle):
+ __mapper_args__ = {"polymorphic_identity": "suba"}
+
+ class ASingleSubB(ASingle):
+ __mapper_args__ = {"polymorphic_identity": "subb"}
+
+ @classmethod
+ def insert_data(cls):
+ ASingleSubA, ASingleSubB, AJoinedSubA, AJoinedSubB = cls.classes(
+ "ASingleSubA", "ASingleSubB", "AJoinedSubA", "AJoinedSubB"
+ )
+ s = Session()
+
+ s.add_all([ASingleSubA(), ASingleSubB(), AJoinedSubA(), AJoinedSubB()])
+ s.commit()
+
+ def test_single_invalid_ident(self):
+ ASingle, ASingleSubA = self.classes("ASingle", "ASingleSubA")
+
+ s = Session()
+
+ q = s.query(ASingleSubA).select_entity_from(
+ select([ASingle]).subquery()
+ )
+
+ assert_raises_message(
+ sa_exc.InvalidRequestError,
+ r"Row with identity key \(.*ASingle.*\) can't be loaded into an "
+ r"object; the polymorphic discriminator column '.*.type' refers "
+ r"to mapped class ASingleSubB->asingle, which is not a "
+ r"sub-mapper of the requested mapped class ASingleSubA->asingle",
+ q.all,
+ )
+
+ def test_joined_invalid_ident(self):
+ AJoined, AJoinedSubA = self.classes("AJoined", "AJoinedSubA")
+
+ s = Session()
+
+ q = s.query(AJoinedSubA).select_entity_from(
+ select([AJoined]).subquery()
+ )
+
+ assert_raises_message(
+ sa_exc.InvalidRequestError,
+ r"Row with identity key \(.*AJoined.*\) can't be loaded into an "
+ r"object; the polymorphic discriminator column '.*.type' refers "
+ r"to mapped class AJoinedSubB->ajoinedsubb, which is not a "
+ r"sub-mapper of the requested mapped class "
+ r"AJoinedSubA->ajoinedsuba",
+ q.all,
+ )
+
+
class NameConflictTest(fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):