Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions Classes/Configuration/IconConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,11 @@ class IconConfiguration extends AbstractBaseConfiguration
public function getIcon(): Icon
{
if (!($this->icon instanceof Icon)) {
$identifier = '';
$source = '';

extract($this->configuration);

if (static::isCustomConfiguration($this->configuration)) {
if (static::isExistingIdentifier($identifier)) {
throw new InvalidConfigurationException(
'Invalid configuration of icon. Identifier ' . $identifier . ' exists already.'
);
}
} else {
if (static::isFileReference($source)) {
$identifier = IconRegistrationUtility::convertFilenameToIdentifier($source);
}
$identifier = $this->configuration['identifier'] ?? '';
$source = $this->configuration['source'] ?? '';

if (empty(trim($identifier)) && static::isFileReference($source)) {
$identifier = IconRegistrationUtility::convertFilenameToIdentifier($source);
}

if (empty(trim($identifier))) {
Expand All @@ -65,6 +55,18 @@ public static function validate(array $configuration): ValidationResult
$validationResult->addError('Either identifier or source has to be set.');
}

if (self::isCustomConfiguration($configuration) && self::isExistingIdentifier($configuration['identifier'])) {
$validationResult->addError(sprintf('Identifier "%s" exists already. Either change the identifier or omit the "source" key to use the existing icon.', $configuration['identifier']));
}

if (
self::hasValidIdentifier($configuration)
&& !self::hasValidSource($configuration)
&& !self::isExistingIdentifier($configuration['identifier'])
) {
$validationResult->addError(sprintf('Identifier "%s" does not exist. Either change the identifier or use the "source" key to register a new icon with this identifier.', $configuration['identifier']));
}
Comment thread
schloram marked this conversation as resolved.

return $validationResult;
}

Expand Down Expand Up @@ -109,7 +111,9 @@ public static function isExistingIdentifier(string $identifier): bool
*/
public static function hasValidIdentifier(array $configuration): bool
{
return array_key_exists('identifier', $configuration);
return array_key_exists('identifier', $configuration)
&& is_string($configuration['identifier'])
&& trim($configuration['identifier']) !== '';
}

/**
Expand All @@ -120,6 +124,8 @@ public static function hasValidIdentifier(array $configuration): bool
*/
public static function hasValidSource(array $configuration): bool
{
return array_key_exists('source', $configuration);
return array_key_exists('source', $configuration)
&& is_string($configuration['source'])
&& trim($configuration['source']) !== '';
}
Comment thread
schloram marked this conversation as resolved.
}
36 changes: 36 additions & 0 deletions Tests/Unit/Configuration/IconConfigurationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use ITplusX\FlexiblePages\Tests\Fixtures\PageTypesConfigurationFixture;
use PHPUnit\Framework\TestCase;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use ITplusX\FlexiblePages\Configuration\Validation\ValidationResult;

/**
* @extensionScannerIgnoreFile
Expand Down Expand Up @@ -69,4 +70,39 @@ public function testIdentifierCreationFromConfigurationWithPathOnly()

$this->assertSame('icon-111', $icon->getIdentifier());
}

public function testCustomIdentifierIsPreservedWhenSourceIsProvided()
{
$iconConfiguration = PageTypesConfigurationFixture::getIconConfigurationByDokTypeAndIconType(
111,
'rootPageIcon'
);

$icon = GeneralUtility::makeInstance(IconConfiguration::class, $iconConfiguration)->getIcon();

$this->assertSame('custom-icon-identifier', $icon->getIdentifier());
}

public function testValidateReturnsErrorForIdentifierOnlyConfigWithUnknownIdentifier()
{
$configuration = ['identifier' => 'non-existing-icon-identifier'];

$validationResult = IconConfiguration::validate($configuration);

$this->assertInstanceOf(ValidationResult::class, $validationResult);
$this->assertTrue($validationResult->hasErrors());
}

public function testValidateReturnsErrorForCustomConfigWhenIdentifierAlreadyExists()
{
$configuration = [
'identifier' => 'apps-pagetree-page-content-from-page-hideinmenu',
'source' => 'EXT:flexible_pages/Tests/Fixtures/Icon-111.png',
];

$validationResult = IconConfiguration::validate($configuration);

$this->assertInstanceOf(ValidationResult::class, $validationResult);
$this->assertTrue($validationResult->hasErrors());
}
}