ThemeHandlesTest.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. /**
  3. * Test declarations of handles in theme layout updates
  4. *
  5. * Copyright © Magento, Inc. All rights reserved.
  6. * See COPYING.txt for license details.
  7. */
  8. namespace Magento\Test\Integrity\Layout;
  9. class ThemeHandlesTest extends \PHPUnit\Framework\TestCase
  10. {
  11. /**
  12. * @var array|null
  13. */
  14. protected $_baseFrontendHandles = null;
  15. public function testIsDesignHandleDeclaredInCode()
  16. {
  17. $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
  18. $invoker(
  19. /**
  20. * Check that all handles declared in a theme layout are declared in base layouts
  21. *
  22. * @param string $handleName
  23. */
  24. function ($handleName) {
  25. $this->assertContains(
  26. $handleName,
  27. $this->_getBaseFrontendHandles(),
  28. "Handle '{$handleName}' is not declared in any module.'"
  29. );
  30. },
  31. $this->designHandlesDataProvider()
  32. );
  33. }
  34. /**
  35. * @return array
  36. */
  37. public function designHandlesDataProvider()
  38. {
  39. $files = \Magento\Framework\App\Utility\Files::init()->getLayoutFiles(
  40. ['include_code' => false, 'area' => 'frontend'],
  41. false
  42. );
  43. $handles = $this->_extractLayoutHandles($files);
  44. $result = [];
  45. foreach ($handles as $handleName) {
  46. $result[$handleName] = [$handleName];
  47. }
  48. return $result;
  49. }
  50. /**
  51. * Return layout handles that are declared in the base layouts for frontend
  52. *
  53. * @return array
  54. */
  55. protected function _getBaseFrontendHandles()
  56. {
  57. if ($this->_baseFrontendHandles === null) {
  58. $files = \Magento\Framework\App\Utility\Files::init()->getLayoutFiles(
  59. ['include_design' => false, 'area' => 'frontend'],
  60. false
  61. );
  62. $this->_baseFrontendHandles = $this->_extractLayoutHandles($files);
  63. }
  64. return $this->_baseFrontendHandles;
  65. }
  66. /**
  67. * Retrieve the list of unique layout handle names from the layout files
  68. *
  69. * @param array $files
  70. * @return array
  71. */
  72. protected function _extractLayoutHandles(array $files)
  73. {
  74. $result = [];
  75. foreach ($files as $filename) {
  76. $handleName = basename($filename, '.xml');
  77. $result[] = $handleName;
  78. }
  79. $result = array_unique($result);
  80. return $result;
  81. }
  82. }