1
0

BxBaseMenuCacheTest.php 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. /**
  3. * Menus with content cache ('global', 'guest', 'per_user', 'per_acl') keep their rendered HTML, which marks the selected
  4. * item with bx-menu-tab-active. The cache key includes the selected item, so the page that happens to render a menu
  5. * first doesn't decide the selected item for every other page.
  6. */
  7. class BxBaseMenuCacheTest extends BxDolTestCase
  8. {
  9. private const KEY = 'menu_sys_site_unit_test';
  10. protected function tearDown(): void
  11. {
  12. BxDolMenu::setSelectedGlobal('', '');
  13. parent::tearDown();
  14. }
  15. private function callProtected($oObject, string $sMethod, array $aArgs = [])
  16. {
  17. $oMethod = new ReflectionMethod($oObject, $sMethod);
  18. return $oMethod->invokeArgs($oObject, $aArgs);
  19. }
  20. private function getSiteMenu(): BxBaseMenu
  21. {
  22. $oMenu = BxDolMenu::getObjectInstance('sys_site');
  23. if (!$oMenu)
  24. $this->markTestSkipped('The site menu is not installed.');
  25. return $oMenu;
  26. }
  27. public function testCacheKeyFollowsTheSelectedItem(): void
  28. {
  29. $oMenu = $this->getSiteMenu();
  30. BxDolMenu::setSelectedGlobal('system', 'about');
  31. $sAbout = $this->callProtected($oMenu, '_getCacheKeySelected', [self::KEY]);
  32. BxDolMenu::setSelectedGlobal('system', 'home');
  33. $sHome = $this->callProtected($oMenu, '_getCacheKeySelected', [self::KEY]);
  34. BxDolMenu::setSelectedGlobal('system', 'no-such-item-in-this-menu');
  35. $sNone = $this->callProtected($oMenu, '_getCacheKeySelected', [self::KEY]);
  36. $this->assertNotSame('', $sAbout);
  37. $this->assertNotSame('', $sHome);
  38. $this->assertNotSame($sAbout, $sHome, 'Different selected items get different cache entries.');
  39. $this->assertSame('', $sNone, 'Pages that select nothing in this menu share one entry.');
  40. $this->assertSame(strlen($sAbout), strlen($sHome), 'The suffix has a fixed length, whatever the name.');
  41. $this->assertLessThanOrEqual(24, strlen($sAbout));
  42. }
  43. public function testItemNamesAreCachedWithTheMenu(): void
  44. {
  45. $oMenu = $this->getSiteMenu();
  46. if (!getParam('sys_content_cache_enable'))
  47. $this->markTestSkipped('Content cache is off.');
  48. BxDolMenu::setSelectedGlobal('system', 'about');
  49. $this->callProtected($oMenu, '_getCacheKeySelected', [self::KEY]);
  50. $aItems = bx_content_cache_get(self::KEY . '_items');
  51. $this->assertIsArray($aItems, 'The item list is kept next to the menu, so a cache hit needs no query.');
  52. $this->assertContains(['module' => 'system', 'name' => 'about'], $aItems);
  53. }
  54. public function testCachedMenuMarksTheItemOfEachPage(): void
  55. {
  56. $this->getSiteMenu();
  57. if (!getParam('sys_content_cache_enable'))
  58. $this->markTestSkipped('Content cache is off.');
  59. $aActive = [];
  60. foreach (['home', 'about', 'home'] as $sName) {
  61. BxDolMenu::setSelectedGlobal('system', $sName);
  62. preg_match_all('/bx-menu-item bx-menu-item-([\w-]+)[^"]*bx-menu-tab-active/', BxDolMenu::getObjectInstance('sys_site')->getCode(), $aMatches);
  63. $aActive[] = implode(',', $aMatches[1]);
  64. }
  65. $this->assertSame(['home', 'about', 'home'], $aActive);
  66. }
  67. }