From 7aa1c0a9078e33b201200acb024463cf611ec9b2 Mon Sep 17 00:00:00 2001 From: Ulf <ureimers@bimp.de> Date: Tue, 17 Jun 2014 14:45:59 +0200 Subject: [PATCH] Create DDC3170Test.php Added test for [DDC-3170] (http://www.doctrine-project.org/jira/browse/DDC-3170) --- .../ORM/Functional/Ticket/DDC3170Test.php | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php new file mode 100644 index 000000000..591b0fd71 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php @@ -0,0 +1,110 @@ +<?php + +namespace Doctrine\Tests\ORM\Functional\Ticket; + +use Doctrine\ORM\AbstractQuery; +use Doctrine\ORM\Internal\Hydration\HydrationException; + +/** + * @group DDC-2306 + */ +class DDC3170Test extends \Doctrine\Tests\OrmFunctionalTestCase +{ + /** + * {@inheritDoc} + */ + protected function setup() + { + parent::setup(); + + $this->_schemaTool->createSchema( + array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170AbstractEntityJoined'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170ProductJoined'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170AbstractEntitySingleTable'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170ProductSingleTable'), + ) + ); + } + + /** + * Tests that the discriminator column is correctly read from the meta mappings when fetching a + * child from an inheritance mapped class. + * + * The simple object hydration maps the type field to a field alias like type2. This mapping needs + * to be considered when loading the discriminator column's value from the SQL result. + * + * {@see \Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator::hydrateRowData()} + */ + public function testIssue() + { + // $this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); + + $productJoined = new DDC3170ProductJoined(); + $productSingleTable = new DDC3170ProductSingleTable(); + $this->_em->persist($productJoined); + $this->_em->persist($productSingleTable); + $this->_em->flush(); + $this->_em->clear(); + + try { + $this->_em->createQueryBuilder() + ->select('p') + ->from(__NAMESPACE__ . '\\DDC3170ProductJoined', 'p') + ->getQuery() + ->getResult(AbstractQuery::HYDRATE_SIMPLEOBJECT); + } catch (HydrationException $e) // Thrown by SimpleObjectHydrator + { + $this->fail('Failed correct mapping of discriminator column when using simple object hydration and class table inheritance'); + } + + try { + $this->_em->createQueryBuilder() + ->select('p') + ->from(__NAMESPACE__ . '\\DDC3170ProductSingleTable', 'p') + ->getQuery() + ->getResult(AbstractQuery::HYDRATE_SIMPLEOBJECT); + } catch (HydrationException $e) // Thrown by SimpleObjectHydrator + { + $this->fail('Failed correct mapping of discriminator column when using simple object hydration and single table inheritance'); + } + } +} + +/** + * @Entity + * @InheritanceType("JOINED") + * @DiscriminatorColumn(name="type", type="string") + * @DiscriminatorMap({"product" = "DDC3170ProductJoined"}) + */ +abstract class DDC3170AbstractEntityJoined +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; +} + +/** + * @Entity + */ +class DDC3170ProductJoined extends DDC3170AbstractEntityJoined +{ +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorColumn(name="type", type="string") + * @DiscriminatorMap({"product" = "DDC3170ProductSingleTable"}) + */ +abstract class DDC3170AbstractEntitySingleTable +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; +} + +/** + * @Entity + */ +class DDC3170ProductSingleTable extends DDC3170AbstractEntitySingleTable +{ +}