Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added more tests for WebProfilerBundle #31522

Merged
merged 1 commit into from
Jan 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,110 @@

namespace Symfony\Bundle\WebProfilerBundle\Tests\Controller;

use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Bundle\WebProfilerBundle\Controller\ProfilerController;
use Symfony\Bundle\WebProfilerBundle\Csp\ContentSecurityPolicyHandler;
use Symfony\Bundle\WebProfilerBundle\Tests\Functional\WebProfilerBundleKernel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Profiler\Profile;

class ProfilerControllerTest extends TestCase
class ProfilerControllerTest extends WebTestCase
{
public function testHomeActionWithProfilerDisabled()
{
$this->expectException(NotFoundHttpException::class);
$this->expectExceptionMessage('The profiler must be enabled.');

$urlGenerator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->getMock();
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();

$controller = new ProfilerController($urlGenerator, null, $twig, []);
$controller->homeAction();
}

public function testHomeActionRedirect()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/_profiler/');

$this->assertSame(302, $client->getResponse()->getStatusCode());
$this->assertSame('/_profiler/empty/search/results?limit=10', $client->getResponse()->getTargetUrl());
}

public function testPanelActionWithLatestTokenWhenNoTokensExist()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/_profiler/latest');

$this->assertStringContainsString('No profiles found.', $client->getResponse()->getContent());
}

public function testPanelActionWithLatestToken()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/');
$client->request('GET', '/_profiler/latest');

$this->assertStringContainsString('kernel:homepageController', $client->getResponse()->getContent());
}

public function testPanelActionWithoutValidToken()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/_profiler/this-token-does-not-exist');

$this->assertStringContainsString('Token "this-token-does-not-exist" not found.', $client->getResponse()->getContent());
}

public function testPanelActionWithWrongPanel()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/');
$client->request('GET', '/_profiler/latest?panel=this-panel-does-not-exist');

$this->assertSame(404, $client->getResponse()->getStatusCode());
}

public function testPanelActionWithValidPanelAndToken()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/');
$crawler = $client->request('GET', '/_profiler/latest?panel=router');

$this->assertSame('_', $crawler->filter('.metrics .metric .value')->eq(0)->text());
$this->assertSame('12', $crawler->filter('.metrics .metric .value')->eq(1)->text());
Copy link
Member

@nicolas-grekas nicolas-grekas Jan 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this assertion when merging in 4.4 because it doesn't pass and the patch is painful enough to merge up.
Feel free to submit it again on 4.4 with the proper assertion.

}

public function testToolbarActionWithProfilerDisabled()
{
$this->expectException(NotFoundHttpException::class);
$this->expectExceptionMessage('The profiler must be enabled.');

$urlGenerator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->getMock();
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();

$controller = new ProfilerController($urlGenerator, null, $twig, []);
$controller->toolbarAction(Request::create('/_wdt/foo-token'), null);
}

/**
* @dataProvider getEmptyTokenCases
*/
public function testEmptyToken($token)
public function testToolbarActionWithEmptyToken($token)
{
$urlGenerator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->getMock();
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();
Expand Down Expand Up @@ -111,10 +202,36 @@ public function testReturns404onTokenNotFound($withCsp)
$this->assertEquals(404, $response->getStatusCode());
}

public function testSearchBarActionWithProfilerDisabled()
{
$this->expectException(NotFoundHttpException::class);
$this->expectExceptionMessage('The profiler must be enabled.');

$urlGenerator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->getMock();
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();

$controller = new ProfilerController($urlGenerator, null, $twig, []);
$controller->searchBarAction(Request::create('/_profiler/search_bar'));
}

public function testSearchBarActionDefaultPage()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$crawler = $client->request('GET', '/_profiler/search_bar');

$this->assertSame(200, $client->getResponse()->getStatusCode());

foreach (['ip', 'status_code', 'url', 'token', 'start', 'end'] as $searchCriteria) {
$this->assertSame('', $crawler->filter(sprintf('form input[name="%s"]', $searchCriteria))->text());
}
}

/**
* @dataProvider provideCspVariants
*/
public function testSearchResult($withCsp)
public function testSearchResultsAction($withCsp)
{
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();
$profiler = $this
Expand Down Expand Up @@ -177,6 +294,67 @@ public function testSearchResult($withCsp)
$this->assertEquals(200, $response->getStatusCode());
}

public function testSearchActionWithProfilerDisabled()
{
$this->expectException(NotFoundHttpException::class);
$this->expectExceptionMessage('The profiler must be enabled.');

$urlGenerator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->getMock();
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();

$controller = new ProfilerController($urlGenerator, null, $twig, []);
$controller->searchBarAction(Request::create('/_profiler/search'));
}

public function testSearchActionWithToken()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/');
$token = $client->getResponse()->headers->get('x-debug-token');
$client->request('GET', '/_profiler/search?token='.$token);

