MenuTest.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Block;
  7. use Magento\Framework\App\State;
  8. use Magento\Framework\Component\ComponentRegistrar;
  9. /**
  10. * Test class for \Magento\Backend\Block\Menu
  11. * @magentoAppArea adminhtml
  12. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  13. */
  14. class MenuTest extends \PHPUnit\Framework\TestCase
  15. {
  16. /**
  17. * @var \Magento\Backend\Block\Menu $blockMenu
  18. */
  19. protected $blockMenu;
  20. /** @var \Magento\Framework\App\Cache\Type\Config $configCacheType */
  21. protected $configCacheType;
  22. /**
  23. * @var array
  24. */
  25. protected $backupRegistrar;
  26. /**
  27. * @var \Magento\Backend\Model\Menu\Config
  28. */
  29. private $menuConfig;
  30. protected function setUp()
  31. {
  32. $this->configCacheType = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
  33. \Magento\Framework\App\Cache\Type\Config::class
  34. );
  35. $this->configCacheType->save('', \Magento\Backend\Model\Menu\Config::CACHE_MENU_OBJECT);
  36. $reflection = new \ReflectionClass(\Magento\Framework\Component\ComponentRegistrar::class);
  37. $paths = $reflection->getProperty('paths');
  38. $paths->setAccessible(true);
  39. $this->backupRegistrar = $paths->getValue();
  40. $paths->setAccessible(false);
  41. $this->menuConfig = $this->prepareMenuConfig();
  42. $this->blockMenu = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
  43. \Magento\Backend\Block\Menu::class,
  44. ['menuConfig' => $this->menuConfig]
  45. );
  46. }
  47. /**
  48. * Verify that Admin Navigation Menu elements have correct titles & are located on correct levels
  49. */
  50. public function testRenderNavigation()
  51. {
  52. $menuHtml = $this->blockMenu->renderNavigation($this->menuConfig->getMenu());
  53. $menu = new \SimpleXMLElement($menuHtml);
  54. $item = $menu->xpath('/ul/li/a/span')[0];
  55. $this->assertEquals('System', (string)$item, '"System" item is absent or located on wrong menu level.');
  56. $item = $menu->xpath('/ul//ul/li/strong/span')[0];
  57. $this->assertEquals('Report', (string)$item, '"Report" item is absent or located on wrong menu level.');
  58. $liTitles = [
  59. 'Private Sales',
  60. 'Invite',
  61. 'Invited Customers',
  62. ];
  63. foreach ($menu->xpath('/ul//ul//ul/li/a/span') as $sortOrder => $item) {
  64. $this->assertEquals(
  65. $liTitles[$sortOrder],
  66. (string)$item,
  67. '"' . $liTitles[$sortOrder] . '" item is absent or located on wrong menu level.'
  68. );
  69. }
  70. }
  71. /**
  72. * @return \Magento\Backend\Model\Menu\Config
  73. */
  74. protected function prepareMenuConfig()
  75. {
  76. $this->loginAdminUser();
  77. $componentRegistrar = new \Magento\Framework\Component\ComponentRegistrar();
  78. $libraryPath = $componentRegistrar->getPath(ComponentRegistrar::LIBRARY, 'magento/framework');
  79. $reflection = new \ReflectionClass(\Magento\Framework\Component\ComponentRegistrar::class);
  80. $paths = $reflection->getProperty('paths');
  81. $paths->setAccessible(true);
  82. $paths->setValue(
  83. [
  84. ComponentRegistrar::MODULE => [],
  85. ComponentRegistrar::THEME => [],
  86. ComponentRegistrar::LANGUAGE => [],
  87. ComponentRegistrar::LIBRARY => []
  88. ]
  89. );
  90. $paths->setAccessible(false);
  91. ComponentRegistrar::register(ComponentRegistrar::LIBRARY, 'magento/framework', $libraryPath);
  92. ComponentRegistrar::register(
  93. ComponentRegistrar::MODULE,
  94. 'Magento_Backend',
  95. __DIR__ . '/_files/menu/Magento/Backend'
  96. );
  97. /* @var $validationState \Magento\Framework\App\Arguments\ValidationState */
  98. $validationState = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
  99. \Magento\Framework\App\Arguments\ValidationState::class,
  100. ['appMode' => State::MODE_DEFAULT]
  101. );
  102. /* @var $configReader \Magento\Backend\Model\Menu\Config\Reader */
  103. $configReader = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
  104. \Magento\Backend\Model\Menu\Config\Reader::class,
  105. ['validationState' => $validationState]
  106. );
  107. return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
  108. \Magento\Backend\Model\Menu\Config::class,
  109. [
  110. 'configReader' => $configReader,
  111. 'configCacheType' => $this->configCacheType
  112. ]
  113. );
  114. }
  115. /**
  116. * @return void
  117. */
  118. protected function loginAdminUser()
  119. {
  120. \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
  121. ->get(\Magento\Backend\Model\UrlInterface::class)
  122. ->turnOffSecretKey();
  123. $auth = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Backend\Model\Auth::class);
  124. $auth->login(\Magento\TestFramework\Bootstrap::ADMIN_NAME, \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD);
  125. }
  126. /**
  127. * @return void
  128. */
  129. protected function tearDown()
  130. {
  131. $this->configCacheType->save('', \Magento\Backend\Model\Menu\Config::CACHE_MENU_OBJECT);
  132. $reflection = new \ReflectionClass(\Magento\Framework\Component\ComponentRegistrar::class);
  133. $paths = $reflection->getProperty('paths');
  134. $paths->setAccessible(true);
  135. $paths->setValue($this->backupRegistrar);
  136. $paths->setAccessible(false);
  137. }
  138. }