Completed
Pull Request — 3.x (#807)
by
unknown
01:55
created

ShowBuilderTest::testAddFieldWithType()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 32
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 32
rs 8.8571
cc 1
eloc 20
nc 1
nop 0
1
<?php
2
3
/*
4
 * This file is part of the Sonata Project package.
5
 *
6
 * (c) Thomas Rabaix <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sonata\DoctrineORMAdminBundle\Tests\Builder;
13
14
use Doctrine\ORM\Mapping\ClassMetadata;
15
use PHPUnit\Framework\TestCase;
16
use Sonata\AdminBundle\Admin\AdminInterface;
17
use Sonata\AdminBundle\Admin\FieldDescriptionCollection;
18
use Sonata\AdminBundle\Admin\FieldDescriptionInterface;
19
use Sonata\AdminBundle\Guesser\TypeGuesserInterface;
20
use Sonata\DoctrineORMAdminBundle\Builder\ShowBuilder;
21
use Sonata\DoctrineORMAdminBundle\Model\ModelManager;
22
use Symfony\Component\Form\Guess\TypeGuess;
23
24
/**
25
 * @author Marko Kunic <[email protected]>
26
 */
27
class ShowBuilderTest extends TestCase
28
{
29
    private $guesser;
30
    private $showBuilder;
31
32
    public function setUp()
33
    {
34
        $this->guesser = $this->prophesize(TypeGuesserInterface::class);
35
36
        $this->showBuilder = new ShowBuilder(
37
            $this->guesser->reveal(),
38
            ['fakeTemplate' => 'fake']
39
        );
40
    }
41
42
    public function testGetBaseList()
43
    {
44
        $this->assertInstanceOf(FieldDescriptionCollection::class, $this->showBuilder->getBaseList());
45
    }
46
47
    public function testAddFieldNoType()
48
    {
49
        $fieldDescriptionCollection = $this->prophesize(FieldDescriptionCollection::class);
50
        $fieldDescription = $this->prophesize(FieldDescriptionInterface::class);
51
        $admin = $this->prophesize(AdminInterface::class);
52
        $modelManager = $this->prophesize(ModelManager::class);
53
        $typeGuess = $this->prophesize(TypeGuess::class);
54
55
        $admin->getClass()->willReturn($adminClassReturn = 'FakeClass')->shouldBeCalledTimes(2);
56
57
        $fieldDescription->getName()->willReturn($fieldDescriptionNameReturn = 'FakeName')
58
            ->shouldBeCalledTimes(4);
59
60
        $admin->getModelManager()->willReturn($modelManager->reveal())->shouldBeCalledTimes(2);
61
62
        $typeGuess->getType()->willReturn($typeGuessReturn = 'fakeType')->shouldBeCalledTimes(1);
63
64
        $this->guesser->guessType($adminClassReturn, $fieldDescriptionNameReturn, $modelManager)
65
            ->willReturn($typeGuess)
66
            ->shouldBeCalledTimes(1);
67
68
        $fieldDescription->setType($typeGuessReturn)->shouldBeCalledTimes(1);
69
70
        $fieldDescription->setAdmin($admin)->shouldBeCalledTimes(1);
71
72
        $modelManager->hasMetadata($adminClassReturn)->willReturn(false)->shouldBeCalledTimes(1);
73
74
        $fieldDescription->getType()->willReturn(true)->shouldBeCalledTimes(1);
75
76
        $fieldDescription->setOption('code', $fieldDescriptionNameReturn)->shouldBeCalledTimes(1);
77
        $fieldDescription->setOption('label', $fieldDescriptionNameReturn)->shouldBeCalledTimes(1);
78
79
        $fieldDescription->getOption('code', $fieldDescriptionNameReturn)
80
            ->willReturn($fieldDescriptionNameReturn)
81
            ->shouldBeCalledTimes(1);
82
83
        $fieldDescription->getOption('label', $fieldDescriptionNameReturn)
84
            ->willReturn($fieldDescriptionNameReturn)
85
            ->shouldBeCalledTimes(1);
86
87
        $fieldDescription->getTemplate()->willReturn(true)->shouldBeCalledTimes(1);
88
89
        $fieldDescription->getMappingType()->willReturn(ClassMetadata::MANY_TO_ONE)->shouldBeCalledTimes(1);
90
91
        $admin->attachAdminClass($fieldDescription)->shouldBeCalledTimes(1);
92
93
        $admin->addShowFieldDescription($fieldDescriptionNameReturn, $fieldDescription)
94
            ->shouldBeCalledTimes(1);
95
96
        $fieldDescriptionCollection->add($fieldDescription)->shouldBeCalledTimes(1);
97
98
        $this->showBuilder->addField(
99
            $fieldDescriptionCollection->reveal(),
100
            null,
101
            $fieldDescription->reveal(),
102
            $admin->reveal()
103
        );
104
    }
105
106
    public function testAddFieldWithType()
107
    {
108
        $fieldDescriptionCollection = $this->prophesize(FieldDescriptionCollection::class);
109
        $fieldDescription = $this->prophesize(FieldDescriptionInterface::class);
110
        $admin = $this->prophesize(AdminInterface::class);
111
        $modelManager = $this->prophesize(ModelManager::class);
112
113
        $admin->getClass()->willReturn($adminClassReturn = 'FakeClass')->shouldBeCalledTimes(1);
114
115
        $fieldDescription->getName()->willReturn($fieldDescriptionNameReturn = 'FakeName')
116
            ->shouldBeCalledTimes(1);
117
118
        $admin->getModelManager()->willReturn($modelManager->reveal())->shouldBeCalledTimes(1);
119
120
        $fieldDescription->setType($type = 'someType')->shouldBeCalledTimes(1);
121
        $fieldDescription->setAdmin($admin)->shouldBeCalledTimes(1);
122
123
        $fieldDescription->setAdmin($admin)->shouldBeCalledTimes(1);
124
125
        $modelManager->hasMetadata($adminClassReturn)->willReturn(false)->shouldBeCalledTimes(1);
126
127
        $fieldDescription->getType()->willReturn(false)->shouldBeCalledTimes(1);
128
129
        $this->expectException(\RuntimeException::class);
130
131
        $this->showBuilder->addField(
132
            $fieldDescriptionCollection->reveal(),
133
            $type,
134
            $fieldDescription->reveal(),
135
            $admin->reveal()
136
        );
137
    }
138
139
    /**
140
     * @dataProvider testFixFieldDescriptionData
141
     */
142
    public function testFixFieldDescription($mappingType, $template)
143
    {
144
        $fieldDescription = $this->prophesize(FieldDescriptionInterface::class);
145
        $admin = $this->prophesize(AdminInterface::class);
146
        $modelManager = $this->prophesize(ModelManager::class);
147
        $classMetadata = $this->prophesize(ClassMetadata::class);
148
149
        $fieldDescription->setAdmin($admin)->shouldBeCalledTimes(1);
150
151
        $admin->getClass()->willReturn($adminClassReturn = 'FakeClass')->shouldBeCalledTimes(2);
152
        $modelManager->hasMetadata($adminClassReturn)->willReturn(true)->shouldBeCalledTimes(1);
153
        $admin->getModelManager()->willReturn($modelManager->reveal())->shouldBeCalledTimes(2);
154
155
        $fieldDescription->getName()->willReturn($fieldDescriptionNameReturn = 'FakeName')
156
            ->shouldBeCalledTimes(3);
157
        $modelManager->getParentMetadataForProperty($adminClassReturn, $fieldDescriptionNameReturn)
158
            ->willReturn([$classMetadata, 2, $parentAssociationMapping = []])
159
            ->shouldBeCalledTimes(1);
160
161
        $fieldDescription->setParentAssociationMappings($parentAssociationMapping)->shouldBeCalledTimes(1);
162
163
        $classMetadata->fieldMappings = [2 => $fieldMapping = 'test'];
164
        $fieldDescription->setFieldMapping($fieldMapping)->shouldBeCalledTimes(1);
165
166
        $classMetadata->associationMappings = [2 => $associationMapping = 'test'];
167
        $fieldDescription->setAssociationMapping($associationMapping)->shouldBeCalledTimes(1);
168
169
        $fieldDescription->getType()->willReturn('test')->shouldBeCalledTimes(2);
170
171
        $fieldDescription->setOption('code', $fieldDescriptionNameReturn)->shouldBeCalledTimes(1);
172
        $fieldDescription->setOption('label', $fieldDescriptionNameReturn)->shouldBeCalledTimes(1);
173
        $fieldDescription->getOption('code', $fieldDescriptionNameReturn)
174
            ->willReturn($fieldDescriptionNameReturn)->shouldBeCalledTimes(1);
175
        $fieldDescription->getOption('label', $fieldDescriptionNameReturn)
176
            ->willReturn($fieldDescriptionNameReturn)->shouldBeCalledTimes(1);
177
178
        $fieldDescription->getTemplate()->willReturn(false)->shouldBeCalledTimes(2);
179
        $fieldDescription->setTemplate(null)->shouldBeCalledTimes(1);
180
181
        $fieldDescription->getMappingType()->willReturn($mappingType)->shouldBeCalledTimes(2);
182
183
        $fieldDescription->setTemplate($template)
184
            ->shouldBeCalledTimes(1);
185
186
        $admin->attachAdminClass($fieldDescription)->shouldBeCalledTimes(1);
187
188
        $this->showBuilder->fixFieldDescription($admin->reveal(), $fieldDescription->reveal());
189
    }
190
191
    public function testFixFieldDescriptionData()
192
    {
193
        return [
194
            [
195
                ClassMetadata::ONE_TO_ONE,
196
                '@SonataAdmin/CRUD/Association/show_one_to_one.html.twig',
197
            ],
198
            [
199
                ClassMetadata::MANY_TO_ONE,
200
                '@SonataAdmin/CRUD/Association/show_many_to_one.html.twig',
201
            ],
202
            [
203
                ClassMetadata::ONE_TO_MANY,
204
                '@SonataAdmin/CRUD/Association/show_one_to_many.html.twig',
205
            ],
206
            [
207
                ClassMetadata::MANY_TO_MANY,
208
                '@SonataAdmin/CRUD/Association/show_many_to_many.html.twig',
209
            ],
210
        ];
211
    }
212
}
213