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