Completed
Pull Request — master (#55)
by Bart
04:31
created

PluginsTest::getMockMigrationsService()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 1
eloc 4
nc 1
nop 0
1
<?php
2
3
namespace NerdsAndCompany\Schematic\Services;
4
5
use Craft\Craft;
6
use Craft\BaseTest;
7
use Craft\Exception;
8
use Craft\PluginsService;
9
use Craft\UpdatesService;
10
use Craft\BasePlugin;
11
use NerdsAndCompany\Schematic\Models\Result;
12
use PHPUnit_Framework_MockObject_MockObject as Mock;
13
14
/**
15
 * Class PluginsTest.
16
 *
17
 * @author    Nerds & Company
18
 * @copyright Copyright (c) 2015-2016, Nerds & Company
19
 * @license   MIT
20
 *
21
 * @link      http://www.nerds.company
22
 *
23
 * @coversDefaultClass NerdsAndCompany\Schematic\Services\Plugins
24
 * @covers ::__construct
25
 * @covers ::<!public>
26
 */
27
class PluginsTest extends BaseTest
28
{
29
    /**
30
     * @var Plugins
31
     */
32
    private $schematicPluginsService;
33
34
    /**
35
     * @var string
36
     */
37
    private $pluginHandle;
38
39
    /**
40
     * {@inheritdoc}
41
     */
42
    public function setUp()
43
    {
44
        $this->schematicPluginsService = new Plugins();
45
    }
46
47
    /**
48
     * Prevent code duplication by mocking multiple services.
49
     *
50
     * @param bool $returnPlugin
51
     * @param bool $installPluginResponse
52
     */
53
    public function mockMultipleServices(
54
        $returnPlugin = true,
55
        $installPluginResponse = true
56
    ) {
57
        $mockPluginsService = $this->getMockPluginsService($returnPlugin, $installPluginResponse);
58
        $this->setComponent(Craft::app(), 'plugins', $mockPluginsService);
59
        $mockUpdatesService = $this->getMockUpdatesService();
60
        $this->setComponent(Craft::app(), 'updates', $mockUpdatesService);
61
    }
62
63
    /**
64
     * @param bool $returnPlugin
65
     * @param bool $installPluginResponse
66
     * @param bool $enablePluginResponse
67
     * @param bool $disablePluginResponse
68
     * @param bool $uninstallPluginResponse
69
     *
70
     * @return PluginsService|Mock
71
     */
72
    public function getMockPluginsService(
73
        $returnPlugin = true,
74
        $installPluginResponse = true,
75
        $enablePluginResponse = true,
76
        $disablePluginResponse = true,
77
        $uninstallPluginResponse = true
78
    ) {
79
        $mock = $this->getMockBuilder(PluginsService::class)->getMock();
80
81
        $mock->expects($this->any())->method('getPlugin')->willReturn(($returnPlugin) ? $this->getMockBasePlugin() : null);
82
83
        if ($installPluginResponse) {
84
            $mock->expects($this->any())->method('installPlugin')->willReturn($installPluginResponse);
85
        } else {
86
            $mock->expects($this->any())->method('installPlugin')->willThrowException(new Exception());
87
        }
88
89
        $mock->expects($this->any())->method('enablePlugin')->willReturn($enablePluginResponse);
90
        $mock->expects($this->any())->method('disablePlugin')->willReturn($disablePluginResponse);
91
        $mock->expects($this->any())->method('uninstallPlugin')->willReturn($uninstallPluginResponse);
92
93
        return $mock;
94
    }
95
96
    /**
97
     * @return UpdatesService|Mock
98
     */
99
    public function getMockUpdatesService()
100
    {
101
        $mock = $this->getMockBuilder(UpdatesService::class)->getMock();
102
        $mock->expects($this->any())->method('updateDatabase')->willReturn(array('success' => true));
103
104
        return $mock;
105
    }
106
107
    /**
108
     * @return Mock|BasePlugin
109
     */
110
    public function getMockBasePlugin()
111
    {
112
        $mock = $this->getMockBuilder(BasePlugin::class)->getMock();
113
114
        $this->pluginHandle = get_class($mock);
115
116
        return $mock;
117
    }
118
119
    /**
120
     * Test default import functionality.
121
     *
122
     * @covers ::import
123
     */
124 View Code Duplication
    public function testImportWithInstalledPlugins()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
125
    {
126
        $data = $this->getPluginsData();
127
128
        $this->mockMultipleServices();
129
130
        $import = $this->schematicPluginsService->import($data);
131
132
        $this->assertTrue($import instanceof Result);
133
        $this->assertFalse($import->hasErrors());
134
    }
135
136
    /**
137
     * Test default import functionality.
138
     *
139
     * @covers ::import
140
     */
141 View Code Duplication
    public function testImportWithInstalledDisabledPlugins()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
142
    {
143
        $this->getMockBasePlugin();
144
145
        $data = $this->getPluginsData();
146
        $data[$this->pluginHandle]['isEnabled'] = false;
147
148
        $this->mockMultipleServices();
149
150
        $import = $this->schematicPluginsService->import($data);
151
152
        $this->assertTrue($import instanceof Result);
153
        $this->assertFalse($import->hasErrors());
154
    }
155
156
    /**
157
     * Test default import functionality.
158
     *
159
     * @covers ::import
160
     */
161 View Code Duplication
    public function testImportWithMissingPlugin()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
162
    {
163
        $data = $this->getPluginsData();
164
165
        $this->mockMultipleServices(false);
166
167
        $import = $this->schematicPluginsService->import($data);
168
169
        $this->assertTrue($import instanceof Result);
170
        $this->assertTrue($import->hasErrors());
171
    }
172
173
    /**
174
     * Test default import functionality.
175
     *
176
     * @covers ::import
177
     */
178 View Code Duplication
    public function testImportWithInstallException()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
179
    {
180
        $data = $this->getPluginsData();
181
182
        $this->mockMultipleServices(true, false);
183
184
        $import = $this->schematicPluginsService->import($data);
185
186
        $this->assertTrue($import instanceof Result);
187
        $this->assertTrue($import->hasErrors());
188
    }
189
190
    /**
191
     * Test default import functionality.
192
     *
193
     * @covers ::import
194
     */
195 View Code Duplication
    public function testImportWithNotInstalledPlugin()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
196
    {
197
        $this->mockMultipleServices();
198
199
        $this->getMockBasePlugin();
200
201
        $data = $this->getPluginsData();
202
        $data[$this->pluginHandle]['isInstalled'] = false;
203
204
        $import = $this->schematicPluginsService->import($data);
205
206
        $this->assertTrue($import instanceof Result);
207
        $this->assertFalse($import->hasErrors());
208
    }
209
210
    /**
211
     * Test export functionality.
212
     *
213
     * @covers ::export
214
     */
215
    public function testExport()
216
    {
217
        $mockBasePlugin = $this->getMockBasePlugin();
218
        $mockBasePlugin->isInstalled = true;
219
        $mockBasePlugin->isEnabled = true;
220
221
        $data = $this->getPluginsData();
222
223
        $mockBasePlugin
224
            ->expects($this->any())
225
            ->method('getSettings')
226
            ->willReturn((Object) ['attributes' => $data[$this->pluginHandle]['settings']]);
227
228
        $mockPluginsService = $this->getMockPluginsService();
229
        $mockPluginsService->expects($this->any())
230
            ->method('getPlugins')
231
            ->willReturn([$this->pluginHandle => $mockBasePlugin]);
232
233
        $this->setComponent(Craft::app(), 'plugins', $mockPluginsService);
234
235
        $export = $this->schematicPluginsService->export();
236
        $this->assertEquals($data, $export);
237
    }
238
239
    /**
240
     * Returns plugins data.
241
     *
242
     * @return array
243
     */
244
    public function getPluginsData()
245
    {
246
        return [
247
            $this->pluginHandle => [
248
                'isInstalled'       => true,
249
                'isEnabled'         => true,
250
                'settings'          => [
251
                    'pluginName'    => 'Menu',
252
                    'canDoActions'  => '',
253
                    'quietErrors'   => '',
254
                ],
255
            ],
256
        ];
257
    }
258
}
259