ClassMetadataFactoryTest.php 3.75 KB
Newer Older
1 2
<?php

3 4 5 6
namespace Doctrine\Tests\ORM\Mapping;

use Doctrine\Tests\Mocks\MetadataDriverMock;
use Doctrine\Tests\Mocks\DatabasePlatformMock;
7 8 9
use Doctrine\Tests\Mocks\EntityManagerMock;
use Doctrine\Tests\Mocks\ConnectionMock;
use Doctrine\Tests\Mocks\DriverMock;
10
use Doctrine\ORM\Mapping\ClassMetadata;
11
use Doctrine\Common\EventManager;
12

13
require_once __DIR__ . '/../../TestInit.php';
14

15 16 17 18
class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase
{
    public function testGetMetadataForSingleClass()
    {
19 20
        $driverMock = new DriverMock();
        $config = new \Doctrine\ORM\Configuration();
21 22
        $config->setProxyDir(__DIR__ . '/../../Proxies');
        $config->setProxyNamespace('Doctrine\Tests\Proxies');
23 24
        $eventManager = new EventManager();
        $conn = new ConnectionMock(array(), $driverMock, $config, $eventManager);
25
        $mockDriver = new MetadataDriverMock();
26 27 28 29 30
        $config->setMetadataDriverImpl($mockDriver);

        $entityManager = EntityManagerMock::create($conn, $config, $eventManager);

        $mockPlatform = $conn->getDatabasePlatform();
31 32
        $mockPlatform->setPrefersSequences(true);
        $mockPlatform->setPrefersIdentityColumns(false);
romanb's avatar
romanb committed
33 34

        // Self-made metadata
35
        $cm1 = new ClassMetadata('Doctrine\Tests\ORM\Mapping\TestEntity1');
romanb's avatar
romanb committed
36
        // Add a mapped field
romanb's avatar
romanb committed
37
        $cm1->mapField(array('fieldName' => 'name', 'type' => 'varchar'));
38 39
        // Add a mapped field
        $cm1->mapField(array('fieldName' => 'id', 'type' => 'integer', 'id' => true));
romanb's avatar
romanb committed
40 41
        // and a mapped association
        $cm1->mapOneToOne(array('fieldName' => 'other', 'targetEntity' => 'Other', 'mappedBy' => 'this'));
42 43 44 45 46
        // and an association on the owning side
        $joinColumns = array(
            array('name' => 'other_id', 'referencedColumnName' => 'id')
        );
        $cm1->mapOneToOne(array('fieldName' => 'association', 'targetEntity' => 'Other', 'joinColumns' => $joinColumns));
romanb's avatar
romanb committed
47
        // and an id generator type
48
        $cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO);
romanb's avatar
romanb committed
49 50

        // SUT
51
        $cmf = new ClassMetadataFactoryTestSubject($entityManager);
52
        $cmf->setMetadataForClass('Doctrine\Tests\ORM\Mapping\TestEntity1', $cm1);
romanb's avatar
romanb committed
53 54

        // Prechecks
55
        $this->assertEquals(array(), $cm1->parentClasses);
56
        $this->assertEquals(ClassMetadata::INHERITANCE_TYPE_NONE, $cm1->inheritanceType);
romanb's avatar
romanb committed
57
        $this->assertTrue($cm1->hasField('name'));
58
        $this->assertEquals(2, count($cm1->associationMappings));
59
        $this->assertEquals(ClassMetadata::GENERATOR_TYPE_AUTO, $cm1->generatorType);
romanb's avatar
romanb committed
60 61

        // Go
62
        $cm1 = $cmf->getMetadataFor('Doctrine\Tests\ORM\Mapping\TestEntity1');
romanb's avatar
romanb committed
63

64
        $this->assertEquals(array(), $cm1->parentClasses);
romanb's avatar
romanb committed
65
        $this->assertTrue($cm1->hasField('name'));
66
        $this->assertEquals(ClassMetadata::GENERATOR_TYPE_SEQUENCE, $cm1->generatorType);
67 68 69 70
    }
}

/* Test subject class with overriden factory method for mocking purposes */
71 72
class ClassMetadataFactoryTestSubject extends \Doctrine\ORM\Mapping\ClassMetadataFactory
{
73 74
    private $_mockMetadata = array();
    private $_requestedClasses = array();
75

76
    /** @override */
77 78
    protected function _newClassMetadataInstance($className)
    {
79 80 81 82 83 84
        $this->_requestedClasses[] = $className;
        if ( ! isset($this->_mockMetadata[$className])) {
            throw new InvalidArgumentException("No mock metadata found for class $className.");
        }
        return $this->_mockMetadata[$className];
    }
85 86 87

    public function setMetadataForClass($className, $metadata)
    {
88 89
        $this->_mockMetadata[$className] = $metadata;
    }
90 91 92 93 94

    public function getRequestedClasses()
    {
        return $this->_requestedClasses;
    }
95
}
96 97 98 99 100 101

class TestEntity1
{
    private $id;
    private $name;
    private $other;
102 103
    private $association;
}