Yii2 framework backup
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.

194 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;
}
}