OneToOneBidirectionalAssociationTest.php 5.22 KB
Newer Older
piccoloprincipe's avatar
piccoloprincipe committed
1 2 3 4 5 6
<?php

namespace Doctrine\Tests\ORM\Functional;

use Doctrine\Tests\Models\ECommerce\ECommerceCart;
use Doctrine\Tests\Models\ECommerce\ECommerceCustomer;
7
use Doctrine\ORM\Mapping\AssociationMapping;
piccoloprincipe's avatar
piccoloprincipe committed
8 9 10 11

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

/**
12
 * Tests a bidirectional one-to-one association mapping (without inheritance).
piccoloprincipe's avatar
piccoloprincipe committed
13
 */
14
class OneToOneBidirectionalAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCase
piccoloprincipe's avatar
piccoloprincipe committed
15
{
16 17
    private $customer;
    private $cart;
piccoloprincipe's avatar
piccoloprincipe committed
18 19 20 21 22 23

    protected function setUp()
    {
        $this->useModelSet('ecommerce');
        parent::setUp();
        $this->customer = new ECommerceCustomer();
24
        $this->customer->setName('John Doe');
piccoloprincipe's avatar
piccoloprincipe committed
25
        $this->cart = new ECommerceCart();
26
        $this->cart->setPayment('Credit card');
piccoloprincipe's avatar
piccoloprincipe committed
27 28 29 30
    }

    public function testSavesAOneToOneAssociationWithCascadeSaveSet() {
        $this->customer->setCart($this->cart);
romanb's avatar
romanb committed
31
        $this->_em->persist($this->customer);
32
        $this->_em->flush();
33 34
        
        $this->assertCartForeignKeyIs($this->customer->getId());
piccoloprincipe's avatar
piccoloprincipe committed
35 36 37
    }

    public function testDoesNotSaveAnInverseSideSet() {
38
        $this->customer->brokenSetCart($this->cart);
romanb's avatar
romanb committed
39
        $this->_em->persist($this->customer);
40
        $this->_em->flush();
41
        
piccoloprincipe's avatar
piccoloprincipe committed
42 43 44 45 46 47
        $this->assertCartForeignKeyIs(null);
    }

    public function testRemovesOneToOneAssociation()
    {
        $this->customer->setCart($this->cart);
romanb's avatar
romanb committed
48
        $this->_em->persist($this->customer);
piccoloprincipe's avatar
piccoloprincipe committed
49 50 51 52 53 54 55
        $this->customer->removeCart();

        $this->_em->flush();

        $this->assertCartForeignKeyIs(null);
    }

56
    public function testEagerLoad()
piccoloprincipe's avatar
piccoloprincipe committed
57
    {
58
        $this->_createFixture();
59 60

        $query = $this->_em->createQuery('select c, ca from Doctrine\Tests\Models\ECommerce\ECommerceCustomer c join c.cart ca');
61
        $result = $query->getResult();
62 63 64 65
        $customer = $result[0];
        
        $this->assertTrue($customer->getCart() instanceof ECommerceCart);
        $this->assertEquals('paypal', $customer->getCart()->getPayment());
piccoloprincipe's avatar
piccoloprincipe committed
66
    }
67
    
68 69 70 71 72 73
    public function testLazyLoadsObjectsOnTheOwningSide() {
        $this->_createFixture();
        $metadata = $this->_em->getClassMetadata('Doctrine\Tests\Models\ECommerce\ECommerceCart');
        $metadata->getAssociationMapping('customer')->fetchMode = AssociationMapping::FETCH_LAZY;

        $query = $this->_em->createQuery('select c from Doctrine\Tests\Models\ECommerce\ECommerceCart c');
74
        $result = $query->getResult();
75 76 77 78 79 80
        $cart = $result[0];
        
        $this->assertTrue($cart->getCustomer() instanceof ECommerceCustomer);
        $this->assertEquals('Giorgio', $cart->getCustomer()->getName());
    }

81
    public function testInverseSideIsNeverLazy()
romanb's avatar
romanb committed
82
    {
83 84
        $this->_createFixture();
        $metadata = $this->_em->getClassMetadata('Doctrine\Tests\Models\ECommerce\ECommerceCustomer');
romanb's avatar
romanb committed
85
        $metadata->getAssociationMapping('mentor')->fetchMode = AssociationMapping::FETCH_EAGER;
86 87

        $query = $this->_em->createQuery('select c from Doctrine\Tests\Models\ECommerce\ECommerceCustomer c');
88
        $result = $query->getResult();
89
        $customer = $result[0];
90
        
91
        $this->assertNull($customer->getMentor());
92
        $this->assertTrue($customer->getCart() instanceof ECommerceCart);
93
        $this->assertFalse($customer->getCart() instanceof \Doctrine\ORM\Proxy\Proxy);
94 95
        $this->assertEquals('paypal', $customer->getCart()->getPayment());
    }
romanb's avatar
romanb committed
96 97
    
    public function testUpdateWithProxyObject()
98
    {        
romanb's avatar
romanb committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
        $cust = new ECommerceCustomer;
        $cust->setName('Roman');
        $cart = new ECommerceCart;
        $cart->setPayment('CARD');
        $cust->setCart($cart);
        
        $this->_em->persist($cust);
        $this->_em->flush();
        $this->_em->clear();
        
        $this->assertTrue($cust->getCart() instanceof ECommerceCart);
        $this->assertEquals('Roman', $cust->getName());
        $this->assertSame($cust, $cart->getCustomer());
        
        $query = $this->_em->createQuery('select ca from Doctrine\Tests\Models\ECommerce\ECommerceCart ca where ca.id =?1');
        $query->setParameter(1, $cart->getId());
        
        $cart2 = $query->getSingleResult();
        
        $cart2->setPayment('CHEQUE');

        $this->_em->flush();
        $this->_em->clear();
        
        $query2 = $this->_em->createQuery('select ca, c from Doctrine\Tests\Models\ECommerce\ECommerceCart ca left join ca.customer c where ca.id =?1');
        $query2->setParameter(1, $cart->getId());
        
        $cart3 = $query2->getSingleResult();
        
        $this->assertTrue($cart3->getCustomer() instanceof ECommerceCustomer);
129
        $this->assertEquals('Roman', $cart3->getCustomer()->getName());
romanb's avatar
romanb committed
130
    }
131 132 133 134 135 136 137 138 139

    protected function _createFixture()
    {
        $customer = new ECommerceCustomer;
        $customer->setName('Giorgio');
        $cart = new ECommerceCart;
        $cart->setPayment('paypal');
        $customer->setCart($cart);
        
romanb's avatar
romanb committed
140
        $this->_em->persist($customer);
141 142 143 144
        
        $this->_em->flush();
        $this->_em->clear();
    }
piccoloprincipe's avatar
piccoloprincipe committed
145 146

    public function assertCartForeignKeyIs($value) {
147
        $foreignKey = $this->_em->getConnection()->execute('SELECT customer_id FROM ecommerce_carts WHERE id=?', array($this->cart->getId()))->fetchColumn();
piccoloprincipe's avatar
piccoloprincipe committed
148 149 150
        $this->assertEquals($value, $foreignKey);
    }
}