Completed
Push — do-not-scrutinize-tests ( fcf005 )
by Bart
04:15 queued 02:38
created

GlobalSetsTest::getMockGlobalSetDefinition()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 25
rs 8.8571
c 0
b 0
f 0
cc 2
eloc 18
nc 2
nop 1
1
<?php
2
3
namespace NerdsAndCompany\Schematic\Converters\Elements;
4
5
use Craft;
6
use craft\elements\GlobalSet as GlobalSetElement;
7
use craft\base\Field;
8
use yii\base\Behavior;
9
use craft\models\FieldLayout;
10
use craft\models\Site;
11
use craft\services\Fields;
12
use Codeception\Test\Unit;
13
14
/**
15
 * Class GlobalSetTest.
16
 *
17
 * @author    Nerds & Company
18
 * @copyright Copyright (c) 2015-2017, Nerds & Company
19
 * @license   MIT
20
 *
21
 * @see      http://www.nerds.company
22
 */
23
class GlobalSetsTest extends Unit
24
{
25
    /**
26
     * @var GlobalSet
27
     */
28
    private $converter;
29
30
    /**
31
     * Set the converter.
32
     *
33
     * @SuppressWarnings(PHPMD.CamelCaseMethodName)
34
     * phpcs:disable PSR2.Methods.MethodDeclaration.Underscore
35
     */
36
    protected function _before()
37
    {
38
        $this->converter = new GlobalSet();
39
    }
40
41
    //==============================================================================================================
42
    //=================================================  TESTS  ====================================================
43
    //==============================================================================================================
44
45
    /**
46
     * @dataProvider provideGlobalSets
47
     *
48
     * @param GlobalSetElement $set
49
     * @param array            $definition
50
     */
51
    public function testGetRecordDefinition(GlobalSetElement $set, array $definition)
52
    {
53
        $result = $this->converter->getRecordDefinition($set);
54
55
        $this->assertSame($definition, $result);
56
    }
57
58
    /**
59
     * @dataProvider provideGlobalSets
60
     *
61
     * @param GlobalSetElement $set
62
     * @param array            $definition
63
     * @param bool             $valid
64
     */
65
    public function testSaveRecord(GlobalSetElement $set, array $definition, bool $valid)
66
    {
67
        Craft::$app->sites->expects($this->any())
68
                ->method('getSiteByHandle')
69
                ->willReturnMap([
70
                  ['default', $this->getMockSite()],
71
                  ['invalid', null],
72
                ]);
73
74
        Craft::$app->globals->expects($this->exactly($valid ? 1 : 0))
75
                            ->method('saveSet')
76
                            ->with($set)
77
                            ->willReturn(true);
78
79
        $result = $this->converter->saveRecord($set, $definition);
80
81
        $this->assertSame($valid, $result);
82
    }
83
84
    /**
85
     * @dataProvider provideGlobalSets
86
     *
87
     * @param GlobalSetElement $set
88
     */
89
    public function testDeleteRecord(GlobalSetElement $set)
90
    {
91
        Craft::$app->elements->expects($this->exactly(1))
92
                             ->method('deleteElementById')
93
                             ->with($set->id);
94
95
        $this->converter->deleteRecord($set);
96
    }
97
98
    //==============================================================================================================
99
    //==============================================  PROVIDERS  ===================================================
100
    //==============================================================================================================
101
102
    /**
103
     * @return array
104
     */
105
    public function provideGlobalSets()
106
    {
107
        $mockGlobalSet1 = $this->getMockGlobalSet(1);
108
        $mockGlobalSet2 = $this->getMockGlobalSet(1, 'invalid');
109
110
        return [
111
            'Valid set' => [
112
                'set' => $mockGlobalSet1,
113
                'definition' => $this->getMockGlobalSetDefinition($mockGlobalSet1),
114
                'validSave' => true,
115
            ],
116
            'Invalid set' => [
117
                'set' => $mockGlobalSet2,
118
                'definition' => $this->getMockGlobalSetDefinition($mockGlobalSet2),
119
                'validSave' => false,
120
            ],
121
        ];
122
    }
123
124
    //==============================================================================================================
125
    //================================================  HELPERS  ===================================================
126
    //==============================================================================================================
127
128
    /**
129
     * @param GlobalSet $mockGlobalSet
130
     *
131
     * @return array
132
     */
133
    private function getMockGlobalSetDefinition(GlobalSetElement $mockGlobalSet)
134
    {
135
        $fieldDefs = [];
136
        foreach ($mockGlobalSet->getFieldLayout()->getFields() as $field) {
137
            $fieldDefs[$field->handle] = $field->required;
138
        }
139
140
        return [
141
            'class' => get_class($mockGlobalSet),
142
            'attributes' => [
143
                'name' => $mockGlobalSet->name,
144
                'handle' => $mockGlobalSet->handle,
145
                'enabled' => true,
146
                'archived' => false,
147
                'enabledForSite' => true,
148
                'title' => null,
149
                'slug' => null,
150
                'uri' => null,
151
            ],
152
            'fieldLayout' => [
153
                'fields' => $fieldDefs,
154
            ],
155
            'site' => $mockGlobalSet->getSite()->handle,
156
        ];
157
    }
158
159
    /**
160
     * @param int    $setId
161
     * @param string $siteHandle
162
     *
163
     * @return Mock|GlobalSet
164
     */
165
    private function getMockGlobalSet(int $setId, string $siteHandle = 'default')
166
    {
167
        $mockSet = $this->getMockBuilder(GlobalSetElement::class)
168
                                    ->setMethods([
169
                                        '__isset',
170
                                        'getSite',
171
                                        'getFieldLayout',
172
                                        'fieldByHandle',
173
                                        'getBehavior',
174
                                        'behaviors',
175
                                    ])
176
                                    ->disableOriginalConstructor()
177
                                    ->getMock();
178
179
        $mockSet->id = $setId;
180
        $mockSet->fieldLayoutId = $setId;
181
        $mockSet->handle = 'setHandle'.$setId;
182
        $mockSet->name = 'setName'.$setId;
183
184
        $mockBehavior = $this->getMockbuilder(Behavior::class)->getMock();
185
186
        $mockBehavior->expects($this->any())
187
                     ->method('canGetProperty')
188
                     ->willReturn(true);
189
190
        $mockSet->expects($this->any())
191
                ->method('behaviors')
192
                ->willReturn([$mockBehavior]);
193
194
        $mockSet->expects($this->any())
195
                ->method('getBehavior')
196
                ->willReturn($mockBehavior);
197
198
        $mockSet->expects($this->any())
199
                ->method('getSite')
200
                ->willReturn($this->getMockSite($siteHandle));
201
202
        $mockField = $this->getMockbuilder(Field::class)->getMock();
203
        $mockField->id = $setId;
204
        $mockField->handle = 'field'.$setId;
205
        $mockField->required = false;
206
207
        $mockSet->expects($this->any())
208
                ->method('fieldByHandle')
209
                ->willReturn($mockField);
210
211
        $mockFieldLayout = $this->getMockBuilder(FieldLayout::class)->getMock();
212
213
        $mockFieldLayout->expects($this->any())
214
                        ->method('getFields')
215
                        ->willReturn([$mockField]);
216
217
        $mockSet->expects($this->any())
218
                  ->method('getFieldLayout')
219
                  ->willReturn($mockFieldLayout);
220
221
        return $mockSet;
222
    }
223
224
    /**
225
     * Get a mock site.
226
     *
227
     * @param string $handle
228
     *
229
     * @return Mock|Site
230
     */
231
    private function getMockSite(string $handle = 'default')
232
    {
233
        $mockSite = new Site([
234
            'id' => 99,
235
            'handle' => $handle,
236
        ]);
237
238
        return $mockSite;
239
    }
240
}
241