4a665adadc60dd0dd485bccbf36cd5cae8772a14
[yaffs-website] / vendor / symfony / http-kernel / Tests / Fragment / InlineFragmentRendererTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\HttpKernel\Tests\Fragment;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\HttpFoundation\RequestStack;
16 use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
17 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
18 use Symfony\Component\HttpKernel\Controller\ControllerReference;
19 use Symfony\Component\HttpKernel\HttpKernel;
20 use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
21 use Symfony\Component\HttpKernel\KernelEvents;
22 use Symfony\Component\HttpFoundation\Request;
23 use Symfony\Component\HttpFoundation\Response;
24 use Symfony\Component\EventDispatcher\EventDispatcher;
25
26 class InlineFragmentRendererTest extends TestCase
27 {
28     private $originalTrustedHeaderName;
29
30     protected function setUp()
31     {
32         $this->originalTrustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
33     }
34
35     protected function tearDown()
36     {
37         Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $this->originalTrustedHeaderName);
38     }
39
40     public function testRender()
41     {
42         $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
43
44         $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
45     }
46
47     public function testRenderWithControllerReference()
48     {
49         $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
50
51         $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
52     }
53
54     public function testRenderWithObjectsAsAttributes()
55     {
56         $object = new \stdClass();
57
58         $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
59         $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
60         $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
61         $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
62
63         $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
64
65         $this->assertSame('foo', $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'))->getContent());
66     }
67
68     /**
69      * @group legacy
70      */
71     public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheControllerLegacy()
72     {
73         $resolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver')->setMethods(array('getController'))->getMock();
74         $resolver
75             ->expects($this->once())
76             ->method('getController')
77             ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
78                 return new Response($object1->getBar());
79             }))
80         ;
81
82         $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack());
83         $renderer = new InlineFragmentRenderer($kernel);
84
85         $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
86         $this->assertEquals('bar', $response->getContent());
87     }
88
89     /**
90      * @group legacy
91      */
92     public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
93     {
94         $resolver = $this->getMockBuilder(ControllerResolverInterface::class)->getMock();
95         $resolver
96             ->expects($this->once())
97             ->method('getController')
98             ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
99                 return new Response($object1->getBar());
100             }))
101         ;
102
103         $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver());
104         $renderer = new InlineFragmentRenderer($kernel);
105
106         $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
107         $this->assertEquals('bar', $response->getContent());
108     }
109
110     public function testRenderWithTrustedHeaderDisabled()
111     {
112         Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
113
114         $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
115         $this->assertSame('foo', $strategy->render('/', Request::create('/'))->getContent());
116     }
117
118     /**
119      * @expectedException \RuntimeException
120      */
121     public function testRenderExceptionNoIgnoreErrors()
122     {
123         $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
124         $dispatcher->expects($this->never())->method('dispatch');
125
126         $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
127
128         $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
129     }
130
131     public function testRenderExceptionIgnoreErrors()
132     {
133         $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
134         $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);
135
136         $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
137
138         $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
139     }
140
141     public function testRenderExceptionIgnoreErrorsWithAlt()
142     {
143         $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
144             $this->throwException(new \RuntimeException('foo')),
145             $this->returnValue(new Response('bar'))
146         )));
147
148         $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
149     }
150
151     private function getKernel($returnValue)
152     {
153         $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
154         $kernel
155             ->expects($this->any())
156             ->method('handle')
157             ->will($returnValue)
158         ;
159
160         return $kernel;
161     }
162
163     public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
164     {
165         $controllerResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface')->getMock();
166         $controllerResolver
167             ->expects($this->once())
168             ->method('getController')
169             ->will($this->returnValue(function () {
170                 ob_start();
171                 echo 'bar';
172                 throw new \RuntimeException();
173             }))
174         ;
175
176         $argumentResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface')->getMock();
177         $argumentResolver
178             ->expects($this->once())
179             ->method('getArguments')
180             ->will($this->returnValue(array()))
181         ;
182
183         $kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
184         $renderer = new InlineFragmentRenderer($kernel);
185
186         // simulate a main request with output buffering
187         ob_start();
188         echo 'Foo';
189
190         // simulate a sub-request with output buffering and an exception
191         $renderer->render('/', Request::create('/'), array('ignore_errors' => true));
192
193         $this->assertEquals('Foo', ob_get_clean());
194     }
195
196     public function testESIHeaderIsKeptInSubrequest()
197     {
198         $expectedSubRequest = Request::create('/');
199         $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
200
201         if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
202             $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
203             $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
204         }
205
206         $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
207
208         $request = Request::create('/');
209         $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
210         $strategy->render('/', $request);
211     }
212
213     public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
214     {
215         $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
216         Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');
217
218         $this->testESIHeaderIsKeptInSubrequest();
219
220         Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
221     }
222
223     public function testHeadersPossiblyResultingIn304AreNotAssignedToSubrequest()
224     {
225         $expectedSubRequest = Request::create('/');
226         if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
227             $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
228             $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
229         }
230
231         $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
232         $request = Request::create('/', 'GET', array(), array(), array(), array('HTTP_IF_MODIFIED_SINCE' => 'Fri, 01 Jan 2016 00:00:00 GMT', 'HTTP_IF_NONE_MATCH' => '*'));
233         $strategy->render('/', $request);
234     }
235
236     /**
237      * Creates a Kernel expecting a request equals to $request
238      * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
239      */
240     private function getKernelExpectingRequest(Request $request, $strict = false)
241     {
242         $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
243         $kernel
244             ->expects($this->once())
245             ->method('handle')
246             ->with($this->equalTo($request, 1))
247             ->willReturn(new Response('foo'));
248
249         return $kernel;
250     }
251 }
252
253 class Bar
254 {
255     public $bar = 'bar';
256
257     public function getBar()
258     {
259         return $this->bar;
260     }
261 }