TemplateFilesTest.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Test\Integrity\Modular;
  7. use Magento\Customer\Model\Context;
  8. /**
  9. * @magentoAppIsolation enabled
  10. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  11. */
  12. class TemplateFilesTest extends \Magento\TestFramework\TestCase\AbstractIntegrity
  13. {
  14. public function testAllTemplates()
  15. {
  16. $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
  17. $invoker(
  18. function ($module, $template, $class, $area) {
  19. \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  20. \Magento\Framework\View\DesignInterface::class
  21. )->setDefaultDesignTheme();
  22. // intentionally to make sure the module files will be requested
  23. $params = [
  24. 'area' => $area,
  25. 'themeModel' => \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
  26. \Magento\Framework\View\Design\ThemeInterface::class
  27. ),
  28. 'module' => $module,
  29. ];
  30. $file = \Magento\TestFramework\Helper\Bootstrap::getObjectmanager()->get(
  31. \Magento\Framework\View\FileSystem::class
  32. )->getTemplateFileName(
  33. $template,
  34. $params
  35. );
  36. $this->assertInternalType('string', $file, "Block class: {$class} {$template}");
  37. $this->assertFileExists($file, "Block class: {$class}");
  38. },
  39. $this->allTemplatesDataProvider()
  40. );
  41. }
  42. /**
  43. * @return array
  44. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  45. */
  46. public function allTemplatesDataProvider()
  47. {
  48. $blockClass = '';
  49. try {
  50. /** @var $website \Magento\Store\Model\Website */
  51. \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  52. \Magento\Store\Model\StoreManagerInterface::class
  53. )->getStore()->setWebsiteId(
  54. 0
  55. );
  56. $templates = [];
  57. $skippedBlocks = $this->_getBlocksToSkip();
  58. foreach (\Magento\Framework\App\Utility\Classes::collectModuleClasses('Block') as $blockClass => $module) {
  59. if (!in_array($module, $this->_getEnabledModules()) || in_array($blockClass, $skippedBlocks)) {
  60. continue;
  61. }
  62. $class = new \ReflectionClass($blockClass);
  63. if ($class->isAbstract() || !$class->isSubclassOf(\Magento\Framework\View\Element\Template::class)) {
  64. continue;
  65. }
  66. $area = 'frontend';
  67. if ($module == 'Magento_Backend' || strpos(
  68. $blockClass,
  69. '\\Adminhtml\\'
  70. ) !== false || strpos(
  71. $blockClass,
  72. '\\Backend\\'
  73. ) !== false || $class->isSubclassOf(
  74. \Magento\Backend\Block\Template::class
  75. )
  76. ) {
  77. $area = 'adminhtml';
  78. }
  79. \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  80. \Magento\Framework\App\AreaList::class
  81. )->getArea(
  82. $area
  83. )->load(
  84. \Magento\Framework\App\Area::PART_CONFIG
  85. );
  86. \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  87. \Magento\Framework\Config\ScopeInterface::class
  88. )->setCurrentScope(
  89. $area
  90. );
  91. \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  92. \Magento\Framework\App\State::class
  93. )->setAreaCode(
  94. $area
  95. );
  96. $context = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
  97. \Magento\Framework\App\Http\Context::class
  98. );
  99. $context->setValue(Context::CONTEXT_AUTH, false, false);
  100. $context->setValue(
  101. Context::CONTEXT_GROUP,
  102. \Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID,
  103. \Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID
  104. );
  105. $block = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create($blockClass);
  106. $template = $block->getTemplate();
  107. if ($template) {
  108. $templates[$module . ', ' . $template . ', ' . $blockClass . ', ' . $area] = [
  109. $module,
  110. $template,
  111. $blockClass,
  112. $area,
  113. ];
  114. }
  115. }
  116. return $templates;
  117. } catch (\Exception $e) {
  118. trigger_error(
  119. "Corrupted data provider. Last known block instantiation attempt: '{$blockClass}'." .
  120. " Exception: {$e}",
  121. E_USER_ERROR
  122. );
  123. }
  124. }
  125. /**
  126. * @return array
  127. */
  128. protected function _getBlocksToSkip()
  129. {
  130. $result = [];
  131. foreach (glob(__DIR__ . '/_files/skip_template_blocks*.php') as $file) {
  132. $blocks = include $file;
  133. $result = array_merge($result, $blocks);
  134. }
  135. return array_combine($result, $result);
  136. }
  137. }