diff --git a/phpBB/phpbb/assets/iconify_bundler.php b/phpBB/phpbb/assets/iconify_bundler.php index 2671cb0880..9bda03695c 100644 --- a/phpBB/phpbb/assets/iconify_bundler.php +++ b/phpBB/phpbb/assets/iconify_bundler.php @@ -47,22 +47,26 @@ class iconify_bundler $organized_icons = $this->organize_icons_list(); $output = $this->load_icons_data($organized_icons); + if (!$output) + { + return ''; + } $output = '(function() { - function add(data) { - try { - if (typeof self.Iconify === \'object\' && self.Iconify.addCollection) { - self.Iconify.addCollection(data); - return; - } - if (typeof self.IconifyPreload === \'undefined\') { - self.IconifyPreload = []; - } - self.IconifyPreload.push(data); - } catch (err) { - } - } - ' . $output . ' + function add(data) { + try { + if (typeof self.Iconify === \'object\' && self.Iconify.addCollection) { + self.Iconify.addCollection(data); + return; + } + if (typeof self.IconifyPreload === \'undefined\') { + self.IconifyPreload = []; + } + self.IconifyPreload.push(data); + } catch (err) { + } + } + ' . $output . ' })();' . "\n"; return $output; @@ -111,7 +115,7 @@ class iconify_bundler { // Split icon to prefix and name $icon = $this->name_to_icon($icon_name); - if ($icon === null || $icon['provider'] !== '') + if ($icon === null) { // Invalid name or icon name does not have provider if ($this->log) @@ -216,24 +220,20 @@ class iconify_bundler { // Load icon set $collection = new Collection($prefix); - if (!$collection->loadIconifyCollection($prefix)) + $collection_file = Collection::findIconifyCollection($prefix); + if (!file_exists($collection_file) || !$collection->loadFromFile($collection_file)) { - if ($this->log) - { - $this->log->add('critical', ANONYMOUS, '', 'LOG_ICON_COLLECTION_INVALID', false, [$prefix]); - } + $this->log?->add('critical', ANONYMOUS, '', 'LOG_ICON_COLLECTION_INVALID', false, [$prefix]); continue; } // Make sure all icons exist - foreach ($iconsList as $name) + foreach ($iconsList as $key => $name) { if (!$collection->iconExists($name)) { - if ($this->log) - { - $this->log->add('critical', ANONYMOUS, '', 'LOG_ICON_INVALID', false, [$prefix . ':' . $name]); - } + $this->log?->add('critical', ANONYMOUS, '', 'LOG_ICON_INVALID', false, [$prefix . ':' . $name]); + unset($iconsList[$key]); } } diff --git a/tests/assets/iconify_bundler_tests.php b/tests/assets/iconify_bundler_tests.php new file mode 100644 index 0000000000..d2d9c01a6c --- /dev/null +++ b/tests/assets/iconify_bundler_tests.php @@ -0,0 +1,141 @@ + + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\tests\unit\assets; + +class iconify_bundler_tests extends \phpbb_test_case +{ + /** @var array Log content */ + protected $log_content = []; + + /** @var \phpbb\assets\iconify_bundler */ + protected $bundler; + + public function setUp(): void + { + $log = $this->getMockBuilder('\phpbb\log\dummy') + ->onlyMethods(['add']) + ->getMock(); + $log->method('add') + ->willReturnCallback(function ($mode, $user_id, $log_ip, $log_operation, $log_time = false, $additional_data = array()) { + $this->log_content[] = $log_operation; + }); + + $this->bundler = new \phpbb\assets\iconify_bundler($log); + } + + public function data_test_generate_bundle() + { + return [ + [ + ['fa:address-card-o'], + ['"prefix":"fa"', '"address-card-o"'], + ], + [ + ['fa:address-card-o', 'fa-regular:credit-card'], + ['"prefix":"fa"', '"address-card-o"', '"prefix":"fa-regular"', '"credit-card"'], + ], + [ + ['fa:address-card-o', 'fa:foo-bar'], + ['"prefix":"fa"', '"address-card-o"'], + ['LOG_ICON_INVALID'], + ], + [ + ['fa:address-card-o', 'fa-regular:credit-card', 'fa-regular:credit-card'], + ['"prefix":"fa"', '"address-card-o"', '"prefix":"fa-regular"', '"credit-card"'], + ], + [ + ['fa:address-card-o', 'fa-regular:credit-card', 'fa-regular:angry'], + ['"prefix":"fa"', '"address-card-o"', '"prefix":"fa-regular"', '"credit-card"', '"angry"'], + ], + [ + ['fa:address-card-o', 'fa:bell', 'fa-regular:credit-card', 'fa-regular:angry'], + ['"prefix":"fa"', '"address-card-o"', '"bell"', '"prefix":"fa-regular"', '"credit-card"', '"angry"'], + ], + [ + ['@test'], + [], + ['LOG_ICON_INVALID'], + ], + [ + ['fa:address-foo-o'], + ['"prefix":"fa"', '"icons":[]'], + ['LOG_ICON_INVALID'], + ], + [ + ['foo:bar'], + [], + ['LOG_ICON_COLLECTION_INVALID'] + ], + [ + ['@iconify:fa:address-card-o'], + ['"prefix":"fa"', '"address-card-o"'], + ], + [ + ['@iconify:someother:fa:address-card-o'], + [], + ['LOG_ICON_INVALID'], + ], + [ + ['iconify:fa:address-card-o'], + ['"prefix":"fa"', '"address-card-o"'], + ], + [ + ['iconify:fa:fa:address-card-o'], + [], + ['LOG_ICON_INVALID'], + ], + [ + ['test'], + [], + ['LOG_ICON_INVALID'], + ], + [ + [''], + [], + ['LOG_ICON_INVALID'], + ], + [ + ['fa-address-card-o'], + ['"prefix":"fa"', '"address-card-o"'], + ], + ]; + } + + /** + * @dataProvider data_test_generate_bundle + */ + public function test_generate_bundle($icons, $expected, $log_content = []) + { + $this->bundler->add_icons($icons); + $bundle = $this->bundler->run(); + foreach ($expected as $expected_part) + { + $this->assertStringContainsString($expected_part, $bundle, 'Failed asserting that generated bundle contains ' . $expected_part); + } + + if (!count($expected)) + { + $this->assertEquals($bundle, '', 'Failed asserting that generated bundle is empty'); + } + + if (count($log_content)) + { + $this->assertEquals($this->log_content, $log_content, 'Failed asserting that log content is correct'); + } + else + { + $this->assertEmpty($this->log_content, 'Failed asserting that log content is empty'); + } + } +}