Completed
Pull Request — 3.x (#387)
by
unknown
01:23
created

testFixFieldDescriptionWithAssociationMapping()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 31
rs 9.424
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Sonata\DoctrineMongoDBAdminBundle\Tests\Builder;
15
16
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
17
use PHPUnit\Framework\MockObject\MockObject;
18
use PHPUnit\Framework\TestCase;
19
use Sonata\AdminBundle\Admin\AdminInterface;
20
use Sonata\AdminBundle\Admin\FieldDescriptionCollection;
21
use Sonata\AdminBundle\Datagrid\Datagrid;
22
use Sonata\AdminBundle\Datagrid\DatagridInterface;
23
use Sonata\AdminBundle\Datagrid\Pager;
24
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
25
use Sonata\AdminBundle\Filter\FilterFactoryInterface;
26
use Sonata\AdminBundle\Guesser\TypeGuesserInterface;
27
use Sonata\AdminBundle\Translator\FormLabelTranslatorStrategy;
28
use Sonata\DoctrineMongoDBAdminBundle\Admin\FieldDescription;
29
use Sonata\DoctrineMongoDBAdminBundle\Builder\DatagridBuilder;
30
use Sonata\DoctrineMongoDBAdminBundle\Filter\ModelFilter;
31
use Sonata\DoctrineMongoDBAdminBundle\Model\ModelManager;
32
use Symfony\Component\Form\FormBuilderInterface;
33
use Symfony\Component\Form\FormFactoryInterface;
34
use Symfony\Component\Form\Guess\Guess;
35
use Symfony\Component\Form\Guess\TypeGuess;
36
37
final class DatagridBuilderTest extends TestCase
38
{
39
    /**
40
     * @var DatagridBuilder
41
     */
42
    private $datagridBuilder;
43
44
    /**
45
     * @var MockObject&TypeGuesserInterface
46
     */
47
    private $typeGuesser;
48
49
    /**
50
     * @var MockObject&FormFactoryInterface
51
     */
52
    private $formFactory;
53
54
    /**
55
     * @var MockObject&FilterFactoryInterface
56
     */
57
    private $filterFactory;
58
59
    /**
60
     * @var MockObject&AdminInterface
61
     */
62
    private $admin;
63
64
    /**
65
     * @var MockObject&ModelManager
66
     */
67
    private $modelManager;
68
69
    protected function setUp(): void
70
    {
71
        $this->formFactory = $this->createStub(FormFactoryInterface::class);
72
        $this->filterFactory = $this->createMock(FilterFactoryInterface::class);
73
        $this->typeGuesser = $this->createStub(TypeGuesserInterface::class);
74
75
        $this->datagridBuilder = new DatagridBuilder(
76
            $this->formFactory,
77
            $this->filterFactory,
78
            $this->typeGuesser
79
        );
80
81
        $this->admin = $this->createMock(AdminInterface::class);
82
        $this->modelManager = $this->createMock(ModelManager::class);
83
84
        $this->admin
85
            ->method('getClass')
86
            ->willReturn('FakeClass');
87
        $this->admin
88
            ->method('getModelManager')
89
            ->willReturn($this->modelManager);
90
    }
91
92
    public function testGetBaseDatagrid(): void
93
    {
94
        $proxyQuery = $this->createStub(ProxyQueryInterface::class);
95
        $fieldDescription = $this->createStub(FieldDescriptionCollection::class);
96
        $formBuilder = $this->createStub(FormBuilderInterface::class);
97
98
        $this->admin->method('createQuery')->willReturn($proxyQuery);
99
        $this->admin->method('getList')->willReturn($fieldDescription);
100
101
        $this->modelManager->method('getIdentifierFieldNames')->willReturn(['id']);
102
103
        $this->formFactory->method('createNamedBuilder')->willReturn($formBuilder);
104
105
        $this->assertInstanceOf(
106
            Datagrid::class,
107
            $datagrid = $this->datagridBuilder->getBaseDatagrid($this->admin)
108
        );
109
        $this->assertInstanceOf(Pager::class, $datagrid->getPager());
110
    }
111
112
    public function testFixFieldDescription(): void
113
    {
114
        $fieldMapping = [
115
            'fieldName' => 'plainField',
116
            'name' => 'plainField',
117
            'columnName' => 'plainField',
118
            'type' => 'string',
119
        ];
120
121
        $classMetadata = $this->createMock(ClassMetadata::class);
122
        $classMetadata->fieldMappings = [
123
            'plainField' => $fieldMapping,
124
        ];
125
126
        $fieldDescription = new FieldDescription();
127
        $fieldDescription->setName('plainField');
128
129
        $this->modelManager->method('hasMetadata')->willReturn(true);
130
131
        $this->modelManager
132
            ->expects($this->once())
133
            ->method('getParentMetadataForProperty')
134
            ->willReturn([$classMetadata, 'plainField', $parentAssociationMapping = []]);
135
136
        $this->datagridBuilder->fixFieldDescription($this->admin, $fieldDescription);
137
138
        $this->assertSame($fieldMapping, $fieldDescription->getOption('field_mapping'));
139
        $this->assertTrue($fieldDescription->getOption('global_search'));
140
    }
141
142
    public function testFixFieldDescriptionWithAssociationMapping(): void
143
    {
144
        $associationMapping = [
145
            'fieldName' => 'associatedDocument',
146
            'name' => 'associatedDocument',
147
        ];
148
        $classMetadata = $this->createMock(ClassMetadata::class);
149
150
        $classMetadata->associationMappings = [
151
            'associatedDocument' => $associationMapping,
152
        ];
153
154
        $fieldDescription = new FieldDescription();
155
        $fieldDescription->setName('associatedDocument');
156
        $fieldDescription->setMappingType(ClassMetadata::ONE);
157
158
        $this->admin
159
            ->expects($this->once())
160
            ->method('attachAdminClass');
161
162
        $this->modelManager->method('hasMetadata')->willReturn(true);
163
164
        $this->modelManager
165
            ->expects($this->once())
166
            ->method('getParentMetadataForProperty')
167
            ->willReturn([$classMetadata, 'associatedDocument', $parentAssociationMapping = []]);
168
169
        $this->datagridBuilder->fixFieldDescription($this->admin, $fieldDescription);
170
171
        $this->assertSame($associationMapping, $fieldDescription->getOption('association_mapping'));
172
    }
173
174
    public function testAddFilterNoType(): void
175
    {
176
        $this->admin
177
            ->expects($this->once())
178
            ->method('addFilterFieldDescription');
179
180
        $datagrid = $this->createMock(DatagridInterface::class);
181
        $guessType = new TypeGuess(ModelFilter::class, [
182
            'guess_option' => 'guess_value',
183
            'guess_array_option' => [
184
                'guess_array_value',
185
            ],
186
        ], Guess::VERY_HIGH_CONFIDENCE);
187
188
        $fieldDescription = new FieldDescription();
189
        $fieldDescription->setName('test');
190
191
        $this->typeGuesser->method('guessType')->willReturn($guessType);
192
193
        $this->modelManager
194
            ->expects($this->once())
195
            ->method('hasMetadata')->willReturn(false);
196
197
        $this->admin->method('getCode')->willReturn('someFakeCode');
198
199
        $this->filterFactory->method('create')->willReturn(new ModelFilter());
200
201
        $this->admin->method('getLabelTranslatorStrategy')->willReturn(new FormLabelTranslatorStrategy());
202
203
        $datagrid
204
            ->expects($this->once())
205
            ->method('addFilter')
206
            ->with($this->isInstanceOf(ModelFilter::class));
207
208
        $this->filterFactory
209
            ->expects($this->once())
210
            ->method('create')
211
            ->with('test', ModelFilter::class);
212
213
        $this->datagridBuilder->addFilter(
214
            $datagrid,
215
            null,
216
            $fieldDescription,
217
            $this->admin
218
        );
219
220
        $this->assertSame('guess_value', $fieldDescription->getOption('guess_option'));
221
        $this->assertSame(['guess_array_value'], $fieldDescription->getOption('guess_array_option'));
222
    }
223
224
    public function testAddFilterWithType(): void
225
    {
226
        $this->admin
227
            ->expects($this->once())
228
            ->method('addFilterFieldDescription');
229
230
        $datagrid = $this->createMock(DatagridInterface::class);
231
232
        $fieldDescription = new FieldDescription();
233
        $fieldDescription->setName('test');
234
235
        $this->filterFactory->method('create')->willReturn(new ModelFilter());
236
237
        $this->admin->method('getLabelTranslatorStrategy')->willReturn(new FormLabelTranslatorStrategy());
238
239
        $datagrid
240
            ->expects($this->once())
241
            ->method('addFilter')
242
            ->with($this->isInstanceOf(ModelFilter::class));
243
244
        $this->datagridBuilder->addFilter(
245
            $datagrid,
246
            ModelFilter::class,
247
            $fieldDescription,
248
            $this->admin
249
        );
250
251
        $this->assertSame(ModelFilter::class, $fieldDescription->getType());
252
    }
253
}
254