Browse Source

Merge remote branch 'Herzult/updateWDT'

* Herzult/updateWDT:
  [WebProfilerBundle] Use a template for the redirection interceptions
  [WebProfilerBundle] Add some tests for the listener
Fabien Potencier 14 years ago
parent
commit
9ce85bed6c

+ 10 - 0
src/Symfony/Bundle/WebProfilerBundle/Resources/views/Redirection/interception.html.twig

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Redirection Intercepted</title>
+</head>
+<body>
+    <h1>This Request redirects to<br /><a href="{{ location }}">{{ location }}</a>.</h1>
+    <h4>The redirect was intercepted by the web debug toolbar to help debugging.<br/>For more information, see the "intercept-redirects" option of the Profiler.</h4>
+</body>
+</html>

+ 162 - 7
src/Symfony/Bundle/WebProfilerBundle/Tests/WebDebugToolbarListenerTest.php

@@ -13,6 +13,7 @@ namespace Symfony\Bundle\WebProfilerBundle\Tests;
 
 use Symfony\Bundle\WebProfilerBundle\WebDebugToolbarListener;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
 
 class WebDebugToolbarListenerTest extends \PHPUnit_Framework_TestCase
 {
@@ -21,13 +22,7 @@ class WebDebugToolbarListenerTest extends \PHPUnit_Framework_TestCase
      */
     public function testInjectToolbar($content, $expected)
     {
-        $templating = $this->getMock('Symfony\Bundle\TwigBundle\TwigEngine', array(), array(), '', false);
-        $templating->expects($this->any())
-                 ->method('render')
-                 ->will($this->returnValue('WDT'));
-        ;
-        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
-        $listener = new WebDebugToolbarListener($templating);
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
         $m = new \ReflectionMethod($listener, 'injectToolbar');
         $m->setAccessible(true);
 
@@ -54,4 +49,164 @@ class WebDebugToolbarListenerTest extends \PHPUnit_Framework_TestCase
             </html>"),
         );
     }
