Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

<?php
/**
 * JsonViewTest file
 *
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
 * @package       Cake.Test.Case.View
 * @since         CakePHP(tm) v 2.1.0
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('Controller', 'Controller');
App::uses('CakeRequest', 'Network');
App::uses('CakeResponse', 'Network');
App::uses('JsonView', 'View');

/**
 * JsonViewTest
 *
 * @package       Cake.Test.Case.View
 */
class JsonViewTest extends CakeTestCase {

        public function setUp() {
                parent::setUp();
                Configure::write('debug', 0);
        }

/**
 * Generates testRenderWithoutView data.
 *
 * Note: array($data, $serialize, expected)
 *
 * @return void
 */
        public static function renderWithoutViewProvider() {
                return array(
                        // Test render with a valid string in _serialize.
                        array(
                                array('data' => array('user' => 'fake', 'list' => array('item1', 'item2'))),
                                'data',
                                json_encode(array('user' => 'fake', 'list' => array('item1', 'item2')))
                        ),

                        // Test render with a string with an invalid key in _serialize.
                        array(
                                array('data' => array('user' => 'fake', 'list' => array('item1', 'item2'))),
                                'no_key',
                                json_encode(null)
                        ),

                        // Test render with a valid array in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                array('no', 'user'),
                                json_encode(array('no' => 'nope', 'user' => 'fake'))
                        ),

                        // Test render with an empty array in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                array(),
                                json_encode(null)
                        ),

                        // Test render with a valid array with an invalid key in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                array('no', 'user', 'no_key'),
                                json_encode(array('no' => 'nope', 'user' => 'fake'))
                        ),

                        // Test render with a valid array with only an invalid key in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                array('no_key'),
                                json_encode(null)
                        ),

                        // Test render with Null in _serialize (unset).
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                null,
                                null
                        ),

                        // Test render with False in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                false,
                                json_encode(null)
                        ),

                        // Test render with True in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                true,
                                json_encode(null)
                        ),

                        // Test render with empty string in _serialize.
                        array(
                                array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                '',
                                json_encode(null)
                        ),

                        // Test render with a valid array in _serialize and alias.
                        array(
                                array('original_name' => 'my epic name', 'user' => 'fake', 'list' => array('item1', 'item2')),
                                array('new_name' => 'original_name', 'user'),
                                json_encode(array('new_name' => 'my epic name', 'user' => 'fake'))
                        ),

                        // Test render with an a valid array in _serialize and alias of a null value.
                        array(
                                array('null' => null),
                                array('null'),
                                json_encode(array('null' => null))
                        ),

                        // Test render with a False value to be serialized.
                        array(
                                array('false' => false),
                                'false',
                                json_encode(false)
                        ),

                        // Test render with a True value to be serialized.
                        array(
                                array('true' => true),
                                'true',
                                json_encode(true)
                        ),

                        // Test render with an empty string value to be serialized.
                        array(
                                array('empty' => ''),
                                'empty',
                                json_encode('')
                        ),

                        // Test render with a zero value to be serialized.
                        array(
                                array('zero' => 0),
                                'zero',
                                json_encode(0)
                        ),
                );
        }

/**
 * Test render with a valid string in _serialize.
 *
 * @dataProvider renderWithoutViewProvider
 * @return void
 */
        public function testRenderWithoutView($data, $serialize, $expected) {
                $Request = new CakeRequest();
                $Response = new CakeResponse();
                $Controller = new Controller($Request, $Response);

                $Controller->set($data);
                $Controller->set('_serialize', $serialize);
                $View = new JsonView($Controller);
                $output = $View->render(false);

                $this->assertSame($expected, $output);
        }

/**
 * Test that rendering with _serialize does not load helpers.
 *
 * @return void
 */
        public function testRenderSerializeNoHelpers() {
                $Request = new CakeRequest();
                $Response = new CakeResponse();
                $Controller = new Controller($Request, $Response);

                $Controller->helpers = array('Html');
                $Controller->set(array(
                        'tags' => array('cakephp', 'framework'),
                        '_serialize' => 'tags'
                ));
                $View = new JsonView($Controller);
                $View->render();

                $this->assertFalse(isset($View->Html), 'No helper loaded.');
        }

/**
 * testJsonpResponse method
 *
 * @return void
 */
        public function testJsonpResponse() {
                $Request = new CakeRequest();
                $Response = new CakeResponse();
                $Controller = new Controller($Request, $Response);

                $data = array('user' => 'fake', 'list' => array('item1', 'item2'));
                $Controller->set(array(
                        'data' => $data,
                        '_serialize' => 'data',
                        '_jsonp' => true
                ));
                $View = new JsonView($Controller);
                $output = $View->render(false);

                $this->assertSame(json_encode($data), $output);
                $this->assertSame('application/json', $Response->type());

                $View->request->query = array('callback' => 'jfunc');
                $output = $View->render(false);
                $expected = 'jfunc(' . json_encode($data) . ')';
                $this->assertSame($expected, $output);
                $this->assertSame('application/javascript', $Response->type());

                $View->request->query = array('jsonCallback' => 'jfunc');
                $View->viewVars['_jsonp'] = 'jsonCallback';
                $output = $View->render(false);
                $expected = 'jfunc(' . json_encode($data) . ')';
                $this->assertSame($expected, $output);
        }

/**
 * Test render with a View file specified.
 *
 * @return void
 */
        public function testRenderWithView() {
                App::build(array(
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
                ));
                $Request = new CakeRequest();
                $Response = new CakeResponse();
                $Controller = new Controller($Request, $Response);
                $Controller->name = $Controller->viewPath = 'Posts';

                $data = array(
                        'User' => array(
                                'username' => 'fake'
                        ),
                        'Item' => array(
                                array('name' => 'item1'),
                                array('name' => 'item2')
                        )
                );
                $Controller->set('user', $data);
                $View = new JsonView($Controller);
                $output = $View->render('index');

                $expected = json_encode(array('user' => 'fake', 'list' => array('item1', 'item2'), 'paging' => null));
                $this->assertSame($expected, $output);
                $this->assertSame('application/json', $Response->type());
        }

/**
 * Test render with a View file specified and named parameters.
 *
 * @return void
 */
        public function testRenderWithViewAndNamed() {
                App::build(array(
                        'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
                ));
                $Request = new CakeRequest(null, false);
                $Request->params['named'] = array('page' => 2);
                $Response = new CakeResponse();
                $Controller = new Controller($Request, $Response);
                $Controller->name = $Controller->viewPath = 'Posts';

                $data = array(
                        'User' => array(
                                'username' => 'fake'
                        ),
                        'Item' => array(
                                array('name' => 'item1'),
                                array('name' => 'item2')
                        )
                );
                $Controller->set('user', $data);
                $Controller->helpers = array('Paginator');
                $View = new JsonView($Controller);
                $output = $View->render('index');

                $expected = array('user' => 'fake', 'list' => array('item1', 'item2'), 'paging' => array('page' => 2));
                $this->assertSame(json_encode($expected), $output);
                $this->assertSame('application/json', $Response->type());

                $View->request->query = array('jsonCallback' => 'jfunc');
                $Controller->set('_jsonp', 'jsonCallback');
                $View = new JsonView($Controller);
                $View->helpers = array('Paginator');
                $output = $View->render('index');
                $expected['paging']['?']['jsonCallback'] = 'jfunc';
                $expected = 'jfunc(' . json_encode($expected) . ')';
                $this->assertSame($expected, $output);
                $this->assertSame('application/javascript', $Response->type());
        }
}