123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720 |
- <?php defined('SYSPATH') OR die('Kohana bootstrap needs to be included before tests run');
- /**
- * Unit tests for request class
- *
- * @group kohana
- * @group kohana.core
- * @group kohana.core.request
- *
- * @package Kohana
- * @category Tests
- * @author Kohana Team
- * @author BRMatt <[email protected]>
- * @copyright (c) 2008-2012 Kohana Team
- * @license http://kohanaframework.org/license
- */
- class Kohana_RequestTest extends Unittest_TestCase
- {
- protected $_inital_request;
- // @codingStandardsIgnoreStart
- public function setUp()
- // @codingStandardsIgnoreEnd
- {
- parent::setUp();
- $this->_initial_request = Request::$initial;
- Request::$initial = new Request('/');
- }
- // @codingStandardsIgnoreStart
- public function tearDown()
- // @codingStandardsIgnoreEnd
- {
- Request::$initial = $this->_initial_request;
- parent::tearDown();
- }
- public function test_initial()
- {
- $this->setEnvironment(array(
- 'Request::$initial' => NULL,
- 'Request::$client_ip' => NULL,
- 'Request::$user_agent' => NULL,
- '_SERVER' => array(
- 'HTTPS' => NULL,
- 'PATH_INFO' => '/',
- 'HTTP_REFERER' => 'http://example.com/',
- 'HTTP_USER_AGENT' => 'whatever (Mozilla 5.0/compatible)',
- 'REMOTE_ADDR' => '127.0.0.1',
- 'REQUEST_METHOD' => 'GET',
- 'HTTP_X_REQUESTED_WITH' => 'ajax-or-something',
- ),
- '_GET' => array(),
- '_POST' => array(),
- ));
- $request = Request::factory();
- $this->assertEquals(Request::$initial, $request);
- $this->assertEquals(Request::$client_ip, '127.0.0.1');
- $this->assertEquals(Request::$user_agent, 'whatever (Mozilla 5.0/compatible)');
- $this->assertEquals($request->protocol(), 'HTTP/1.1');
- $this->assertEquals($request->referrer(), 'http://example.com/');
- $this->assertEquals($request->requested_with(), 'ajax-or-something');
- $this->assertEquals($request->query(), array());
- $this->assertEquals($request->post(), array());
- }
- /**
- * Tests that the allow_external flag prevents an external request.
- *
- * @return null
- */
- public function test_disable_external_tests()
- {
- $this->setEnvironment(
- array(
- 'Request::$initial' => NULL,
- )
- );
- $request = new Request('http://www.google.com/', array(), FALSE);
- $this->assertEquals(FALSE, $request->is_external());
- }
- /**
- * Provides the data for test_create()
- * @return array
- */
- public function provider_create()
- {
- return array(
- array('foo/bar', 'Request_Client_Internal'),
- array('http://google.com', 'Request_Client_External'),
- );
- }
- /**
- * Ensures the create class is created with the correct client
- *
- * @test
- * @dataProvider provider_create
- */
- public function test_create($uri, $client_class)
- {
- $request = Request::factory($uri);
- $this->assertInstanceOf($client_class, $request->client());
- }
- /**
- * Ensure that parameters can be read
- *
- * @test
- */
- public function test_param()
- {
- $route = new Route('(<controller>(/<action>(/<id>)))');
- $uri = 'foo/bar/id';
- $request = Request::factory($uri, NULL, TRUE, array($route));
- // We need to execute the request before it has matched a route
- try
- {
- $request->execute();
- }
- catch (Exception $e) {}
- $this->assertArrayHasKey('id', $request->param());
- $this->assertArrayNotHasKey('foo', $request->param());
- $this->assertEquals($request->uri(), $uri);
- // Ensure the params do not contain contamination from controller, action, route, uri etc etc
- $params = $request->param();
- // Test for illegal components
- $this->assertArrayNotHasKey('controller', $params);
- $this->assertArrayNotHasKey('action', $params);
- $this->assertArrayNotHasKey('directory', $params);
- $this->assertArrayNotHasKey('uri', $params);
- $this->assertArrayNotHasKey('route', $params);
- $route = new Route('(<uri>)', array('uri' => '.+'));
- $route->defaults(array('controller' => 'foobar', 'action' => 'index'));
- $request = Request::factory('foobar', NULL, TRUE, array($route));
- // We need to execute the request before it has matched a route
- try
- {
- $request->execute();
- }
- catch (Exception $e) {}
- $this->assertSame('foobar', $request->param('uri'));
- }
- /**
- * Tests Request::method()
- *
- * @test
- */
- public function test_method()
- {
- $request = Request::factory('foo/bar');
- $this->assertEquals($request->method(), 'GET');
- $this->assertEquals(($request->method('post') === $request), TRUE);
- $this->assertEquals(($request->method() === 'POST'), TRUE);
- }
- /**
- * Tests Request::route()
- *
- * @test
- */
- public function test_route()
- {
- $request = Request::factory(''); // This should always match something, no matter what changes people make
- // We need to execute the request before it has matched a route
- try
- {
- $request->execute();
- }
- catch (Exception $e) {}
- $this->assertInstanceOf('Route', $request->route());
- }
- /**
- * Tests Request::route()
- *
- * @test
- */
- public function test_route_is_not_set_before_execute()
- {
- $request = Request::factory(''); // This should always match something, no matter what changes people make
- // The route should be NULL since the request has not been executed yet
- $this->assertEquals($request->route(), NULL);
- }
- /**
- * Tests Request::accept_type()
- *
- * @test
- * @covers Request::accept_type
- */
- public function test_accept_type()
- {
- $this->assertEquals(array('*/*' => 1), Request::accept_type());
- }
- /**
- * Provides test data for Request::accept_lang()
- * @return array
- */
- public function provider_accept_lang()
- {
- return array(
- array('en-us', 1, array('_SERVER' => array('HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5'))),
- array('en-us', 1, array('_SERVER' => array('HTTP_ACCEPT_LANGUAGE' => 'en-gb'))),
- array('en-us', 1, array('_SERVER' => array('HTTP_ACCEPT_LANGUAGE' => 'sp-sp;q=0.5')))
- );
- }
- /**
- * Tests Request::accept_lang()
- *
- * @test
- * @covers Request::accept_lang
- * @dataProvider provider_accept_lang
- * @param array $params Query string
- * @param string $expected Expected result
- * @param array $enviroment Set environment
- */
- public function test_accept_lang($params, $expected, $enviroment)
- {
- $this->setEnvironment($enviroment);
- $this->assertEquals(
- $expected,
- Request::accept_lang($params)
- );
- }
- /**
- * Provides test data for Request::url()
- * @return array
- */
- public function provider_url()
- {
- return array(
- array(
- 'foo/bar',
- 'http',
- 'http://localhost/kohana/foo/bar'
- ),
- array(
- 'foo',
- 'http',
- 'http://localhost/kohana/foo'
- ),
- );
- }
- /**
- * Tests Request::url()
- *
- * @test
- * @dataProvider provider_url
- * @covers Request::url
- * @param string $uri the uri to use
- * @param string $protocol the protocol to use
- * @param array $expected The string we expect
- */
- public function test_url($uri, $protocol, $expected)
- {
- if ( ! isset($_SERVER['argc']))
- {
- $_SERVER['argc'] = 1;
- }
- $this->setEnvironment(array(
- 'Kohana::$base_url' => '/kohana/',
- '_SERVER' => array('HTTP_HOST' => 'localhost', 'argc' => $_SERVER['argc']),
- 'Kohana::$index_file' => FALSE,
- ));
- $this->assertEquals(Request::factory($uri)->url($protocol), $expected);
- }
- /**
- * Data provider for test_set_protocol() test
- *
- * @return array
- */
- public function provider_set_protocol()
- {
- return array(
- array(
- 'http/1.1',
- 'HTTP/1.1',
- ),
- array(
- 'ftp',
- 'FTP',
- ),
- array(
- 'hTTp/1.0',
- 'HTTP/1.0',
- ),
- );
- }
- /**
- * Tests the protocol() method
- *
- * @dataProvider provider_set_protocol
- *
- * @return null
- */
- public function test_set_protocol($protocol, $expected)
- {
- $request = Request::factory();
- // Set the supplied protocol
- $result = $request->protocol($protocol);
- // Test the set value
- $this->assertSame($expected, $request->protocol());
- // Test the return value
- $this->assertTrue($request instanceof $result);
- }
- /**
- * Provides data for test_post_max_size_exceeded()
- *
- * @return array
- */
- public function provider_post_max_size_exceeded()
- {
- // Get the post max size
- $post_max_size = Num::bytes(ini_get('post_max_size'));
- return array(
- array(
- $post_max_size+200000,
- TRUE
- ),
- array(
- $post_max_size-20,
- FALSE
- ),
- array(
- $post_max_size,
- FALSE
- )
- );
- }
- /**
- * Tests the post_max_size_exceeded() method
- *
- * @dataProvider provider_post_max_size_exceeded
- *
- * @param int content_length
- * @param bool expected
- * @return void
- */
- public function test_post_max_size_exceeded($content_length, $expected)
- {
- // Ensure the request method is set to POST
- Request::$initial->method(HTTP_Request::POST);
- // Set the content length
- $_SERVER['CONTENT_LENGTH'] = $content_length;
- // Test the post_max_size_exceeded() method
- $this->assertSame(Request::post_max_size_exceeded(), $expected);
- }
- /**
- * Provides data for test_uri_only_trimed_on_internal()
- *
- * @return array
- */
- public function provider_uri_only_trimed_on_internal()
- {
- $old_request = Request::$initial;
- Request::$initial = new Request(TRUE);
- $result = array(
- array(
- new Request('http://www.google.com'),
- 'http://www.google.com'
- ),
- array(
- new Request('http://www.google.com/'),
- 'http://www.google.com/'
- ),
- array(
- new Request('foo/bar/'),
- 'foo/bar'
- ),
- array(
- new Request('foo/bar'),
- 'foo/bar'
- ),
- array(
- new Request('/'),
- '/'
- ),
- array(
- new Request(''),
- '/'
- )
- );
- Request::$initial = $old_request;
- return $result;
- }
- /**
- * Tests that the uri supplied to Request is only trimed
- * for internal requests.
- *
- * @dataProvider provider_uri_only_trimed_on_internal
- *
- * @return void
- */
- public function test_uri_only_trimed_on_internal(Request $request, $expected)
- {
- $this->assertSame($request->uri(), $expected);
- }
- /**
- * Data provider for test_options_set_to_external_client()
- *
- * @return array
- */
- public function provider_options_set_to_external_client()
- {
- $provider = array(
- array(
- array(
- CURLOPT_PROXYPORT => 8080,
- CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
- CURLOPT_VERBOSE => TRUE
- ),
- array(
- CURLOPT_PROXYPORT => 8080,
- CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
- CURLOPT_VERBOSE => TRUE
- )
- )
- );
- return $provider;
- }
- /**
- * Test for Request_Client_External::options() to ensure options
- * can be set to the external client (for cURL and PECL_HTTP)
- *
- * @dataProvider provider_options_set_to_external_client
- *
- * @param array settings
- * @param array expected
- * @return void
- */
- public function test_options_set_to_external_client($settings, $expected)
- {
- $request_client = Request_Client_External::factory(array(), 'Request_Client_Curl');
- // Test for empty array
- $this->assertSame(array(), $request_client->options());
- // Test that set works as expected
- $this->assertSame($request_client->options($settings), $request_client);
- // Test that each setting is present and returned
- foreach ($expected as $key => $value)
- {
- $this->assertSame($request_client->options($key), $value);
- }
- }
- /**
- * Provides data for test_headers_get()
- *
- * @return array
- */
- public function provider_headers_get()
- {
- $x_powered_by = 'Kohana Unit Test';
- $content_type = 'application/x-www-form-urlencoded';
- return array(
- array(
- $request = Request::factory('foo/bar')
- ->headers(array(
- 'x-powered-by' => $x_powered_by,
- 'content-type' => $content_type
- )
- ),
- array(
- 'x-powered-by' => $x_powered_by,
- 'content-type' => $content_type
- )
- )
- );
- }
- /**
- * Tests getting headers from the Request object
- *
- * @dataProvider provider_headers_get
- *
- * @param Request request to test
- * @param array headers to test against
- * @return void
- */
- public function test_headers_get($request, $headers)
- {
- foreach ($headers as $key => $expected_value)
- {
- $this->assertSame( (string) $request->headers($key), $expected_value);
- }
- }
- /**
- * Provides data for test_headers_set
- *
- * @return array
- */
- public function provider_headers_set()
- {
- return array(
- array(
- Request::factory(),
- array(
- 'content-type' => 'application/x-www-form-urlencoded',
- 'x-test-header' => 'foo'
- ),
- "Content-Type: application/x-www-form-urlencoded\r\nX-Test-Header: foo\r\n\r\n"
- ),
- array(
- Request::factory(),
- array(
- 'content-type' => 'application/json',
- 'x-powered-by' => 'kohana'
- ),
- "Content-Type: application/json\r\nX-Powered-By: kohana\r\n\r\n"
- )
- );
- }
- /**
- * Tests the setting of headers to the request object
- *
- * @dataProvider provider_headers_set
- *
- * @param Request request object
- * @param array header(s) to set to the request object
- * @param string expected http header
- * @return void
- */
- public function test_headers_set(Request $request, $headers, $expected)
- {
- $request->headers($headers);
- $this->assertSame($expected, (string) $request->headers());
- }
- /**
- * Provides test data for test_query_parameter_parsing()
- *
- * @return array
- */
- public function provider_query_parameter_parsing()
- {
- return array(
- array(
- new Request('foo/bar'),
- array(
- 'foo' => 'bar',
- 'sna' => 'fu'
- ),
- array(
- 'foo' => 'bar',
- 'sna' => 'fu'
- ),
- ),
- array(
- new Request('foo/bar?john=wayne&peggy=sue'),
- array(
- 'foo' => 'bar',
- 'sna' => 'fu'
- ),
- array(
- 'john' => 'wayne',
- 'peggy' => 'sue',
- 'foo' => 'bar',
- 'sna' => 'fu'
- ),
- ),
- array(
- new Request('http://host.tld/foo/bar?john=wayne&peggy=sue'),
- array(
- 'foo' => 'bar',
- 'sna' => 'fu'
- ),
- array(
- 'john' => 'wayne',
- 'peggy' => 'sue',
- 'foo' => 'bar',
- 'sna' => 'fu'
- ),
- ),
- );
- }
- /**
- * Tests that query parameters are parsed correctly
- *
- * @dataProvider provider_query_parameter_parsing
- *
- * @param Request request
- * @param array query
- * @param array expected
- * @return void
- */
- public function test_query_parameter_parsing(Request $request, $query, $expected)
- {
- foreach ($query as $key => $value)
- {
- $request->query($key, $value);
- }
- $this->assertSame($expected, $request->query());
- }
- /**
- * Provides data for test_client
- *
- * @return array
- */
- public function provider_client()
- {
- $internal_client = new Request_Client_Internal;
- $external_client = new Request_Client_Stream;
- return array(
- array(
- new Request('http://kohanaframework.org'),
- $internal_client,
- $internal_client
- ),
- array(
- new Request('foo/bar'),
- $external_client,
- $external_client
- )
- );
- }
- /**
- * Tests the getter/setter for request client
- *
- * @dataProvider provider_client
- *
- * @param Request $request
- * @param Request_Client $client
- * @param Request_Client $expected
- * @return void
- */
- public function test_client(Request $request, Request_Client $client, Request_Client $expected)
- {
- $request->client($client);
- $this->assertSame($expected, $request->client());
- }
- /**
- * Tests that the Request constructor passes client params on to the
- * Request_Client once created.
- */
- public function test_passes_client_params()
- {
- $request = Request::factory('http://example.com/', array(
- 'follow' => TRUE,
- 'strict_redirect' => FALSE
- ));
- $client = $request->client();
- $this->assertEquals($client->follow(), TRUE);
- $this->assertEquals($client->strict_redirect(), FALSE);
- }
- } // End Kohana_RequestTest
- class Controller_Kohana_RequestTest_Dummy extends Controller
- {
- public function action_index()
- {
-
- }
- } // End Kohana_RequestTest
|