Completed
Push — master ( 33ec04...ed9cfc )
by Bart
11s
created

tests/unit/Converters/Models/CategoryGroupTest.php (1 issue)

mismatching argument types.

Documentation Minor

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace NerdsAndCompany\Schematic\Converters\Models;
4
5
use Craft;
6
use craft\models\CategoryGroup as CategoryGroupModel;
7
use craft\models\CategoryGroup_SiteSettings;
8
use craft\models\FieldLayout;
9
use craft\models\Site;
10
use Codeception\Test\Unit;
11
12
/**
13
 * Class CategoryGroupTest.
14
 *
15
 * @author    Nerds & Company
16
 * @copyright Copyright (c) 2015-2017, Nerds & Company
17
 * @license   MIT
18
 *
19
 * @see      http://www.nerds.company
20
 */
21
class CategoryGroupTest extends Unit
22
{
23
    /**
24
     * @var CategoryGroup
25
     */
26
    private $converter;
27
28
    /**
29
     * Set the converter.
30
     *
31
     * @SuppressWarnings(PHPMD.CamelCaseMethodName)
32
     */
33
    protected function _before()
34
    {
35
        $this->converter = new CategoryGroup();
36
    }
37
38
    //==============================================================================================================
39
    //=================================================  TESTS  ====================================================
40
    //==============================================================================================================
41
42
    /**
43
     * @dataProvider provideCategoryGroups
44
     *
45
     * @param CategoryGroupModel $group
46
     * @param array              $definition
47
     */
48
    public function testGetRecordDefinition(CategoryGroupModel $group, array $definition)
49
    {
50
        $result = $this->converter->getRecordDefinition($group);
51
52
        $this->assertSame($definition, $result);
53
    }
54
55
    /**
56
     * @dataProvider provideCategoryGroups
57
     *
58
     * @param CategoryGroupModel $group
59
     * @param array              $definition
60
     * @param Site|null          $site
61
     */
62
    public function testSetRecordAttributes(CategoryGroupModel $group, array $definition, $site)
63
    {
64
        $newGroup = $this->getMockBuilder(CategoryGroupModel::class)
65
                         ->setMethods(['setSiteSettings'])
66
                         ->getMock();
67
68
        $newGroup->expects($this->exactly(1))
69
                 ->method('setSiteSettings');
70
71
        Craft::$app->sites->expects($this->any())
72
                           ->method('getSiteByHandle')
73
                           ->willReturn($site);
74
75
        $this->converter->setRecordAttributes($newGroup, $definition, []);
0 ignored issues
show
$newGroup is of type object<PHPUnit\Framework\MockObject\MockObject>, but the function expects a object<craft\base\Model>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
76
77
        $this->assertSame($group->name, $newGroup->name);
78
        $this->assertSame($group->handle, $newGroup->handle);
79
    }
80
81
    /**
82
     * @dataProvider provideCategoryGroups
83
     *
84
     * @param CategoryGroupModel $group
85
     * @param array              $definition
86
     */
87
    public function testSaveRecord(CategoryGroupModel $group, array $definition)
88
    {
89
        Craft::$app->categories->expects($this->exactly(1))
90
                               ->method('saveGroup')
91
                               ->with($group)
92
                               ->willReturn(true);
93
94
        $result = $this->converter->saveRecord($group, $definition);
95
96
        $this->assertTrue($result);
97
    }
98
99
    /**
100
     * @dataProvider provideCategoryGroups
101
     *
102
     * @param CategoryGroupModel $group
103
     */
104
    public function testDeleteRecord(CategoryGroupModel $group)
105
    {
106
        Craft::$app->categories->expects($this->exactly(1))
107
                               ->method('deleteGroupById')
108
                               ->with($group->id);
109
110
        $this->converter->deleteRecord($group);
111
    }
112
113
    //==============================================================================================================
114
    //==============================================  PROVIDERS  ===================================================
115
    //==============================================================================================================
116
117
    /**
118
     * @return array
119
     */
120
    public function provideCategoryGroups()
121
    {
122
        $mockCategoryGroup = $this->getMockCategoryGroup(1);
123
124
        return [
125
            'category group with site' => [
126
                'group' => $mockCategoryGroup,
127
                'definition' => $this->getMockCategoryGroupDefinition($mockCategoryGroup),
128
                'site' => $this->getMockSite(),
129
            ],
130
            'category group without site' => [
131
                'group' => $mockCategoryGroup,
132
                'definition' => $this->getMockCategoryGroupDefinition($mockCategoryGroup),
133
                'site' => null,
134
            ],
135
        ];
136
    }
137
138
    //==============================================================================================================
139
    //================================================  HELPERS  ===================================================
140
    //==============================================================================================================
141
142
    /**
143
     * @param CategoryGroupModel $mockCategoryGroup
144
     *
145
     * @return array
146
     */
147
    private function getMockCategoryGroupDefinition(CategoryGroupModel $mockCategoryGroup)
148
    {
149
        return [
150
            'class' => get_class($mockCategoryGroup),
151
            'attributes' => [
152
                'name' => $mockCategoryGroup->name,
153
                'handle' => $mockCategoryGroup->handle,
154
                'maxLevels' => 3,
155
            ],
156
            'fieldLayout' => [
157
                'fields' => [],
158
            ],
159
            'siteSettings' => [
160
                '' => [
161
                    'class' => get_class($mockCategoryGroup->getSiteSettings()[0]),
162
                    'attributes' => [
163
                        'hasUrls' => null,
164
                        'uriFormat' => null,
165
                        'template' => null,
166
                    ],
167
                ],
168
            ],
169
        ];
170
    }
171
172
    /**
173
     * @param int $groupId
174
     *
175
     * @return Mock|CategoryGroupModel
176
     */
177
    private function getMockCategoryGroup(int $groupId)
178
    {
179
        $mockGroup = $this->getMockBuilder(CategoryGroupModel::class)
180
                                    ->setMethods(['getFieldLayout', 'getSiteSettings'])
181
                                    ->getMock();
182
        $mockGroup->setAttributes([
183
            'id' => $groupId,
184
            'fieldLayoutId' => $groupId,
185
            'handle' => 'groupHandle'.$groupId,
186
            'name' => 'groupName'.$groupId,
187
            'maxLevels' => 3,
188
        ]);
189
190
        $mockFieldLayout = $this->getMockBuilder(FieldLayout::class)->getMock();
191
192
        $mockGroup->expects($this->any())
193
                  ->method('getFieldLayout')
194
                  ->willReturn($mockFieldLayout);
195
196
        $mockSiteSettings = $this->getMockSiteSettings();
197
198
        $mockGroup->expects($this->any())
199
                  ->method('getSiteSettings')
200
                  ->willReturn([$mockSiteSettings]);
201
202
        return $mockGroup;
203
    }
204
205
    /**
206
     * Get mock siteSettings.
207
     *
208
     * @param string $class
209
     *
210
     * @return Mock|CategoryGroup_SiteSettings
211
     */
212
    private function getMockSiteSettings()
213
    {
214
        $mockSiteSettings = $this->getMockBuilder(CategoryGroup_SiteSettings::class)
215
                                 ->setMethods(['getSite'])
216
                                 ->getMock();
217
218
        $mockSiteSettings->expects($this->any())
219
          ->method('getSite')
220
          ->willReturn($this->getMockSite());
221
222
        return $mockSiteSettings;
223
    }
224
225
    /**
226
     * Get a mock site.
227
     *
228
     * @return Mock|Site
229
     */
230
    private function getMockSite()
231
    {
232
        return $this->getMockBuilder(Site::class)->getMock();
233
    }
234
}
235