mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			149 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
/**
 | 
						||
 * @link https://www.yiiframework.com/
 | 
						||
 * @copyright Copyright (c) 2008 Yii Software LLC
 | 
						||
 * @license https://www.yiiframework.com/license/
 | 
						||
 */
 | 
						||
 | 
						||
namespace yiiunit\framework\web;
 | 
						||
 | 
						||
use Yii;
 | 
						||
use yii\web\NotFoundHttpException;
 | 
						||
use yii\web\View;
 | 
						||
use yiiunit\TestCase;
 | 
						||
 | 
						||
class ErrorHandlerTest extends TestCase
 | 
						||
{
 | 
						||
    protected function setUp()
 | 
						||
    {
 | 
						||
        parent::setUp();
 | 
						||
        $this->mockWebApplication([
 | 
						||
            'controllerNamespace' => 'yiiunit\\data\\controllers',
 | 
						||
            'components' => [
 | 
						||
                'errorHandler' => [
 | 
						||
                    'class' => 'yiiunit\framework\web\ErrorHandler',
 | 
						||
                    'errorView' => '@yiiunit/data/views/errorHandler.php',
 | 
						||
                    'exceptionView' => '@yiiunit/data/views/errorHandlerForAssetFiles.php',
 | 
						||
                ],
 | 
						||
            ],
 | 
						||
        ]);
 | 
						||
    }
 | 
						||
 | 
						||
    public function testCorrectResponseCodeInErrorView()
 | 
						||
    {
 | 
						||
        /** @var ErrorHandler $handler */
 | 
						||
        $handler = Yii::$app->getErrorHandler();
 | 
						||
        ob_start(); // suppress response output
 | 
						||
        $this->invokeMethod($handler, 'renderException', [new NotFoundHttpException('This message is displayed to end user')]);
 | 
						||
        ob_get_clean();
 | 
						||
        $out = Yii::$app->response->data;
 | 
						||
        $this->assertEquals('Code: 404
 | 
						||
Message: This message is displayed to end user
 | 
						||
Exception: yii\web\NotFoundHttpException', $out);
 | 
						||
    }
 | 
						||
 | 
						||
    public function testClearAssetFilesInErrorView()
 | 
						||
    {
 | 
						||
        Yii::$app->getView()->registerJsFile('somefile.js');
 | 
						||
        /** @var ErrorHandler $handler */
 | 
						||
        $handler = Yii::$app->getErrorHandler();
 | 
						||
        ob_start(); // suppress response output
 | 
						||
        $this->invokeMethod($handler, 'renderException', [new \Exception('Some Exception')]);
 | 
						||
        ob_get_clean();
 | 
						||
        $out = Yii::$app->response->data;
 | 
						||
        $this->assertEquals('Exception View
 | 
						||
', $out);
 | 
						||
    }
 | 
						||
 | 
						||
    public function testClearAssetFilesInErrorActionView()
 | 
						||
    {
 | 
						||
        Yii::$app->getErrorHandler()->errorAction = 'test/error';
 | 
						||
        Yii::$app->getView()->registerJs("alert('hide me')", View::POS_END);
 | 
						||
 | 
						||
        /** @var ErrorHandler $handler */
 | 
						||
        $handler = Yii::$app->getErrorHandler();
 | 
						||
        ob_start(); // suppress response output
 | 
						||
        $this->invokeMethod($handler, 'renderException', [new NotFoundHttpException()]);
 | 
						||
        ob_get_clean();
 | 
						||
        $out = Yii::$app->response->data;
 | 
						||
        $this->assertNotContains('<script', $out);
 | 
						||
    }
 | 
						||
 | 
						||
    public function testRenderCallStackItem()
 | 
						||
    {
 | 
						||
        $handler = Yii::$app->getErrorHandler();
 | 
						||
        $handler->traceLine = '<a href="netbeans://open?file={file}&line={line}">{html}</a>';
 | 
						||
        $file = \yii\BaseYii::getAlias('@yii/web/Application.php');
 | 
						||
 | 
						||
        $out = $handler->renderCallStackItem($file, 63, \yii\web\Application::className(), null, null, null);
 | 
						||
 | 
						||
        $this->assertContains('<a href="netbeans://open?file=' . $file . '&line=63">', $out);
 | 
						||
    }
 | 
						||
 | 
						||
    public function dataHtmlEncode()
 | 
						||
    {
 | 
						||
        return [
 | 
						||
            [
 | 
						||
                "a \t=<>&\"'\x80`\n",
 | 
						||
                "a \t=<>&\"'<27>`\n",
 | 
						||
            ],
 | 
						||
            [
 | 
						||
                '<b>test</b>',
 | 
						||
                '<b>test</b>',
 | 
						||
            ],
 | 
						||
            [
 | 
						||
                '"hello"',
 | 
						||
                '"hello"',
 | 
						||
            ],
 | 
						||
            [
 | 
						||
                "'hello world'",
 | 
						||
                "'hello world'",
 | 
						||
            ],
 | 
						||
            [
 | 
						||
                'Chip&Dale',
 | 
						||
                'Chip&amp;Dale',
 | 
						||
            ],
 | 
						||
            [
 | 
						||
                "\t\$x=24;",
 | 
						||
                "\t\$x=24;",
 | 
						||
            ],
 | 
						||
        ];
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * @dataProvider dataHtmlEncode
 | 
						||
     */
 | 
						||
    public function testHtmlEncode($text, $expected)
 | 
						||
    {
 | 
						||
        $handler = Yii::$app->getErrorHandler();
 | 
						||
 | 
						||
        $this->assertSame($expected, $handler->htmlEncode($text));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testHtmlEncodeWithUnicodeSequence()
 | 
						||
    {
 | 
						||
        if (PHP_VERSION_ID < 70000) {
 | 
						||
            $this->markTestSkipped('Can not be tested on PHP < 7.0');
 | 
						||
            return;
 | 
						||
        }
 | 
						||
 | 
						||
        $handler = Yii::$app->getErrorHandler();
 | 
						||
 | 
						||
        $text = "a \t=<>&\"'\x80\u{20bd}`\u{000a}\u{000c}\u{0000}";
 | 
						||
        $expected = "a \t=<>&\"'<27>₽`\n\u{000c}\u{0000}";
 | 
						||
 | 
						||
        $this->assertSame($expected, $handler->htmlEncode($text));
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
class ErrorHandler extends \yii\web\ErrorHandler
 | 
						||
{
 | 
						||
    /**
 | 
						||
     * @return bool if simple HTML should be rendered
 | 
						||
     */
 | 
						||
    protected function shouldRenderSimpleHtml()
 | 
						||
    {
 | 
						||
        return false;
 | 
						||
    }
 | 
						||
}
 |