You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.5 KiB
193 lines
4.5 KiB
<?php |
|
|
|
namespace yiiunit\framework\behaviors; |
|
|
|
use PHPUnit_Framework_MockObject_MockObject; |
|
use yii\base\Widget; |
|
use yii\behaviors\CacheableWidgetBehavior; |
|
use yiiunit\TestCase; |
|
|
|
/** |
|
* Unit test for [[\yii\behaviors\CacheableWidgetBehavior]]. |
|
* |
|
* @see CacheableWidgetBehavior |
|
* @group behaviors |
|
*/ |
|
class CacheableWidgetBehaviorTest extends TestCase |
|
{ |
|
/** |
|
* Default-initialized simple cacheable widget mock. |
|
* |
|
* @var PHPUnit_Framework_MockObject_MockObject|SimpleCacheableWidget|CacheableWidgetBehavior |
|
*/ |
|
private $simpleWidget; |
|
|
|
/** |
|
* Default-initialized dynamic cacheable widget mock. |
|
* |
|
* @var PHPUnit_Framework_MockObject_MockObject|DynamicCacheableWidget|CacheableWidgetBehavior |
|
*/ |
|
private $dynamicWidget; |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
protected function setUp() |
|
{ |
|
$this->initializeApplicationMock(); |
|
$this->initializeWidgetMocks(); |
|
} |
|
|
|
/** |
|
* @throws \Exception |
|
*/ |
|
public function testWidgetIsRunWhenCacheIsEmpty() |
|
{ |
|
$this->simpleWidget |
|
->expects($this->once()) |
|
->method('run'); |
|
|
|
$contents = $this->simpleWidget->test(); |
|
$this->assertEquals('contents', $contents); |
|
} |
|
|
|
/** |
|
* @throws \Exception |
|
*/ |
|
public function testWidgetIsNotRunWhenCacheIsNotEmpty() |
|
{ |
|
$this->simpleWidget->cacheDuration = 0; |
|
$this->simpleWidget |
|
->expects($this->once()) |
|
->method('run'); |
|
|
|
for ($counter = 0; $counter <= 1; $counter++) { |
|
$this->assertEquals('contents', $this->simpleWidget->test()); |
|
} |
|
} |
|
|
|
/** |
|
* @throws \Exception |
|
*/ |
|
public function testDynamicContent() |
|
{ |
|
$this->dynamicWidget->cacheDuration = 0; |
|
$this->dynamicWidget |
|
->expects($this->once()) |
|
->method('run'); |
|
|
|
for ($counter = 0; $counter <= 1; $counter++) { |
|
$expectedContents = sprintf('<div>dynamic contents: %d</div>', $counter); |
|
$this->assertEquals($expectedContents, $this->dynamicWidget->test()); |
|
} |
|
} |
|
|
|
/** |
|
* Initializes a mock application. |
|
* |
|
*/ |
|
private function initializeApplicationMock() |
|
{ |
|
$this->mockApplication([ |
|
'components' => [ |
|
'cache' => [ |
|
'class' => '\yii\caching\ArrayCache', |
|
], |
|
], |
|
'params' => [ |
|
// Counter for dynamic contents testing. |
|
'counter' => 0, |
|
], |
|
]); |
|
} |
|
|
|
/** |
|
* Initializes mock widgets. |
|
* |
|
*/ |
|
private function initializeWidgetMocks() |
|
{ |
|
$this->simpleWidget = $this->getWidgetMock(SimpleCacheableWidget::className()); |
|
$this->dynamicWidget = $this->getWidgetMock(DynamicCacheableWidget::className()); |
|
} |
|
|
|
/** |
|
* Returns a widget mock. |
|
* @param $widgetClass |
|
* @return PHPUnit_Framework_MockObject_MockObject |
|
*/ |
|
private function getWidgetMock($widgetClass) |
|
{ |
|
$widgetMock = $this->getMockBuilder($widgetClass) |
|
->setMethods(['run']) |
|
->enableOriginalConstructor() |
|
->enableProxyingToOriginalMethods() |
|
->getMock(); |
|
|
|
return $widgetMock; |
|
} |
|
} |
|
|
|
class BaseCacheableWidget extends Widget |
|
{ |
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function test() |
|
{ |
|
ob_start(); |
|
ob_implicit_flush(false); |
|
try { |
|
$out = ''; |
|
if ($this->beforeRun()) { |
|
$result = $this->run(); |
|
$out = $this->afterRun($result); |
|
} |
|
} catch (\Exception $exception) { |
|
if (ob_get_level() > 0) { |
|
ob_end_clean(); |
|
} |
|
throw $exception; |
|
} |
|
|
|
return ob_get_clean() . $out; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function behaviors() |
|
{ |
|
return [ |
|
'cacheable' => 'yii\behaviors\CacheableWidgetBehavior', |
|
]; |
|
} |
|
} |
|
|
|
class SimpleCacheableWidget extends BaseCacheableWidget |
|
{ |
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function run() |
|
{ |
|
$content = 'contents'; |
|
|
|
return $content; |
|
} |
|
} |
|
|
|
class DynamicCacheableWidget extends BaseCacheableWidget |
|
{ |
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function run() |
|
{ |
|
$dynamicContentsExpression = 'return "dynamic contents: " . \Yii::$app->params["counter"]++;'; |
|
$dynamicContents = $this->view->renderDynamic($dynamicContentsExpression); |
|
$content = '<div>' . $dynamicContents . '</div>'; |
|
|
|
return $content; |
|
} |
|
}
|
|
|