AnchorRendererTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Test\Unit\Block;
  7. use Magento\Backend\Block\AnchorRenderer;
  8. use Magento\Backend\Block\MenuItemChecker;
  9. use Magento\Backend\Model\Menu\Item;
  10. use Magento\Framework\Escaper;
  11. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  12. class AnchorRendererTest extends \PHPUnit\Framework\TestCase
  13. {
  14. /**
  15. * @var Item|\PHPUnit_Framework_MockObject_MockObject
  16. */
  17. private $activeMenuItemMock;
  18. /**
  19. * @var Item|\PHPUnit_Framework_MockObject_MockObject
  20. */
  21. private $menuItemMock;
  22. /**
  23. * @var Escaper|\PHPUnit_Framework_MockObject_MockObject
  24. */
  25. private $escaperMock;
  26. /**
  27. * @var ObjectManagerHelper
  28. */
  29. private $objectManagerHelper;
  30. /**
  31. * @var MenuItemChecker|\PHPUnit_Framework_MockObject_MockObject
  32. */
  33. private $menuItemCheckerMock;
  34. /**
  35. * @var AnchorRenderer
  36. */
  37. private $anchorRenderer;
  38. protected function setUp()
  39. {
  40. $this->activeMenuItemMock = $this->getMockBuilder(Item::class)
  41. ->disableOriginalConstructor()
  42. ->getMock();
  43. $this->menuItemMock = $this->getMockBuilder(Item::class)
  44. ->disableOriginalConstructor()
  45. ->getMock();
  46. $this->menuItemWithoutChildrenMock = $this->getMockBuilder(Item::class)
  47. ->disableOriginalConstructor()
  48. ->getMock();
  49. $this->menuItemCheckerMock = $this->getMockBuilder(MenuItemChecker::class)
  50. ->disableOriginalConstructor()
  51. ->getMock();
  52. $this->escaperMock = $this->getMockBuilder(Escaper::class)
  53. ->disableOriginalConstructor()
  54. ->getMock();
  55. $this->objectManagerHelper = new ObjectManagerHelper($this);
  56. $this->anchorRenderer = $this->objectManagerHelper->getObject(
  57. AnchorRenderer::class,
  58. [
  59. 'menuItemChecker' => $this->menuItemCheckerMock,
  60. 'escaper' => $this->escaperMock
  61. ]
  62. );
  63. }
  64. public function testRenderAnchorLevelIsOne()
  65. {
  66. $title = 'Title';
  67. $html = 'Test html';
  68. $this->menuItemMock->expects($this->once())->method('getUrl')->willReturn('#');
  69. $this->menuItemMock->expects($this->once())->method('getTitle')->willReturn($title);
  70. $this->menuItemMock->expects($this->once())->method('hasChildren')->willReturn(true);
  71. $this->escaperMock->expects($this->once())->method('escapeHtml')->with(__($title))->willReturn($html);
  72. $expected = '<strong class="submenu-group-title" role="presentation">'
  73. . '<span>' . $html . '</span>'
  74. . '</strong>';
  75. $this->assertEquals(
  76. $expected,
  77. $this->anchorRenderer->renderAnchor($this->activeMenuItemMock, $this->menuItemMock, 1)
  78. );
  79. }
  80. public function testRenderAnchorWithoutChildrenAndLevelIsOne()
  81. {
  82. $this->menuItemWithoutChildrenMock->expects($this->once())->method('getUrl')->willReturn('#');
  83. $this->menuItemWithoutChildrenMock->expects($this->once())->method('hasChildren')->willReturn(false);
  84. $expected = '';
  85. $this->assertEquals(
  86. $expected,
  87. $this->anchorRenderer->renderAnchor($this->activeMenuItemMock, $this->menuItemWithoutChildrenMock, 1)
  88. );
  89. }
  90. /**
  91. * @param bool $hasTarget
  92. * @dataProvider targetDataProvider
  93. */
  94. public function testRenderAnchorLevelIsNotOne($hasTarget)
  95. {
  96. $level = 0;
  97. $title = 'Title';
  98. $html = 'Test html';
  99. $url = 'test/url';
  100. $tooltip = 'Anchor title';
  101. $onclick = '';
  102. $target = '_blank';
  103. $finalTarget = $hasTarget ? ('target=' . $target) : '';
  104. $this->menuItemMock->expects($this->any())->method('getTarget')->willReturn($hasTarget ? $target : null);
  105. $this->menuItemMock->expects($this->once())->method('getUrl')->willReturn($url);
  106. $this->menuItemMock->expects($this->once())->method('getTitle')->willReturn($title);
  107. $this->escaperMock->expects($this->once())->method('escapeHtml')->with(__($title))->willReturn($html);
  108. $this->menuItemMock->expects($this->once())->method('hasTooltip')->willReturn(true);
  109. $this->menuItemMock->expects($this->any())->method('getTooltip')->willReturn(__($tooltip));
  110. $this->menuItemMock->expects($this->once())->method('hasClickCallback')->willReturn(true);
  111. $this->menuItemMock->expects($this->once())->method('getClickCallback')->willReturn($onclick);
  112. $this->menuItemCheckerMock->expects($this->once())
  113. ->method('isItemActive')
  114. ->with($this->activeMenuItemMock, $this->menuItemMock, $level)->willReturn(true);
  115. $expected = '<a href="' . $url . '" ' . $finalTarget . ' ' . 'title="' . $tooltip . '"'
  116. . ' onclick="' . $onclick . '"'
  117. . ' class="' . '_active'
  118. . '">' . '<span>' . $html
  119. . '</span>' . '</a>';
  120. $this->assertEquals(
  121. $expected,
  122. $this->anchorRenderer->renderAnchor($this->activeMenuItemMock, $this->menuItemMock, $level)
  123. );
  124. }
  125. /**
  126. * @return array
  127. */
  128. public function targetDataProvider()
  129. {
  130. return [
  131. 'item has target' => [true],
  132. 'item does not have target' => [false]
  133. ];
  134. }
  135. }