3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15 * This software consists of voluntary contributions made by many individuals
16 * and is licensed under the LGPL. For more information, see
17 * <http://www.doctrine-project.org>.
21 namespace Doctrine\Tests\ORM\Mapping;
23 use Doctrine\ORM\Mapping\ClassMetadata;
24 use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
29 class ClassMetadataBuilderTest extends \Doctrine\Tests\OrmTestCase
36 * @var ClassMetadataBuilder
40 public function setUp()
42 $this->cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
43 $this->cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
44 $this->builder = new ClassMetadataBuilder($this->cm);
47 public function testSetMappedSuperClass()
49 $this->assertIsFluent($this->builder->setMappedSuperClass());
50 $this->assertTrue($this->cm->isMappedSuperclass);
53 public function testSetCustomRepositoryClass()
55 $this->assertIsFluent($this->builder->setCustomRepositoryClass('Doctrine\Tests\Models\CMS\CmsGroup'));
56 $this->assertEquals('Doctrine\Tests\Models\CMS\CmsGroup', $this->cm->customRepositoryClassName);
59 public function testSetReadOnly()
61 $this->assertIsFluent($this->builder->setReadOnly());
62 $this->assertTrue($this->cm->isReadOnly);
65 public function testSetTable()
67 $this->assertIsFluent($this->builder->setTable('users'));
68 $this->assertEquals('users', $this->cm->table['name']);
71 public function testAddIndex()
73 $this->assertIsFluent($this->builder->addIndex(array('username', 'name'), 'users_idx'));
74 $this->assertEquals(array('users_idx' => array('columns' => array('username', 'name'))), $this->cm->table['indexes']);
77 public function testAddUniqueConstraint()
79 $this->assertIsFluent($this->builder->addUniqueConstraint(array('username', 'name'), 'users_idx'));
80 $this->assertEquals(array('users_idx' => array('columns' => array('username', 'name'))), $this->cm->table['uniqueConstraints']);
83 public function testSetPrimaryTableRelated()
85 $this->builder->addUniqueConstraint(array('username', 'name'), 'users_idx');
86 $this->builder->addIndex(array('username', 'name'), 'users_idx');
87 $this->builder->setTable('users');
92 'indexes' => array('users_idx' => array('columns' => array('username', 'name'))),
93 'uniqueConstraints' => array('users_idx' => array('columns' => array('username', 'name'))),
99 public function testSetInheritanceJoined()
101 $this->assertIsFluent($this->builder->setJoinedTableInheritance());
102 $this->assertEquals(ClassMetadata::INHERITANCE_TYPE_JOINED, $this->cm->inheritanceType);
105 public function testSetInheritanceSingleTable()
107 $this->assertIsFluent($this->builder->setSingleTableInheritance());
108 $this->assertEquals(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE, $this->cm->inheritanceType);
111 public function testSetDiscriminatorColumn()
113 $this->assertIsFluent($this->builder->setDiscriminatorColumn('discr', 'string', '124'));
114 $this->assertEquals(array('fieldName' => 'discr', 'name' => 'discr', 'type' => 'string', 'length' => '124'), $this->cm->discriminatorColumn);
117 public function testAddDiscriminatorMapClass()
119 $this->assertIsFluent($this->builder->addDiscriminatorMapClass('test', 'Doctrine\Tests\Models\CMS\CmsUser'));
120 $this->assertIsFluent($this->builder->addDiscriminatorMapClass('test2', 'Doctrine\Tests\Models\CMS\CmsGroup'));
122 $this->assertEquals(array('test' => 'Doctrine\Tests\Models\CMS\CmsUser', 'test2' => 'Doctrine\Tests\Models\CMS\CmsGroup'), $this->cm->discriminatorMap);
123 $this->assertEquals('test', $this->cm->discriminatorValue);
126 public function testChangeTrackingPolicyExplicit()
128 $this->assertIsFluent($this->builder->setChangeTrackingPolicyDeferredExplicit());
129 $this->assertEquals(ClassMetadata::CHANGETRACKING_DEFERRED_EXPLICIT, $this->cm->changeTrackingPolicy);
132 public function testChangeTrackingPolicyNotify()
134 $this->assertIsFluent($this->builder->setChangeTrackingPolicyNotify());
135 $this->assertEquals(ClassMetadata::CHANGETRACKING_NOTIFY, $this->cm->changeTrackingPolicy);
138 public function testAddField()
140 $this->assertIsFluent($this->builder->addField('name', 'string'));
141 $this->assertEquals(array('columnName' => 'name', 'fieldName' => 'name', 'type' => 'string'), $this->cm->fieldMappings['name']);
144 public function testCreateField()
146 $fieldBuilder = ($this->builder->createField('name', 'string'));
147 $this->assertInstanceOf('Doctrine\ORM\Mapping\Builder\FieldBuilder', $fieldBuilder);
149 $this->assertFalse(isset($this->cm->fieldMappings['name']));
150 $this->assertIsFluent($fieldBuilder->build());
151 $this->assertEquals(array('columnName' => 'name', 'fieldName' => 'name', 'type' => 'string'), $this->cm->fieldMappings['name']);
154 public function testCreateVersionedField()
156 $this->builder->createField('name', 'integer')->columnName('username')->length(124)->nullable()->columnDefinition('foobar')->unique()->isVersionField()->build();
157 $this->assertEquals(array(
158 'columnDefinition' => 'foobar',
159 'columnName' => 'username',
161 'fieldName' => 'name',
166 ), $this->cm->fieldMappings['name']);
169 public function testCreatePrimaryField()
171 $this->builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build();
173 $this->assertEquals(array('id'), $this->cm->identifier);
174 $this->assertEquals(array('columnName' => 'id', 'fieldName' => 'id', 'id' => true, 'type' => 'integer'), $this->cm->fieldMappings['id']);
177 public function testAddLifecycleEvent()
179 $this->builder->addLifecycleEvent('getStatus', 'postLoad');
181 $this->assertEquals(array('postLoad' => array('getStatus')), $this->cm->lifecycleCallbacks);
184 public function testCreateManyToOne()
186 $this->assertIsFluent(
187 $this->builder->createManyToOne('groups', 'Doctrine\Tests\Models\CMS\CmsGroup')
188 ->addJoinColumn('group_id', 'id', true, false, 'CASCADE')
194 $this->assertEquals(array('groups' => array (
195 'fieldName' => 'groups',
196 'targetEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsGroup',
205 'joinColumns' => array (
208 'name' => 'group_id',
209 'referencedColumnName' => 'id',
212 'onDelete' => 'CASCADE',
213 'columnDefinition' => NULL,
218 'inversedBy' => NULL,
219 'isOwningSide' => true,
220 'sourceEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsUser',
221 'isCascadeRemove' => true,
222 'isCascadePersist' => true,
223 'isCascadeRefresh' => true,
224 'isCascadeMerge' => true,
225 'isCascadeDetach' => true,
226 'sourceToTargetKeyColumns' =>
230 'joinColumnFieldNames' =>
232 'group_id' => 'group_id',
234 'targetToSourceKeyColumns' =>
238 'orphanRemoval' => false,
240 ), $this->cm->associationMappings);
243 public function testCreateOneToOne()
245 $this->assertIsFluent(
246 $this->builder->createOneToOne('groups', 'Doctrine\Tests\Models\CMS\CmsGroup')
247 ->addJoinColumn('group_id', 'id', true, false, 'CASCADE')
253 $this->assertEquals(array('groups' => array (
254 'fieldName' => 'groups',
255 'targetEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsGroup',
264 'joinColumns' => array (
267 'name' => 'group_id',
268 'referencedColumnName' => 'id',
271 'onDelete' => 'CASCADE',
272 'columnDefinition' => NULL,
277 'inversedBy' => NULL,
278 'isOwningSide' => true,
279 'sourceEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsUser',
280 'isCascadeRemove' => true,
281 'isCascadePersist' => true,
282 'isCascadeRefresh' => true,
283 'isCascadeMerge' => true,
284 'isCascadeDetach' => true,
285 'sourceToTargetKeyColumns' =>
289 'joinColumnFieldNames' =>
291 'group_id' => 'group_id',
293 'targetToSourceKeyColumns' =>
297 'orphanRemoval' => false,
299 ), $this->cm->associationMappings);
302 public function testCreateManyToMany()
304 $this->assertIsFluent(
305 $this->builder->createManyToMany('groups', 'Doctrine\Tests\Models\CMS\CmsGroup')
306 ->setJoinTable('groups_users')
307 ->addJoinColumn('group_id', 'id', true, false, 'CASCADE')
308 ->addInverseJoinColumn('user_id', 'id')
314 $this->assertEquals(array(
317 'fieldName' => 'groups',
318 'targetEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsGroup',
334 'name' => 'group_id',
335 'referencedColumnName' => 'id',
338 'onDelete' => 'CASCADE',
339 'columnDefinition' => NULL,
342 'inverseJoinColumns' =>
347 'referencedColumnName' => 'id',
351 'columnDefinition' => NULL,
354 'name' => 'groups_users',
358 'inversedBy' => NULL,
359 'isOwningSide' => true,
360 'sourceEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsUser',
361 'isCascadeRemove' => true,
362 'isCascadePersist' => true,
363 'isCascadeRefresh' => true,
364 'isCascadeMerge' => true,
365 'isCascadeDetach' => true,
366 'isOnDeleteCascade' => true,
367 'relationToSourceKeyColumns' =>
371 'joinTableColumns' =>
376 'relationToTargetKeyColumns' =>
380 'orphanRemoval' => false,
382 ), $this->cm->associationMappings);
385 public function testCreateOneToMany()
387 $this->assertIsFluent(
388 $this->builder->createOneToMany('groups', 'Doctrine\Tests\Models\CMS\CmsGroup')
390 ->setOrderBy(array('test'))
395 $this->assertEquals(array(
398 'fieldName' => 'groups',
399 'targetEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsGroup',
400 'mappedBy' => 'test',
407 'inversedBy' => NULL,
408 'isOwningSide' => false,
409 'sourceEntity' => 'Doctrine\\Tests\\Models\\CMS\\CmsUser',
414 'isCascadeRemove' => false,
415 'isCascadePersist' => false,
416 'isCascadeRefresh' => false,
417 'isCascadeMerge' => false,
418 'isCascadeDetach' => false,
419 'orphanRemoval' => false,
421 ), $this->cm->associationMappings);
424 public function assertIsFluent($ret)
426 $this->assertSame($this->builder, $ret, "Return Value has to be same instance as used builder");