Completed
Push — master ( e32eeb...714cda )
by
unknown
89:50 queued 46:29
created

ThemeExtensionTest::setUp()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 22

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 30
rs 8.8571
cc 1
eloc 22
nc 1
nop 0
1
<?php
2
3
namespace Oro\Component\Layout\Tests\Unit\Extension\Theme;
4
5
use Oro\Component\Layout\Loader\LayoutUpdateLoader;
6
use Oro\Component\Layout\Extension\Theme\PathProvider\ChainPathProvider;
7
use Oro\Component\Layout\Loader\Driver\DriverInterface;
8
use Oro\Component\Layout\Extension\Theme\Model\DependencyInitializer;
9
use Oro\Component\Layout\Extension\Theme\ThemeExtension;
10
11
class ThemeExtensionTest extends \PHPUnit_Framework_TestCase
12
{
13
    /** @var ThemeExtension */
14
    protected $extension;
15
16
    /** @var \PHPUnit_Framework_MockObject_MockObject|ChainPathProvider */
17
    protected $provider;
18
19
    /** @var \PHPUnit_Framework_MockObject_MockObject|DriverInterface */
20
    protected $phpDriver;
21
22
    /** @var \PHPUnit_Framework_MockObject_MockObject|DriverInterface */
23
    protected $yamlDriver;
24
25
    /** @var \PHPUnit_Framework_MockObject_MockObject|DependencyInitializer */
26
    protected $dependencyInitializer;
27
28
    /** @var array */
29
    protected $resources = [
30
        'oro-default' => [
31
            'resource1.yml',
32
            'resource2.xml',
33
            'resource3.php'
34
        ],
35
        'oro-gold'    => [
36
            'resource-gold.yml',
37
            'index' => [
38
                'resource-update.yml'
39
            ]
40
        ],
41
    ];
42
43
    protected function setUp()
44
    {
45
        $this->provider   = $this
46
            ->getMock('Oro\Component\Layout\Tests\Unit\Extension\Theme\Stubs\StubContextAwarePathProvider');
47
        $this->yamlDriver = $this
48
            ->getMockBuilder('Oro\Component\Layout\Loader\Driver\DriverInterface')
49
            ->setMethods(['supports', 'load'])
50
            ->getMock()
51
        ;
52
        $this->phpDriver  = $this
53
            ->getMockBuilder('Oro\Component\Layout\Loader\Driver\DriverInterface')
54
            ->setMethods(['supports', 'load'])
55
            ->getMock()
56
        ;
57
58
        $this->dependencyInitializer = $this
59
            ->getMockBuilder('Oro\Component\Layout\Extension\Theme\Model\DependencyInitializer')
60
            ->disableOriginalConstructor()->getMock();
61
62
        $loader = new LayoutUpdateLoader();
63
        $loader->addDriver('yml', $this->yamlDriver);
64
        $loader->addDriver('php', $this->phpDriver);
65
66
        $this->extension = new ThemeExtension(
67
            $this->resources,
68
            $loader,
69
            $this->dependencyInitializer,
70
            $this->provider
71
        );
72
    }
73
74
    protected function tearDown()
75
    {
76
        unset(
77
            $this->extension,
78
            $this->provider,
79
            $this->yamlDriver,
80
            $this->phpDriver,
81
            $this->dependencyInitializer
82
        );
83
    }
84
85
    public function testThemeWithoutUpdatesTheme()
86
    {
87
        $themeName = 'my-theme';
88
        $this->setUpResourcePathProvider($themeName);
0 ignored issues
show
Documentation introduced by
$themeName is of type string, but the function expects a array.

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...
89
90
        $this->yamlDriver->expects($this->never())->method('supports');
91
        $this->phpDriver->expects($this->never())->method('supports');
92
93
        $this->extension->getLayoutUpdates($this->getLayoutItem('root', $themeName));
94
    }
95
96
    public function testThemeYamlUpdateFound()
97
    {
98
        $themeName = 'oro-gold';
99
        $this->setUpResourcePathProvider($themeName);
0 ignored issues
show
Documentation introduced by
$themeName is of type string, but the function expects a array.

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...
100
101
        $callbackBuilder = $this->getCallbackBuilder();
102
103
        $this->yamlDriver->expects($this->any())->method('supports')
104
            ->willReturnCallback($callbackBuilder('yml'));
105
        $this->phpDriver->expects($this->never())->method('supports')
106
            ->willReturnCallback($callbackBuilder('php'));
107
108
        $updateMock = $this->getMock('Oro\Component\Layout\LayoutUpdateInterface');
109
110
        $this->yamlDriver->expects($this->once())->method('load')
111
            ->with('resource-gold.yml')
112
            ->willReturn($updateMock);
113
114
        $result = $this->extension->getLayoutUpdates($this->getLayoutItem('root', $themeName));
115
        $this->assertContains($updateMock, $result);
116
    }
117
118
    public function testUpdatesFoundBasedOnMultiplePaths()
119
    {
120
        $themeName = 'oro-gold';
121
        $this->setUpResourcePathProvider([$themeName], [$themeName . '_index']);
0 ignored issues
show
Unused Code introduced by
The call to ThemeExtensionTest::setUpResourcePathProvider() has too many arguments starting with array($themeName . '_index').

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
122
123
        $callbackBuilder = $this->getCallbackBuilder();
124
125
        $this->yamlDriver->expects($this->any())->method('supports')
126
            ->willReturnCallback($callbackBuilder('yml'));
127
        $this->phpDriver->expects($this->never())->method('supports')
128
            ->willReturnCallback($callbackBuilder('php'));
129
130
        $updateMock = $this->getMock('Oro\Component\Layout\LayoutUpdateInterface');
131
132
        $this->yamlDriver->expects($this->once())->method('load')
133
            ->with('resource-gold.yml')
134
            ->willReturn($updateMock);
135
136
        $result = $this->extension->getLayoutUpdates($this->getLayoutItem('root', $themeName));
137
        $this->assertContains($updateMock, $result);
138
    }
139
140
    public function testThemeUpdatesFoundWithOneSkipped()
141
    {
142
        $themeName = 'oro-default';
143
        $this->setUpResourcePathProvider($themeName);
0 ignored issues
show
Documentation introduced by
$themeName is of type string, but the function expects a array.

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...
144
145
        $callbackBuilder = $this->getCallbackBuilder();
146
147
        $this->yamlDriver->expects($this->any())->method('supports')
148
            ->willReturnCallback($callbackBuilder('yml'));
149
        $this->phpDriver->expects($this->any())->method('supports')
150
            ->willReturnCallback($callbackBuilder('php'));
151
152
        $updateMock  = $this->getMock('Oro\Component\Layout\LayoutUpdateInterface');
153
        $update2Mock = $this->getMock('Oro\Component\Layout\LayoutUpdateInterface');
154
155
        $this->yamlDriver->expects($this->once())->method('load')
156
            ->with('resource1.yml')
157
            ->willReturn($updateMock);
158
        $this->phpDriver->expects($this->once())->method('load')
159
            ->with('resource3.php')
160
            ->willReturn($update2Mock);
161
162
        $result = $this->extension->getLayoutUpdates($this->getLayoutItem('root', $themeName));
163
        $this->assertContains($updateMock, $result);
164
        $this->assertContains($update2Mock, $result);
165
    }
166
167
    public function testShouldPassDependenciesToUpdateInstance()
168
    {
169
        $themeName = 'oro-gold';
170
        $update    = $this->getMock('Oro\Component\Layout\LayoutUpdateInterface');
171
        $this->setUpResourcePathProvider($themeName);
0 ignored issues
show
Documentation introduced by
$themeName is of type string, but the function expects a array.

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...
172
173
        $callbackBuilder = $this->getCallbackBuilder();
174
        $this->yamlDriver->expects($this->any())->method('supports')->willReturnCallback($callbackBuilder('yml'));
175
        $this->yamlDriver->expects($this->once())->method('load')->willReturn($update);
176
177
        $this->dependencyInitializer->expects($this->once())->method('initialize')->with($this->identicalTo($update));
178
179
        $this->extension->getLayoutUpdates($this->getLayoutItem('root', $themeName));
180
    }
181
182
    public function testShouldPassContextInContextAwareProvider()
183
    {
184
        $themeName = 'my-theme';
185
        $this->setUpResourcePathProvider($themeName);
0 ignored issues
show
Documentation introduced by
$themeName is of type string, but the function expects a array.

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...
186
187
        $this->provider->expects($this->once())->method('setContext');
188
189
        $this->extension->getLayoutUpdates($this->getLayoutItem('root', $themeName));
190
    }
191
192
    protected function getCallbackBuilder()
193
    {
194
        return function ($extension) {
195
            return function ($fileName) use ($extension) {
196
                return substr($fileName, -strlen($extension)) === $extension;
197
            };
198
        };
199
    }
200
201
    /**
202
     * @param array $paths
203
     */
204
    protected function setUpResourcePathProvider($paths)
205
    {
206
        $this->provider->expects($this->any())->method('getPaths')->willReturn((array)$paths);
207
    }
208
209
    /**
210
     * @param string      $id
211
     * @param null|string $theme
212
     *
213
     * @return \PHPUnit_Framework_MockObject_MockObject
214
     */
215
    protected function getLayoutItem($id, $theme = null)
216
    {
217
        $layoutItem = $this->getMock('Oro\Component\Layout\LayoutItemInterface');
218
        $context    = $this->getMock('Oro\Component\Layout\ContextInterface');
219
220
        $layoutItem->expects($this->any())->method('getId')->willReturn($id);
221
        $layoutItem->expects($this->any())->method('getContext')->willReturn($context);
222
223
        $context->expects($this->any())->method('getOr')
224
            ->with('theme')->willReturn($theme);
225
226
        return $layoutItem;
227
    }
228
}
229