EntityUtilsTest.php 9.3 KB

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