+
+    public function testRedirectionIsIntercepted()
+    {
+        foreach (array(301, 302) as $statusCode) {
+            $response = new Response('Some content', $statusCode);
+            $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+            $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(), Kernel::MASTER_REQUEST, $response);
+
+            $listener = new WebDebugToolbarListener($this->getTemplatingMock('Redirection'), true);
+            $listener->onCoreResponse($event);
+
+            $this->assertEquals(200, $response->getStatusCode());
+            $this->assertEquals('Redirection', $response->getContent());
+        }
+    }
+
+    public function testToolbarIsInjected()
+    {
+        $response = new Response('<html><head></head><body></body></html>');
+        $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+
+        $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(), Kernel::MASTER_REQUEST, $response);
+
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+        $listener->onCoreResponse($event);
+
+        $this->assertEquals("<html><head></head><body>\nWDT\n</body></html>", $response->getContent());
+    }
+
+    /**
+     * @depends testToolbarIsInjected
+     */
+    public function testToolbarIsNotInjectedOnRedirection()
+    {
+        foreach (array(301, 302) as $statusCode) {
+            $response = new Response('<html><head></head><body></body></html>', $statusCode);
+            $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+            $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(), Kernel::MASTER_REQUEST, $response);
+
+            $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+            $listener->onCoreResponse($event);
+
+            $this->assertEquals('<html><head></head><body></body></html>', $response->getContent());
+        }
+    }
+
+    /**
+     * @depends testToolbarIsInjected
+     */
+    public function testToolbarIsNotInjectedWhenThereIsNoNoXDebugTokenResponseHeader()
+    {
+        $response = new Response('<html><head></head><body></body></html>');
+
+        $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(), Kernel::MASTER_REQUEST, $response);
+
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+        $listener->onCoreResponse($event);
+
+        $this->assertEquals('<html><head></head><body></body></html>', $response->getContent());
+    }
+
+    /**
+     * @depends testToolbarIsInjected
+     */
+    public function testToolbarIsNotInjectedWhenOnSubRequest()
+    {
+        $response = new Response('<html><head></head><body></body></html>');
+        $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+
+        $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(), Kernel::SUB_REQUEST, $response);
+
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+        $listener->onCoreResponse($event);
+
+        $this->assertEquals('<html><head></head><body></body></html>', $response->getContent());
+    }
+
+    /**
+     * @depends testToolbarIsInjected
+     */
+    public function testToolbarIsNotInjectedOnUncompleteHtmlResponses()
+    {
+        $response = new Response('<div>Some content</div>');
+        $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+
+        $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(), Kernel::MASTER_REQUEST, $response);
+
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+        $listener->onCoreResponse($event);
+
+        $this->assertEquals('<div>Some content</div>', $response->getContent());
+    }
+
+    /**
+     * @depends testToolbarIsInjected
+     */
+    public function testToolbarIsNotInjectedOnXmlHttpRequests()
+    {
+        $response = new Response('<html><head></head><body></body></html>');
+        $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+
+        $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(true), Kernel::MASTER_REQUEST, $response);
+
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+        $listener->onCoreResponse($event);
+
+        $this->assertEquals('<html><head></head><body></body></html>', $response->getContent());
+    }
+
+    /**
+     * @depends testToolbarIsInjected
+     */
+    public function testToolbarIsNotInjectedOnNonHtmlRequests()
+    {
+        $response = new Response('<html><head></head><body></body></html>');
+        $response->headers->set('X-Debug-Token', 'xxxxxxxx');
+
+        $event = new FilterResponseEvent($this->getKernelMock(), $this->getRequestMock(false, 'json'), Kernel::MASTER_REQUEST, $response);
+
+        $listener = new WebDebugToolbarListener($this->getTemplatingMock());
+        $listener->onCoreResponse($event);
+
+        $this->assertEquals('<html><head></head><body></body></html>', $response->getContent());
+    }
+
+    protected function getRequestMock($isXmlHttpRequest = false, $requestFormat = 'html')
+    {
+        $session = $this->getMock('Symfony\Component\HttpFoundation\Session', array(), array(), '', false);
+        $request = $this->getMock(
+            'Symfony\Component\HttpFoundation\Request',
+            array('getSession', 'isXmlHttpRequest', 'getRequestFormat'),
+            array(), '', false
+        );
+        $request->expects($this->any())
+            ->method('isXmlHttpRequest')
+            ->will($this->returnValue($isXmlHttpRequest));
+        $request->expects($this->any())
+            ->method('getRequestFormat')
+            ->will($this->returnValue($requestFormat));
+        $request->expects($this->any())
+            ->method('getSession')
+            ->will($this->returnValue($session));
+
+        return $request;
+    }
+
+    protected function getTemplatingMock($render = 'WDT')
+    {
+        $templating = $this->getMock('Symfony\Bundle\TwigBundle\TwigEngine', array(), array(), '', false);
+        $templating->expects($this->any())
+            ->method('render')
+            ->will($this->returnValue($render));
+
+        return $templating;
+    }
+
+    protected function getKernelMock()
+    {
+        return $this->getMock('Symfony\Component\HttpKernel\Kernel', array(), array(), '', false);
+    }
 }

+ 1 - 4
src/Symfony/Bundle/WebProfilerBundle/WebDebugToolbarListener.php

@@ -52,10 +52,7 @@ class WebDebugToolbarListener
             // keep current flashes for one more request
             $request->getSession()->setFlashes($request->getSession()->getFlashes());
 
-            $response->setContent(
-                sprintf('<html><head></head><body><h1>This Request redirects to<br /><a href="%1$s">%1$s</a>.</h1><h4>The redirect was intercepted by the web debug toolbar to help debugging.<br/>For more information, see the "intercept-redirects" option of the Profiler.</h4></body></html>',
-                $response->headers->get('Location'))
-            );
+            $response->setContent($this->templating->render('WebDebugToolbar:Profiler:redirect.html.twig', array('location' => $response->headers->get('Location'))));
             $response->setStatusCode(200);
             $response->headers->remove('Location');
         }