Skip to content

Commit

Permalink
Merge 3.x into 4.x
Browse files Browse the repository at this point in the history
  • Loading branch information
SonataCI committed May 25, 2022
2 parents da97793 + b8aca22 commit e7cb104
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 18 deletions.
24 changes: 14 additions & 10 deletions src/Checker/TranslatableChecker.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,27 +75,31 @@ public function getSupportedModels(): array
* Check if $object is translatable.
*
* @param object|string|null $object
*
* @phpstan-param object|class-string|null $object
*/
public function isTranslatable($object): bool
{
if (null === $object) {
return false;
}

$objectInterfaces = class_implements($object);
\assert(\is_array($objectInterfaces));
foreach ($this->getSupportedInterfaces() as $interface) {
if (\in_array($interface, $objectInterfaces, true)) {
return true;
}
}

foreach ($this->getSupportedModels() as $model) {
if ($object instanceof $model) {
foreach ($this->getSupportedClasses() as $interface) {
if (is_a($object, $interface, true)) {
return true;
}
}

return false;
}

/**
* @return string[]
*
* @phpstan-return class-string[]
*/
private function getSupportedClasses(): array
{
return array_merge($this->getSupportedInterfaces(), $this->getSupportedModels());
}
}
2 changes: 2 additions & 0 deletions src/Twig/Extension/SonataTranslationExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ public function getFilters(): array
* Check if $object is translatable.
*
* @param object|string|null $object
*
* @phpstan-param object|class-string|null $object
*/
public function isTranslatable($object): bool
{
Expand Down
69 changes: 61 additions & 8 deletions tests/Checker/TranslatableCheckerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

namespace Sonata\TranslationBundle\Tests\Checker;

use Gedmo\Translatable\Translatable;
use PHPUnit\Framework\TestCase;
use Sonata\TranslationBundle\Checker\TranslatableChecker;
use Sonata\TranslationBundle\Tests\Fixtures\Model\ModelCustomTranslatable;
Expand All @@ -22,18 +23,70 @@
*/
final class TranslatableCheckerTest extends TestCase
{
public function testIsTranslatableOnModel(): void
{
$translatableChecker = new TranslatableChecker();
private TranslatableChecker $translatableChecker;

$object = new ModelCustomTranslatable();
protected function setUp(): void
{
$this->translatableChecker = new TranslatableChecker();
}

static::assertFalse($translatableChecker->isTranslatable($object));
/**
* @return iterable<array{object|class-string, array<class-string>, array<class-string>}>
*/
public function provideTestIsTranslatable(): iterable
{
yield 'object-by-model' => [
new ModelCustomTranslatable(),
[ModelCustomTranslatable::class],
[],
];

$translatableChecker->setSupportedModels([
yield 'class-by-model' => [
ModelCustomTranslatable::class,
]);
[ModelCustomTranslatable::class],
[],
];

yield 'object-by-interfaces' => [
$this->createMock(Translatable::class),
[],
[Translatable::class],
];

yield 'class-by-interfaces' => [
Translatable::class,
[],
[Translatable::class],
];
}

/**
* @dataProvider provideTestIsTranslatable
*
* @phpstan-param object|class-string $classOrObject
* @phpstan-param class-string[] $supportedModels
* @phpstan-param class-string[] $supportedInterfaces
*/
public function testIsTranslatable($classOrObject, array $supportedModels, array $supportedInterfaces): void
{
static::assertFalse($this->translatableChecker->isTranslatable($classOrObject));

$this->translatableChecker->setSupportedModels($supportedModels);
$this->translatableChecker->setSupportedInterfaces($supportedInterfaces);

static::assertTrue($this->translatableChecker->isTranslatable($classOrObject));
}

public function testIsTranslatableNull(): void
{
static::assertFalse($this->translatableChecker->isTranslatable(null));
}

public function testIsTranslatableNoMatch(): void
{
$this->translatableChecker->setSupportedModels([ModelCustomTranslatable::class]);
$this->translatableChecker->setSupportedInterfaces([Translatable::class]);

static::assertTrue($translatableChecker->isTranslatable($object));
static::assertFalse($this->translatableChecker->isTranslatable(\stdClass::class));
}
}

0 comments on commit e7cb104

Please sign in to comment.