Issues (62)

ArgumentResolver/ServiceValueResolverTest.php (1 issue)

Labels
Severity
1
<?php
2
3
/*
4
 *
5
 * (c) Yaroslav Honcharuk <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace Yarhon\RouteGuardBundle\Tests\Controller\ArgumentResolver;
12
13
use PHPUnit\Framework\TestCase;
14
use Psr\Container\ContainerInterface;
15
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
16
use Symfony\Component\DependencyInjection\Exception\RuntimeException as ContainerRuntimeException;
17
use Yarhon\RouteGuardBundle\Controller\ArgumentResolver\ServiceValueResolver;
18
use Yarhon\RouteGuardBundle\Controller\ArgumentResolver\ArgumentResolverContext;
19
use Yarhon\RouteGuardBundle\Exception\RuntimeException;
20
21
/**
22
 * @author Yaroslav Honcharuk <[email protected]>
23
 */
24
class ServiceValueResolverTest extends TestCase
25
{
26
    private $container;
27
28
    private $context;
29
30
    private $argument;
31
32
    private $resolver;
33
34
    public function setUp()
35
    {
36
        $this->container = $this->createMock(ContainerInterface::class);
37
38
        $this->context = $this->createMock(ArgumentResolverContext::class);
39
40
        $this->argument = $this->createMock(ArgumentMetadata::class);
41
42
        $this->argument->method('getName')
0 ignored issues
show
The method method() does not exist on PHPUnit\Framework\MockObject\MockObject. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

42
        $this->argument->/** @scrutinizer ignore-call */ 
43
                         method('getName')

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
43
            ->willReturn('arg');
44
45
        $this->resolver = new ServiceValueResolver($this->container);
46
    }
47
48
    /**
49
     * @dataProvider supportsDataProvider
50
     */
51
    public function testSupports($controllerName, $serviceLocator, $expected)
52
    {
53
        $this->context->method('getControllerName')
54
            ->willReturn($controllerName);
55
56
        $this->container->method('has')
57
            ->willReturn((bool) $serviceLocator);
58
59
        $this->container->method('get')
60
            ->willReturn($serviceLocator);
61
62
        $this->assertSame($expected, $this->resolver->supports($this->context, $this->argument));
63
    }
64
65
    public function supportsDataProvider()
66
    {
67
        return [
68
            // no service locator
69
            [
70
                'a::b',
71
                null,
72
                false,
73
            ],
74
            // no service in service locator
75
            [
76
                'a::b',
77
                $this->createServiceLocator(),
78
                false,
79
            ],
80
            // has service in service locator
81
            [
82
                'a::b',
83
                $this->createServiceLocator('arg'),
84
                true,
85
            ],
86
        ];
87
    }
88
89
    public function testSupportsTriesOldServiceNaming()
90
    {
91
        $this->context->method('getControllerName')
92
            ->willReturn('a::b');
93
94
        $this->container->expects($this->at(0))
95
            ->method('has')
96
            ->with('a::b')
97
            ->willReturn(false);
98
99
        $this->container->expects($this->at(1))
100
            ->method('has')
101
            ->with('a:b')
102
            ->willReturn(true);
103
104
        $this->container->expects($this->once())
105
            ->method('get')
106
            ->with('a:b');
107
108
        $this->resolver->supports($this->context, $this->argument);
109
    }
110
111
    public function testSupportsTrimsLeadingBackslashes()
112
    {
113
        $this->context->method('getControllerName')
114
            ->willReturn('\\a::b');
115
116
        $this->container->expects($this->at(0))
117
            ->method('has')
118
            ->with('a::b');
119
120
        $this->resolver->supports($this->context, $this->argument);
121
    }
122
123
    public function testResolve()
124
    {
125
        $this->context->method('getControllerName')
126
            ->willReturn('a::b');
127
128
        $value = new \stdClass();
129
130
        $serviceLocator = $this->createServiceLocator('arg', $value);
131
132
        $this->container->method('has')
133
            ->with('a::b')
134
            ->willReturn(true);
135
136
        $this->container->method('get')
137
            ->with('a::b')
138
            ->willReturn($serviceLocator);
139
140
        $this->assertSame($value, $this->resolver->resolve($this->context, $this->argument));
141
    }
142
143
    public function testResolveException()
144
    {
145
        $this->context->method('getControllerName')
146
            ->willReturn('a::b');
147
148
        $serviceLocator = $this->createServiceLocator('arg');
149
150
        $exception = new ContainerRuntimeException('original text');
151
152
        $serviceLocator->method('get')
153
            ->with('arg')
154
            ->willThrowException($exception);
155
156
        $this->container->method('has')
157
            ->with('a::b')
158
            ->willReturn(true);
159
160
        $this->container->method('get')
161
            ->with('a::b')
162
            ->willReturn($serviceLocator);
163
164
        $this->expectException(RuntimeException::class);
165
        $this->expectExceptionMessage('Cannot resolve argument $arg of "a::b()": original text');
166
167
        $this->resolver->resolve($this->context, $this->argument);
168
    }
169
170
    private function createServiceLocator($serviceId = null, $serviceValue = null)
171
    {
172
        $serviceLocator = $this->createMock(ContainerInterface::class);
173
174
        if (null !== $serviceId) {
175
            $serviceLocator->method('has')
176
                ->with($serviceId)
177
                ->willReturn(true);
178
        } else {
179
            $serviceLocator->method('has')
180
                ->willReturn(false);
181
        }
182
183
        if (null !== $serviceValue) {
184
            $serviceLocator->method('get')
185
                ->with($serviceId)
186
                ->willReturn($serviceValue);
187
        }
188
189
        return $serviceLocator;
190
    }
191
}
192