EntityUtilsTest.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <?php
  2. namespace App\Tests\Unit\Service\Utils;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Billing\BillingSetting;
  5. use App\Entity\Billing\ResidenceArea;
  6. use App\Entity\Education\EducationTiming;
  7. use App\Entity\Organization\Organization;
  8. use App\Service\Utils\EntityUtils;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Doctrine\Persistence\Mapping\ClassMetadata;
  11. use Doctrine\Persistence\Mapping\ClassMetadataFactory;
  12. use PHPUnit\Framework\MockObject\MockObject;
  13. use PHPUnit\Framework\TestCase;
  14. class TestableEntityUtils extends EntityUtils
  15. {
  16. public function getEntityNamesMappingCache(): array {
  17. return $this->entityNamesMappingCache;
  18. }
  19. public function setEntityNamesMappingCache(array $entityNamesMappingCache) {
  20. $this->entityNamesMappingCache = $entityNamesMappingCache;
  21. }
  22. public function organizationDefaultValue($entity, Access $access): void
  23. {
  24. parent::organizationDefaultValue($entity, $access);
  25. }
  26. public function billingSettingDefaultValueDefaultValue($entity, Access $access): void
  27. {
  28. parent::billingSettingDefaultValueDefaultValue($entity, $access);
  29. }
  30. public function populateEntityNamesMappingCache(): void
  31. {
  32. parent::populateEntityNamesMappingCache();
  33. }
  34. }
  35. class EntityUtilsTest extends TestCase
  36. {
  37. private EntityManagerInterface $entityManager;
  38. public function setUp(): void {
  39. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  40. }
  41. protected function getEntityUtilsMockFor(string $method): MockObject | TestableEntityUtils
  42. {
  43. return $this->getMockBuilder(TestableEntityUtils::class)
  44. ->setConstructorArgs([$this->entityManager])
  45. ->setMethodsExcept(['getEntityNamesMappingCache', 'setEntityNamesMappingCache', $method])
  46. ->getMock();
  47. }
  48. /**
  49. * @see EntityUtils::defaultValueSettersByAccess()
  50. */
  51. public function testDefaultValueSettersByAccess(): void
  52. {
  53. $utils = $this->getEntityUtilsMockFor('defaultValueSettersByAccess');
  54. $entity = $this->getMockBuilder(Organization::class)->getMock();
  55. $access = $this->getMockBuilder(Access::class)->getMock();
  56. $utils->expects(self::once())->method('organizationDefaultValue')->with($entity, $access);
  57. $utils->expects(self::once())->method('billingSettingDefaultValueDefaultValue')->with($entity, $access);
  58. $utils->defaultValueSettersByAccess($entity, $access);
  59. }
  60. /**
  61. * @see EntityUtils::organizationDefaultValue()
  62. */
  63. public function testOrganizationDefaultValue(): void
  64. {
  65. $utils = $this->getEntityUtilsMockFor('organizationDefaultValue');
  66. $organization = $this->getMockBuilder(Organization::class)->getMock();
  67. $entity = new EducationTiming(); // Can't test this method with a mocked entity...
  68. $access = $this->getMockBuilder(Access::class)->getMock();
  69. $access->method('getOrganization')->willReturn($organization);
  70. $utils->organizationDefaultValue($entity, $access);
  71. $this->assertEquals($organization, $entity->getOrganization());
  72. }
  73. /**
  74. * @see EntityUtils::billingSettingDefaultValueDefaultValue()
  75. */
  76. public function testBillingSettingDefaultValueDefaultValue(): void
  77. {
  78. $utils = $this->getEntityUtilsMockFor('billingSettingDefaultValueDefaultValue');
  79. $entity = new ResidenceArea(); // Can't test this method with a mocked entity...
  80. $billingSetting = $this->getMockBuilder(BillingSetting::class)->getMock();
  81. $organization = $this->getMockBuilder(Organization::class)->getMock();
  82. $organization->method('getBillingSetting')->willReturn($billingSetting);
  83. $access = $this->getMockBuilder(Access::class)->getMock();
  84. $access->method('getOrganization')->willReturn($organization);
  85. $utils->billingSettingDefaultValueDefaultValue($entity, $access);
  86. $this->assertEquals($billingSetting, $entity->getBillingSetting());
  87. }
  88. public function testGetEntityNameFromFullName(): void {
  89. $utils = $this->getEntityUtilsMockFor('getEntityNameFromFullName');
  90. $this->assertEquals(
  91. 'File',
  92. $utils->getEntityNameFromFullName('\App\Entity\Core\File')
  93. );
  94. $this->assertEquals(
  95. 'File',
  96. $utils->getEntityNameFromFullName('\File')
  97. );
  98. $this->assertEquals(
  99. 'File',
  100. $utils->getEntityNameFromFullName('File')
  101. );
  102. }
  103. public function testGetFullNameFromEntityName(): void {
  104. $utils = $this->getEntityUtilsMockFor('getFullNameFromEntityName');
  105. $utils->setEntityNamesMappingCache(['File' => '\App\Entity\Core\File']);
  106. $utils->expects(self::never())->method('populateEntityNamesMappingCache');
  107. $this->assertEquals(
  108. '\App\Entity\Core\File',
  109. $utils->getFullNameFromEntityName('File')
  110. );
  111. }
  112. public function testGetFullNameFromEntityNameEmptyCache(): void {
  113. $utils = $this->getEntityUtilsMockFor('getFullNameFromEntityName');
  114. $utils->setEntityNamesMappingCache([]);
  115. $utils
  116. ->expects(self::once())
  117. ->method('populateEntityNamesMappingCache')
  118. ->willReturnCallback(function () use ($utils) {
  119. $utils->setEntityNamesMappingCache(['File' => '\App\Entity\Core\File']);})
  120. ;
  121. $this->assertEquals(
  122. '\App\Entity\Core\File',
  123. $utils->getFullNameFromEntityName('File')
  124. );
  125. }
  126. public function testGetFullNameFromEntityNameNonExistingEntity(): void {
  127. $utils = $this->getEntityUtilsMockFor('getFullNameFromEntityName');
  128. $utils->setEntityNamesMappingCache(['File' => '\App\Entity\Core\File']);
  129. $utils->expects(self::never())->method('populateEntityNamesMappingCache');
  130. $this->expectException(\LogicException::class);
  131. $this->expectExceptionMessage('No entity found for name `Foo`');
  132. $utils->getFullNameFromEntityName('Foo');
  133. }
  134. public function testPopulateEntityNamesMappingCache(): void {
  135. $utils = $this->getEntityUtilsMockFor('populateEntityNamesMappingCache');
  136. $metadataFactory = $this->getMockBuilder(ClassMetadataFactory::class)->getMock();
  137. $this->entityManager
  138. ->expects(self::once())
  139. ->method('getMetadataFactory')
  140. ->willReturn($metadataFactory);
  141. $entityMetadata1 = $this->getMockBuilder(ClassMetadata::class)->getMock();
  142. $entityMetadata1->method('getName')->willReturn('/Namespace/Entity1');
  143. $entityMetadata2 = $this->getMockBuilder(ClassMetadata::class)->getMock();
  144. $entityMetadata2->method('getName')->willReturn('/Namespace/Entity2');
  145. $entityMetadata3 = $this->getMockBuilder(ClassMetadata::class)->getMock();
  146. $entityMetadata3->method('getName')->willReturn('/Namespace/Entity3');
  147. $metadataFactory
  148. ->method('getAllMetadata')
  149. ->willReturn([$entityMetadata1, $entityMetadata2, $entityMetadata3]);
  150. $utils->method('getEntityNameFromFullName')->willReturnMap(
  151. [
  152. ['/Namespace/Entity1', 'Entity1'],
  153. ['/Namespace/Entity2', 'Entity2'],
  154. ['/Namespace/Entity3', 'Entity3'],
  155. ]
  156. );
  157. $this->assertEquals(
  158. [],
  159. $utils->getEntityNamesMappingCache()
  160. );
  161. $utils->populateEntityNamesMappingCache();
  162. $this->assertEquals(
  163. [
  164. 'Entity1' => '/Namespace/Entity1',
  165. 'Entity2' => '/Namespace/Entity2',
  166. 'Entity3' => '/Namespace/Entity3',
  167. ],
  168. $utils->getEntityNamesMappingCache()
  169. );
  170. }
  171. public function testPopulateEntityNamesMappingCacheWithExistingCache(): void {
  172. $utils = $this->getEntityUtilsMockFor('populateEntityNamesMappingCache');
  173. $metadataFactory = $this->getMockBuilder(ClassMetadataFactory::class)->getMock();
  174. $this->entityManager
  175. ->expects(self::once())
  176. ->method('getMetadataFactory')
  177. ->willReturn($metadataFactory);
  178. $entityMetadata1 = $this->getMockBuilder(ClassMetadata::class)->getMock();
  179. $entityMetadata1->method('getName')->willReturn('/Namespace/Entity');
  180. $metadataFactory
  181. ->method('getAllMetadata')
  182. ->willReturn([$entityMetadata1]);
  183. $utils->method('getEntityNameFromFullName')->willReturnMap(
  184. [
  185. ['/Namespace/Entity', 'Entity'],
  186. ]
  187. );
  188. $utils->setEntityNamesMappingCache(['OtherEntity' => '/Namespace/OtherEntity']);
  189. $this->assertEquals(
  190. ['OtherEntity' => '/Namespace/OtherEntity',],
  191. $utils->getEntityNamesMappingCache()
  192. );
  193. $utils->populateEntityNamesMappingCache();
  194. $this->assertEquals(
  195. ['Entity' => '/Namespace/Entity'],
  196. $utils->getEntityNamesMappingCache()
  197. );
  198. }
  199. public function testGetNamespaceFromName(): void {
  200. $utils = $this->getEntityUtilsMockFor('getNamespaceFromName');
  201. $this->assertEquals(
  202. 'App\Entity\Core',
  203. $utils->getNamespaceFromName('\App\Entity\Core\File')
  204. );
  205. $this->assertEquals(
  206. '',
  207. $utils->getNamespaceFromName('\File')
  208. );
  209. }
  210. }