Browse Source

Covered more cases for #162, #163. Better tests.

tags/2.0.7
Alexander Makarov 8 years ago
parent
commit
234ccf6a4c
  1. 7
      Nav.php
  2. 152
      tests/NavTest.php

7
Nav.php

@ -192,9 +192,7 @@ class Nav extends Widget
$label .= ' ' . $this->dropDownCaret; $label .= ' ' . $this->dropDownCaret;
} }
if (is_array($items)) { if (is_array($items)) {
if ($this->activateItems) { $items = $this->isChildActive($items, $active);
$items = $this->isChildActive($items, $active);
}
$items = $this->renderDropdown($items, $item); $items = $this->renderDropdown($items, $item);
} }
} }
@ -258,6 +256,9 @@ class Nav extends Widget
*/ */
protected function isItemActive($item) protected function isItemActive($item)
{ {
if (!$this->activateItems) {
return false;
}
if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) { if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) {
$route = $item['url'][0]; $route = $item['url'][0];
if ($route[0] !== '/' && Yii::$app->controller) { if ($route[0] !== '/' && Yii::$app->controller) {

152
tests/NavTest.php

@ -1,7 +1,10 @@
<?php <?php
namespace yiiunit\extensions\bootstrap; namespace yiiunit\extensions\bootstrap;
use yii\base\Action;
use yii\base\Module;
use yii\bootstrap\Nav; use yii\bootstrap\Nav;
use yii\web\Controller;
/** /**
* Tests for Nav widget * Tests for Nav widget
@ -10,6 +13,26 @@ use yii\bootstrap\Nav;
*/ */
class NavTest extends TestCase class NavTest extends TestCase
{ {
protected function setUp()
{
$this->mockWebApplication([
'components' => [
'request' => [
'class' => 'yii\web\Request',
'scriptUrl' => '/base/index.php',
'hostInfo' => 'http://example.com/',
'url' => '/base/index.php&r=site%2Fcurrent&id=42'
],
'urlManager' => [
'class' => 'yii\web\UrlManager',
'baseUrl' => '/base',
'scriptUrl' => '/base/index.php',
'hostInfo' => 'http://example.com/',
]
],
]);
}
public function testIds() public function testIds()
{ {
Nav::$counter = 0; Nav::$counter = 0;
@ -125,27 +148,150 @@ EXPECTED;
*/ */
public function testExplicitActive() public function testExplicitActive()
{ {
$this->mockAction('site', 'index');
Nav::$counter = 0; Nav::$counter = 0;
$out = Nav::widget([ $out = Nav::widget([
'activateItems' => false, 'activateItems' => false,
'items' => [ 'items' => [
[ [
'label' => 'Item1', 'label' => 'Item1',
//'url' => ['some/route1'],
'active' => true, 'active' => true,
], ],
[ [
'label' => 'Item2', 'label' => 'Item2',
//'url' => ['some/route2'], 'url' => ['site/index'],
],
],
]);
$expected = <<<EXPECTED
<ul id="w0" class="nav"><li class="active"><a href="#">Item1</a></li>
<li><a href="/base/index.php?r=site%2Findex">Item2</a></li></ul>
EXPECTED;
$this->assertEqualsWithoutLE($expected, $out);
$this->removeMockedAction();
}
/**
* @see https://github.com/yiisoft/yii2-bootstrap/issues/162
*/
public function testImplicitActive()
{
$this->mockAction('site', 'index');
Nav::$counter = 0;
$out = Nav::widget([
'items' => [
[
'label' => 'Item1',
'active' => true,
],
[
'label' => 'Item2',
'url' => ['site/index'],
], ],
], ],
]); ]);
$expected = <<<EXPECTED $expected = <<<EXPECTED
<ul id="w0" class="nav"><li class="active"><a href="#">Item1</a></li> <ul id="w0" class="nav"><li class="active"><a href="#">Item1</a></li>
<li><a href="#">Item2</a></li></ul> <li class="active"><a href="/base/index.php?r=site%2Findex">Item2</a></li></ul>
EXPECTED;
$this->assertEqualsWithoutLE($expected, $out);
$this->removeMockedAction();
}
/**
* @see https://github.com/yiisoft/yii2-bootstrap/issues/162
*/
public function testExplicitActiveSubitems()
{
$this->mockAction('site', 'index');
Nav::$counter = 0;
$out = Nav::widget([
'activateItems' => false,
'items' => [
[
'label' => 'Item1',
],
[
'label' => 'Item2',
'items' => [
['label' => 'Page2', 'content' => 'Page2', 'url' => ['site/index']],
['label' => 'Page3', 'content' => 'Page3', 'active' => true],
],
],
],
]);
$expected = <<<EXPECTED
<ul id="w0" class="nav"><li><a href="#">Item1</a></li>
<li class="dropdown"><a class="dropdown-toggle" href="#" data-toggle="dropdown">Item2 <span class="caret"></span></a><ul id="w1" class="dropdown-menu"><li><a href="/base/index.php?r=site%2Findex" tabindex="-1">Page2</a></li>
<li class="active dropdown-header">Page3</li></ul></li></ul>
EXPECTED;
$this->assertEqualsWithoutLE($expected, $out);
$this->removeMockedAction();
}
/**
* @see https://github.com/yiisoft/yii2-bootstrap/issues/162
*/
public function testImplicitActiveSubitems()
{
$this->mockAction('site', 'index');
Nav::$counter = 0;
$out = Nav::widget([
'items' => [
[
'label' => 'Item1',
],
[
'label' => 'Item2',
'items' => [
['label' => 'Page2', 'content' => 'Page2', 'url' => ['site/index']],
['label' => 'Page3', 'content' => 'Page3', 'active' => true],
],
],
],
]);
$expected = <<<EXPECTED
<ul id="w0" class="nav"><li><a href="#">Item1</a></li>
<li class="dropdown"><a class="dropdown-toggle" href="#" data-toggle="dropdown">Item2 <span class="caret"></span></a><ul id="w1" class="dropdown-menu"><li class="active"><a href="/base/index.php?r=site%2Findex" tabindex="-1">Page2</a></li>
<li class="active dropdown-header">Page3</li></ul></li></ul>
EXPECTED; EXPECTED;
$this->assertEqualsWithoutLE($expected, $out); $this->assertEqualsWithoutLE($expected, $out);
$this->removeMockedAction();
} }
/**
* Mocks controller action with parameters
*
* @param string $controllerId
* @param string $actionID
* @param string $moduleID
* @param array $params
*/
protected function mockAction($controllerId, $actionID, $moduleID = null, $params = [])
{
\Yii::$app->controller = $controller = new Controller($controllerId, \Yii::$app);
$controller->actionParams = $params;
$controller->action = new Action($actionID, $controller);
if ($moduleID !== null) {
$controller->module = new Module($moduleID);
}
}
protected function removeMockedAction()
{
\Yii::$app->controller = null;
}
} }

Loading…
Cancel
Save