ResourceTreeBuilderTest.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Unit\Service\Utils\Tree;
  4. use App\Service\Utils\Tree\ResourceTreeBuilder;
  5. use PHPUnit\Framework\TestCase;
  6. use PHPUnit\Framework\MockObject\MockObject;
  7. // Classes de test pour simuler les objets avec des getters
  8. class TestResource
  9. {
  10. public function __construct(
  11. private string $category,
  12. private string $subCategory,
  13. private string $value,
  14. private string $name = 'default'
  15. ) {
  16. }
  17. public function getCategory(): string
  18. {
  19. return $this->category;
  20. }
  21. public function getSubCategory(): string
  22. {
  23. return $this->subCategory;
  24. }
  25. public function getValue(): string
  26. {
  27. return $this->value;
  28. }
  29. public function getName(): string
  30. {
  31. return $this->name;
  32. }
  33. }
  34. class TestResourceWithEnum
  35. {
  36. public function __construct(
  37. private TestEnum $category,
  38. private string $name = 'default'
  39. ) {
  40. }
  41. public function getCategory(): TestEnum
  42. {
  43. return $this->category;
  44. }
  45. public function getName(): string
  46. {
  47. return $this->name;
  48. }
  49. }
  50. enum TestEnum: string
  51. {
  52. case CATEGORY_A = 'category-a';
  53. case CATEGORY_B = 'category-b';
  54. }
  55. // Classe testable pour accéder aux méthodes protected
  56. class TestableResourceTreeBuilder extends ResourceTreeBuilder
  57. {
  58. public static function callGetterPublic($object, $propName): string
  59. {
  60. return parent::callGetter($object, $propName);
  61. }
  62. }
  63. class ResourceTreeBuilderTest extends TestCase
  64. {
  65. private function getResourceTreeBuilderMockFor(string $methodName): TestableResourceTreeBuilder|MockObject
  66. {
  67. return $this->getMockBuilder(TestableResourceTreeBuilder::class)
  68. ->setMethodsExcept([$methodName])
  69. ->getMock();
  70. }
  71. /**
  72. * @see ResourceTreeBuilder::makeTree()
  73. */
  74. public function testMakeTree(): void
  75. {
  76. $data = [
  77. new TestResource('category1', 'sub1', 'item1'),
  78. new TestResource('category1', 'sub1', 'item2'),
  79. new TestResource('category1', 'sub2', 'item3'),
  80. new TestResource('category2', 'sub3', 'item4'),
  81. ];
  82. $result = ResourceTreeBuilder::makeTree($data, 'category', 'subCategory', 'value');
  83. $expected = [
  84. 'category1' => [
  85. 'sub1' => ['item1', 'item2'],
  86. 'sub2' => ['item3'],
  87. ],
  88. 'category2' => [
  89. 'sub3' => ['item4'],
  90. ],
  91. ];
  92. self::assertEquals($expected, $result);
  93. }
  94. /**
  95. * @see ResourceTreeBuilder::makeTree()
  96. */
  97. public function testMakeTreeWithOneLevel(): void
  98. {
  99. $data = [
  100. new TestResource('category1', 'sub1', 'item1', 'name1'),
  101. new TestResource('category2', 'sub2', 'item2', 'name2'),
  102. new TestResource('category1', 'sub3', 'item3', 'name3'),
  103. ];
  104. $result = ResourceTreeBuilder::makeTree($data);
  105. $expected = ['name1', 'name2', 'name3'];
  106. self::assertEquals($expected, $result);
  107. }
  108. /**
  109. * @see ResourceTreeBuilder::makeTree()
  110. */
  111. public function testMakeTreeWithTwoLevels(): void
  112. {
  113. $data = [
  114. new TestResource('category1', 'sub1', 'item1'),
  115. new TestResource('category1', 'sub2', 'item2'),
  116. new TestResource('category2', 'sub1', 'item3'),
  117. ];
  118. $result = ResourceTreeBuilder::makeTree($data, 'category', 'subCategory');
  119. $expected = [
  120. 'category1' => ['sub1', 'sub2'],
  121. 'category2' => ['sub1'],
  122. ];
  123. self::assertEquals($expected, $result);
  124. }
  125. /**
  126. * @see ResourceTreeBuilder::makeTree()
  127. */
  128. public function testMakeTreeWithEmptyData(): void
  129. {
  130. $result = ResourceTreeBuilder::makeTree([]);
  131. self::assertEquals([], $result);
  132. }
  133. /**
  134. * @see ResourceTreeBuilder::callGetter()
  135. */
  136. public function testCallGetter(): void
  137. {
  138. $resource = new TestResource('cat1', 'sub1', 'val1');
  139. $result = TestableResourceTreeBuilder::callGetterPublic($resource, 'category');
  140. self::assertEquals('cat1', $result);
  141. }
  142. /**
  143. * @see ResourceTreeBuilder::callGetter()
  144. */
  145. public function testCallGetterWithEnum(): void
  146. {
  147. $resource = new TestResourceWithEnum(TestEnum::CATEGORY_A);
  148. $result = TestableResourceTreeBuilder::callGetterPublic($resource, 'category');
  149. self::assertEquals('category-a', $result);
  150. }
  151. /**
  152. * @see ResourceTreeBuilder::callGetter()
  153. */
  154. public function testCallGetterWithInvalidProperty(): void
  155. {
  156. $resource = new TestResource('cat1', 'sub1', 'val1');
  157. $this->expectException(\InvalidArgumentException::class);
  158. $this->expectExceptionMessage('Invalid property name');
  159. TestableResourceTreeBuilder::callGetterPublic($resource, 'invalidProperty');
  160. }
  161. /**
  162. * @see ResourceTreeBuilder::makeTree()
  163. */
  164. public function testMakeTreeWithDuplicateEntries(): void
  165. {
  166. $data = [
  167. new TestResource('category1', 'sub1', 'item1'),
  168. new TestResource('category1', 'sub1', 'item1'), // Duplicate
  169. new TestResource('category1', 'sub1', 'item2'),
  170. ];
  171. $result = ResourceTreeBuilder::makeTree($data, 'category', 'subCategory', 'value');
  172. $expected = [
  173. 'category1' => [
  174. 'sub1' => ['item1', 'item2'],
  175. ],
  176. ];
  177. self::assertEquals($expected, $result);
  178. }
  179. }