summaryrefslogtreecommitdiff
path: root/test/orm/inheritance/test_basic.py
diff options
context:
space:
mode:
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):