$this->assertSame(302, $client->getResponse()->getStatusCode());
$this->assertSame('/_profiler/'.$token, $client->getResponse()->getTargetUrl());
}

public function testSearchActionWithoutToken()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);
$client->followRedirects();

$client->request('GET', '/');
$token = $client->getResponse()->headers->get('x-debug-token');
$client->request('GET', '/_profiler/search?ip=&method=GET&status_code=&url=&token=&start=&end=&limit=10');

$this->assertStringContainsString('1 results found', $client->getResponse()->getContent());
$this->assertStringContainsString(sprintf('<a href="/_profiler/%s">%s</a>', $token, $token), $client->getResponse()->getContent());
}

public function testPhpinfoActionWithProfilerDisabled()
{
$this->expectException(NotFoundHttpException::class);
$this->expectExceptionMessage('The profiler must be enabled.');

$urlGenerator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->getMock();
$twig = $this->getMockBuilder('Twig\Environment')->disableOriginalConstructor()->getMock();

$controller = new ProfilerController($urlGenerator, null, $twig, []);
$controller->phpinfoAction(Request::create('/_profiler/phpinfo'));
}

public function testPhpinfoAction()
{
$kernel = new WebProfilerBundleKernel();
$client = new Client($kernel);

$client->request('GET', '/_profiler/phpinfo');

$this->assertStringContainsString('PHP License', $client->getResponse()->getContent());
}

public function provideCspVariants()
{
return [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php

namespace Symfony\Bundle\WebProfilerBundle\Tests\Functional;

use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Bundle\TwigBundle\TwigBundle;
use Symfony\Bundle\WebProfilerBundle\WebProfilerBundle;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\RouteCollectionBuilder;

class WebProfilerBundleKernel extends Kernel
{
use MicroKernelTrait;

public function __construct()
{
parent::__construct('test', false);
}

/**
* {@inheritdoc}
*/
public function getName()
{
if (null === $this->name) {
$this->name = parent::getName().substr(md5(__CLASS__), -16);
}

return $this->name;
}

public function registerBundles()
{
return [
new FrameworkBundle(),
new TwigBundle(),
new WebProfilerBundle(),
];
}

protected function configureRoutes(RouteCollectionBuilder $routes)
{
$routes->import(__DIR__.'/../../Resources/config/routing/profiler.xml', '/_profiler');
$routes->import(__DIR__.'/../../Resources/config/routing/wdt.xml', '/_wdt');
$routes->add('/', 'kernel:homepageController');
}

protected function configureContainer(ContainerBuilder $containerBuilder, LoaderInterface $loader)
{
$containerBuilder->loadFromExtension('framework', [
'secret' => 'foo-secret',
'profiler' => ['only_exceptions' => false],
'session' => ['storage_id' => 'session.storage.mock_file'],
]);

$containerBuilder->loadFromExtension('web_profiler', [
'toolbar' => true,
'intercept_redirects' => false,
]);
}

public function getCacheDir()
{
return sys_get_temp_dir().'/cache-'.spl_object_hash($this);
}

public function getLogDir()
{
return sys_get_temp_dir().'/log-'.spl_object_hash($this);
}

public function homepageController()
{
return new Response('<html><head></head><body>Homepage Controller.</body></html>');
}
}
15 changes: 8 additions & 7 deletions src/Symfony/Bundle/WebProfilerBundle/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,22 @@
],
"require": {
"php": "^5.5.9|>=7.0.8",
"symfony/config": "~3.4|~4.0",
"symfony/http-kernel": "~3.4.25|^4.2.6",
"symfony/polyfill-php70": "~1.0",
"symfony/routing": "~2.8|~3.0|~4.0",
"symfony/twig-bundle": "~2.8|~3.0|~4.0",
"symfony/routing": "~3.4.7|~4.0",
"symfony/twig-bundle": "~3.4|~4.0",
"symfony/var-dumper": "~3.3|~4.0",
"twig/twig": "~1.34|~2.4"
},
"require-dev": {
"symfony/config": "~3.4|~4.0",
"symfony/console": "~2.8|~3.0|~4.0",
"symfony/dependency-injection": "~3.4|~4.0",
"symfony/stopwatch": "~2.8|~3.0|~4.0"
"symfony/browser-kit": "~3.4|~4.0",
"symfony/console": "~3.4|~4.0",
"symfony/css-selector": "~3.4|~4.0",
"symfony/framework-bundle": "~3.4|~4.0",
"symfony/stopwatch": "~3.4|~4.0"
},
"conflict": {
"symfony/config": "<3.4",
"symfony/dependency-injection": "<3.4",
"symfony/event-dispatcher": "<3.3.1",
"symfony/var-dumper": "<3.3"
Expand Down