BxBaseMetaIconsTest.php 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. /**
  3. * Favicon tags in the page head. Browser tabs follow the browser/OS colour scheme, so the default favicon has a
  4. * dark variant that the head script swaps in; Studio's favicon is a coloured plate and has none.
  5. */
  6. class BxBaseMetaIconsTest extends BxDolTestCase
  7. {
  8. private function withOptions(array $aOptions, callable $fTest)
  9. {
  10. $aPrior = [];
  11. foreach ($aOptions as $sName => $sValue) {
  12. $aPrior[$sName] = getParam($sName);
  13. setParam($sName, $sValue);
  14. }
  15. try {
  16. return $fTest();
  17. }
  18. finally {
  19. foreach ($aPrior as $sName => $sValue)
  20. setParam($sName, $sValue);
  21. }
  22. }
  23. private function withDefaultIcons(callable $fTest)
  24. {
  25. return $this->withOptions(['sys_site_icon' => '0', 'sys_site_icon_svg' => '0'], $fTest);
  26. }
  27. public function testDefaultFaviconSwitchesWithTheBrowserScheme(): void
  28. {
  29. $sHtml = $this->withDefaultIcons(fn() => BxTemplFunctions::getInstance()->getMetaIcons());
  30. $this->assertMatchesRegularExpression('/<link rel="icon" href="[^"]*\/favicon\.svg" sizes="any" data-bx-icon-light="[^"]*\/favicon\.svg" data-bx-icon-dark="[^"]*\/favicon-dark\.svg" \/>/', $sHtml);
  31. $this->assertMatchesRegularExpression('/<link rel="icon" href="[^"]*\/favicon\.svg" type="image\/svg\+xml" data-bx-icon-light="[^"]*" data-bx-icon-dark="[^"]*\/favicon-dark\.svg" \/>/', $sHtml);
  32. $this->assertStringContainsString("matchMedia('(prefers-color-scheme: dark)')", $sHtml);
  33. $this->assertStringContainsString('<link rel="apple-touch-icon" href="', $sHtml);
  34. }
  35. public function testDefaultFaviconFilesAreDarkAndLightInk(): void
  36. {
  37. $sDir = BX_DIRECTORY_PATH_ROOT . 'template/images/icons/';
  38. $sLight = file_get_contents($sDir . 'favicon.svg');
  39. $this->assertStringContainsString('g{fill:#18181B}', $sLight, 'Dark ink on light tabs.');
  40. $this->assertStringContainsString('@media (prefers-color-scheme:dark){g{fill:#fff}}', $sLight, 'Browsers that read the SVG\'s own media query switch without the script.');
  41. $sDark = file_get_contents($sDir . 'favicon-dark.svg');
  42. $this->assertStringContainsString('<g fill="#fff">', $sDark, 'White ink on dark tabs, with no media query left for the browser to ignore.');
  43. $this->assertStringNotContainsString('@media', $sDark);
  44. }
  45. public function testStudioKeepsItsOwnFaviconInDarkMode(): void
  46. {
  47. $sHtml = $this->withDefaultIcons(fn() => BxTemplStudioFunctions::getInstance()->getMetaIcons());
  48. $this->assertStringContainsString('studio/template/images/icons/favicon.svg', $sHtml);
  49. $this->assertStringNotContainsString('data-bx-icon-dark', $sHtml);
  50. $this->assertStringNotContainsString('favicon-dark.svg', $sHtml);
  51. }
  52. }