| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <?php
- declare(strict_types=1);
- namespace App\Tests\Unit\Service\Utils\Tree;
- use App\Service\Utils\Tree\ResourceTreeBuilder;
- use PHPUnit\Framework\TestCase;
- use PHPUnit\Framework\MockObject\MockObject;
- // Classes de test pour simuler les objets avec des getters
- class TestResource
- {
- public function __construct(
- private string $category,
- private string $subCategory,
- private string $value,
- private string $name = 'default'
- ) {
- }
- public function getCategory(): string
- {
- return $this->category;
- }
- public function getSubCategory(): string
- {
- return $this->subCategory;
- }
- public function getValue(): string
- {
- return $this->value;
- }
- public function getName(): string
- {
- return $this->name;
- }
- }
- class TestResourceWithEnum
- {
- public function __construct(
- private TestEnum $category,
- private string $name = 'default'
- ) {
- }
- public function getCategory(): TestEnum
- {
- return $this->category;
- }
- public function getName(): string
- {
- return $this->name;
- }
- }
- enum TestEnum: string
- {
- case CATEGORY_A = 'category-a';
- case CATEGORY_B = 'category-b';
- }
- // Classe testable pour accéder aux méthodes protected
- class TestableResourceTreeBuilder extends ResourceTreeBuilder
- {
- public static function callGetterPublic($object, $propName): string
- {
- return parent::callGetter($object, $propName);
- }
- }
- class ResourceTreeBuilderTest extends TestCase
- {
- private function getResourceTreeBuilderMockFor(string $methodName): TestableResourceTreeBuilder|MockObject
- {
- return $this->getMockBuilder(TestableResourceTreeBuilder::class)
- ->setMethodsExcept([$methodName])
- ->getMock();
- }
- /**
- * @see ResourceTreeBuilder::makeTree()
- */
- public function testMakeTree(): void
- {
- $data = [
- new TestResource('category1', 'sub1', 'item1'),
- new TestResource('category1', 'sub1', 'item2'),
- new TestResource('category1', 'sub2', 'item3'),
- new TestResource('category2', 'sub3', 'item4'),
- ];
- $result = ResourceTreeBuilder::makeTree($data, 'category', 'subCategory', 'value');
- $expected = [
- 'category1' => [
- 'sub1' => ['item1', 'item2'],
- 'sub2' => ['item3'],
- ],
- 'category2' => [
- 'sub3' => ['item4'],
- ],
- ];
- self::assertEquals($expected, $result);
- }
- /**
- * @see ResourceTreeBuilder::makeTree()
- */
- public function testMakeTreeWithOneLevel(): void
- {
- $data = [
- new TestResource('category1', 'sub1', 'item1', 'name1'),
- new TestResource('category2', 'sub2', 'item2', 'name2'),
- new TestResource('category1', 'sub3', 'item3', 'name3'),
- ];
- $result = ResourceTreeBuilder::makeTree($data);
- $expected = ['name1', 'name2', 'name3'];
- self::assertEquals($expected, $result);
- }
- /**
- * @see ResourceTreeBuilder::makeTree()
- */
- public function testMakeTreeWithTwoLevels(): void
- {
- $data = [
- new TestResource('category1', 'sub1', 'item1'),
- new TestResource('category1', 'sub2', 'item2'),
- new TestResource('category2', 'sub1', 'item3'),
- ];
- $result = ResourceTreeBuilder::makeTree($data, 'category', 'subCategory');
- $expected = [
- 'category1' => ['sub1', 'sub2'],
- 'category2' => ['sub1'],
- ];
- self::assertEquals($expected, $result);
- }
- /**
- * @see ResourceTreeBuilder::makeTree()
- */
- public function testMakeTreeWithEmptyData(): void
- {
- $result = ResourceTreeBuilder::makeTree([]);
- self::assertEquals([], $result);
- }
- /**
- * @see ResourceTreeBuilder::callGetter()
- */
- public function testCallGetter(): void
- {
- $resource = new TestResource('cat1', 'sub1', 'val1');
- $result = TestableResourceTreeBuilder::callGetterPublic($resource, 'category');
- self::assertEquals('cat1', $result);
- }
- /**
- * @see ResourceTreeBuilder::callGetter()
- */
- public function testCallGetterWithEnum(): void
- {
- $resource = new TestResourceWithEnum(TestEnum::CATEGORY_A);
- $result = TestableResourceTreeBuilder::callGetterPublic($resource, 'category');
- self::assertEquals('category-a', $result);
- }
- /**
- * @see ResourceTreeBuilder::callGetter()
- */
- public function testCallGetterWithInvalidProperty(): void
- {
- $resource = new TestResource('cat1', 'sub1', 'val1');
- $this->expectException(\InvalidArgumentException::class);
- $this->expectExceptionMessage('Invalid property name');
- TestableResourceTreeBuilder::callGetterPublic($resource, 'invalidProperty');
- }
- /**
- * @see ResourceTreeBuilder::makeTree()
- */
- public function testMakeTreeWithDuplicateEntries(): void
- {
- $data = [
- new TestResource('category1', 'sub1', 'item1'),
- new TestResource('category1', 'sub1', 'item1'), // Duplicate
- new TestResource('category1', 'sub1', 'item2'),
- ];
- $result = ResourceTreeBuilder::makeTree($data, 'category', 'subCategory', 'value');
- $expected = [
- 'category1' => [
- 'sub1' => ['item1', 'item2'],
- ],
- ];
- self::assertEquals($expected, $result);
- }
- }
|