resume/tests/Silex/Tests/RouterTest.php

286 lines
7.8 KiB
PHP

<?php
/*
* This file is part of the Silex framework.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Silex\Tests;
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Router test cases.
*
* @author Igor Wiedler <igor@wiedler.ch>
*/
class RouterTest extends \PHPUnit_Framework_TestCase
{
public function testMapRouting()
{
$app = new Application();
$app->match('/foo', function () {
return 'foo';
});
$app->match('/bar', function () {
return 'bar';
});
$app->match('/', function () {
return 'root';
});
$this->checkRouteResponse($app, '/foo', 'foo');
$this->checkRouteResponse($app, '/bar', 'bar');
$this->checkRouteResponse($app, '/', 'root');
}
public function testStatusCode()
{
$app = new Application();
$app->put('/created', function () {
return new Response('', 201);
});
$app->match('/forbidden', function () {
return new Response('', 403);
});
$app->match('/not_found', function () {
return new Response('', 404);
});
$request = Request::create('/created', 'put');
$response = $app->handle($request);
$this->assertEquals(201, $response->getStatusCode());
$request = Request::create('/forbidden');
$response = $app->handle($request);
$this->assertEquals(403, $response->getStatusCode());
$request = Request::create('/not_found');
$response = $app->handle($request);
$this->assertEquals(404, $response->getStatusCode());
}
public function testRedirect()
{
$app = new Application();
$app->match('/redirect', function () {
return new RedirectResponse('/target');
});
$app->match('/redirect2', function () use ($app) {
return $app->redirect('/target2');
});
$request = Request::create('/redirect');
$response = $app->handle($request);
$this->assertTrue($response->isRedirect('/target'));
$request = Request::create('/redirect2');
$response = $app->handle($request);
$this->assertTrue($response->isRedirect('/target2'));
}
/**
* @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
*/
public function testMissingRoute()
{
$app = new Application();
unset($app['exception_handler']);
$request = Request::create('/baz');
$app->handle($request);
}
public function testMethodRouting()
{
$app = new Application();
$app->match('/foo', function () {
return 'foo';
});
$app->match('/bar', function () {
return 'bar';
})->method('GET|POST');
$app->get('/resource', function () {
return 'get resource';
});
$app->post('/resource', function () {
return 'post resource';
});
$app->put('/resource', function () {
return 'put resource';
});
$app->patch('/resource', function () {
return 'patch resource';
});
$app->delete('/resource', function () {
return 'delete resource';
});
$this->checkRouteResponse($app, '/foo', 'foo');
$this->checkRouteResponse($app, '/bar', 'bar');
$this->checkRouteResponse($app, '/bar', 'bar', 'post');
$this->checkRouteResponse($app, '/resource', 'get resource');
$this->checkRouteResponse($app, '/resource', 'post resource', 'post');
$this->checkRouteResponse($app, '/resource', 'put resource', 'put');
$this->checkRouteResponse($app, '/resource', 'patch resource', 'patch');
$this->checkRouteResponse($app, '/resource', 'delete resource', 'delete');
}
public function testRequestShouldBeStoredRegardlessOfRouting()
{
$app = new Application();
$app->get('/foo', function (Request $request) use ($app) {
return new Response($request->getRequestUri());
});
$app->error(function ($e, Request $request, $code) use ($app) {
return new Response($request->getRequestUri());
});
foreach (array('/foo', '/bar') as $path) {
$request = Request::create($path);
$response = $app->handle($request);
$this->assertContains($path, $response->getContent());
}
}
public function testTrailingSlashBehavior()
{
$app = new Application();
$app->get('/foo/', function () use ($app) {
return new Response('ok');
});
$request = Request::create('/foo');
$response = $app->handle($request);
$this->assertEquals(301, $response->getStatusCode());
$this->assertEquals('/foo/', $response->getTargetUrl());
}
public function testHostSpecification()
{
$route = new \Silex\Route();
$this->assertSame($route, $route->host('{locale}.example.com'));
$this->assertEquals('{locale}.example.com', $route->getHost());
}
public function testRequireHttpRedirect()
{
$app = new Application();
$app->match('/secured', function () {
return 'secured content';
})
->requireHttp();
$request = Request::create('https://example.com/secured');
$response = $app->handle($request);
$this->assertTrue($response->isRedirect('http://example.com/secured'));
}
public function testRequireHttpsRedirect()
{
$app = new Application();
$app->match('/secured', function () {
return 'secured content';
})
->requireHttps();
$request = Request::create('http://example.com/secured');
$response = $app->handle($request);
$this->assertTrue($response->isRedirect('https://example.com/secured'));
}
public function testRequireHttpsRedirectIncludesQueryString()
{
$app = new Application();
$app->match('/secured', function () {
return 'secured content';
})
->requireHttps();
$request = Request::create('http://example.com/secured?query=string');
$response = $app->handle($request);
$this->assertTrue($response->isRedirect('https://example.com/secured?query=string'));
}
public function testConditionOnRoute()
{
$app = new Application();
$app->match('/secured', function () {
return 'secured content';
})
->when('request.isSecure() == true');
$request = Request::create('http://example.com/secured');
$response = $app->handle($request);
$this->assertEquals(404, $response->getStatusCode());
}
public function testClassNameControllerSyntax()
{
$app = new Application();
$app->get('/foo', 'Silex\Tests\MyController::getFoo');
$this->checkRouteResponse($app, '/foo', 'foo');
}
public function testClassNameControllerSyntaxWithStaticMethod()
{
$app = new Application();
$app->get('/bar', 'Silex\Tests\MyController::getBar');
$this->checkRouteResponse($app, '/bar', 'bar');
}
protected function checkRouteResponse(Application $app, $path, $expectedContent, $method = 'get', $message = null)
{
$request = Request::create($path, $method);
$response = $app->handle($request);
$this->assertEquals($expectedContent, $response->getContent(), $message);
}
}
class MyController
{
public function getFoo()
{
return 'foo';
}
public static function getBar()
{
return 'bar';
}
}