DependentFixtureTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <?php
  2. namespace Doctrine\Tests\Common\DataFixtures;
  3. use Doctrine\Common\DataFixtures\Exception\CircularReferenceException;
  4. use Doctrine\Common\DataFixtures\Loader;
  5. use Doctrine\Common\DataFixtures\DependentFixtureInterface;
  6. use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
  7. use Doctrine\Common\DataFixtures\FixtureInterface;
  8. use Doctrine\Common\Persistence\ObjectManager;
  9. use InvalidArgumentException;
  10. use RuntimeException;
  11. /**
  12. * Test Fixture ordering by dependencies.
  13. *
  14. * @author Gustavo Adrian <comfortablynumb84@gmail.com>
  15. */
  16. class DependentFixtureTest extends BaseTest
  17. {
  18. public function test_orderFixturesByDependencies_orderClassesWithASingleParent()
  19. {
  20. $loader = new Loader();
  21. $loader->addFixture(new DependentFixture3);
  22. $loader->addFixture(new DependentFixture1);
  23. $loader->addFixture(new DependentFixture2);
  24. $loader->addFixture(new BaseParentFixture1);
  25. $orderedFixtures = $loader->getFixtures();
  26. $this->assertCount(4, $orderedFixtures);
  27. $this->assertInstanceOf(BaseParentFixture1::class, array_shift($orderedFixtures));
  28. $this->assertInstanceOf(DependentFixture1::class, array_shift($orderedFixtures));
  29. $this->assertInstanceOf(DependentFixture2::class, array_shift($orderedFixtures));
  30. $this->assertInstanceOf(DependentFixture3::class, array_shift($orderedFixtures));
  31. }
  32. public function test_orderFixturesByDependencies_orderClassesWithAMultipleParents()
  33. {
  34. $loader = new Loader();
  35. $addressFixture = new AddressFixture();
  36. $contactMethodFixture = new ContactMethodFixture();
  37. $contactFixture = new ContactFixture();
  38. $baseParentFixture = new BaseParentFixture1();
  39. $countryFixture = new CountryFixture();
  40. $stateFixture = new StateFixture();
  41. $loader->addFixture($addressFixture);
  42. $loader->addFixture($contactMethodFixture);
  43. $loader->addFixture($contactFixture);
  44. $loader->addFixture($baseParentFixture);
  45. $loader->addFixture($countryFixture);
  46. $loader->addFixture($stateFixture);
  47. $orderedFixtures = $loader->getFixtures();
  48. $this->assertCount(6, $orderedFixtures);
  49. $contactFixtureOrder = array_search($contactFixture, $orderedFixtures);
  50. $contactMethodFixtureOrder = array_search($contactMethodFixture, $orderedFixtures);
  51. $addressFixtureOrder = array_search($addressFixture, $orderedFixtures);
  52. $countryFixtureOrder = array_search($countryFixture, $orderedFixtures);
  53. $stateFixtureOrder = array_search($stateFixture, $orderedFixtures);
  54. $baseParentFixtureOrder = array_search($baseParentFixture, $orderedFixtures);
  55. // Order of fixtures is not exact. We need to test, however, that dependencies are
  56. // indeed satisfied
  57. // BaseParentFixture1 has no dependencies, so it will always be first in this case
  58. $this->assertEquals($baseParentFixtureOrder, 0);
  59. $this->assertGreaterThan($contactMethodFixtureOrder, $contactFixtureOrder);
  60. $this->assertGreaterThan($addressFixtureOrder, $contactFixtureOrder);
  61. $this->assertGreaterThan($countryFixtureOrder, $contactFixtureOrder);
  62. $this->assertGreaterThan($stateFixtureOrder, $contactFixtureOrder);
  63. $this->assertGreaterThan($contactMethodFixtureOrder, $contactFixtureOrder);
  64. $this->assertGreaterThan($stateFixtureOrder, $addressFixtureOrder);
  65. $this->assertGreaterThan($countryFixtureOrder, $addressFixtureOrder);
  66. }
  67. public function test_orderFixturesByDependencies_circularReferencesMakeMethodThrowCircularReferenceException()
  68. {
  69. $loader = new Loader();
  70. $loader->addFixture(new CircularReferenceFixture3);
  71. $loader->addFixture(new CircularReferenceFixture);
  72. $loader->addFixture(new CircularReferenceFixture2);
  73. $this->expectException(CircularReferenceException::class);
  74. $loader->getFixtures();
  75. }
  76. public function test_orderFixturesByDependencies_fixturesCantHaveItselfAsParent()
  77. {
  78. $loader = new Loader();
  79. $loader->addFixture(new FixtureWithItselfAsParent);
  80. $this->expectException(InvalidArgumentException::class);
  81. $loader->getFixtures();
  82. }
  83. public function test_inCaseThereAreFixturesOrderedByNumberAndByDependenciesBothOrdersAreExecuted()
  84. {
  85. $loader = new Loader();
  86. $loader->addFixture(new OrderedByNumberFixture1);
  87. $loader->addFixture(new OrderedByNumberFixture3);
  88. $loader->addFixture(new OrderedByNumberFixture2);
  89. $loader->addFixture(new DependentFixture3);
  90. $loader->addFixture(new DependentFixture1);
  91. $loader->addFixture(new DependentFixture2);
  92. $loader->addFixture(new BaseParentFixture1);
  93. $orderedFixtures = $loader->getFixtures();
  94. $this->assertCount(7, $orderedFixtures);
  95. $this->assertInstanceOf(OrderedByNumberFixture1::class, array_shift($orderedFixtures));
  96. $this->assertInstanceOf(OrderedByNumberFixture2::class, array_shift($orderedFixtures));
  97. $this->assertInstanceOf(OrderedByNumberFixture3::class, array_shift($orderedFixtures));
  98. $this->assertInstanceOf(BaseParentFixture1::class, array_shift($orderedFixtures));
  99. $this->assertInstanceOf(DependentFixture1::class, array_shift($orderedFixtures));
  100. $this->assertInstanceOf(DependentFixture2::class, array_shift($orderedFixtures));
  101. $this->assertInstanceOf(DependentFixture3::class, array_shift($orderedFixtures));
  102. }
  103. public function test_inCaseAFixtureHasAnUnexistentDependencyOrIfItWasntLoaded_throwsException()
  104. {
  105. $loader = new Loader();
  106. $loader->addFixture(new FixtureWithUnexistentDependency);
  107. $this->expectException(RuntimeException::class);
  108. $loader->getFixtures();
  109. }
  110. public function test_inCaseGetFixturesReturnsDifferentResultsEachTime()
  111. {
  112. $loader = new Loader();
  113. $loader->addFixture(new DependentFixture1);
  114. $loader->addFixture(new BaseParentFixture1);
  115. // Intentionally calling getFixtures() twice
  116. $loader->getFixtures();
  117. $orderedFixtures = $loader->getFixtures();
  118. $this->assertCount(2, $orderedFixtures);
  119. $this->assertInstanceOf(BaseParentFixture1::class, array_shift($orderedFixtures));
  120. $this->assertInstanceOf(DependentFixture1::class, array_shift($orderedFixtures));
  121. }
  122. }
  123. class DependentFixture1 implements FixtureInterface, DependentFixtureInterface
  124. {
  125. public function load(ObjectManager $manager)
  126. {}
  127. public function getDependencies()
  128. {
  129. return [BaseParentFixture1::class];
  130. }
  131. }
  132. class DependentFixture2 implements FixtureInterface, DependentFixtureInterface
  133. {
  134. public function load(ObjectManager $manager)
  135. {}
  136. public function getDependencies()
  137. {
  138. return [DependentFixture1::class];
  139. }
  140. }
  141. class DependentFixture3 implements FixtureInterface, DependentFixtureInterface
  142. {
  143. public function load(ObjectManager $manager)
  144. {}
  145. public function getDependencies()
  146. {
  147. return [DependentFixture2::class];
  148. }
  149. }
  150. class BaseParentFixture1 implements FixtureInterface
  151. {
  152. public function load(ObjectManager $manager)
  153. {}
  154. }
  155. class CountryFixture implements FixtureInterface, DependentFixtureInterface
  156. {
  157. public function load(ObjectManager $manager)
  158. {}
  159. public function getDependencies()
  160. {
  161. return [BaseParentFixture1::class];
  162. }
  163. }
  164. class StateFixture implements FixtureInterface, DependentFixtureInterface
  165. {
  166. public function load(ObjectManager $manager)
  167. {}
  168. public function getDependencies()
  169. {
  170. return [
  171. BaseParentFixture1::class,
  172. CountryFixture::class
  173. ];
  174. }
  175. }
  176. class AddressFixture implements FixtureInterface, DependentFixtureInterface
  177. {
  178. public function load(ObjectManager $manager)
  179. {}
  180. public function getDependencies()
  181. {
  182. return [
  183. BaseParentFixture1::class,
  184. CountryFixture::class,
  185. StateFixture::class
  186. ];
  187. }
  188. }
  189. class ContactMethodFixture implements FixtureInterface, DependentFixtureInterface
  190. {
  191. public function load(ObjectManager $manager)
  192. {}
  193. public function getDependencies()
  194. {
  195. return [BaseParentFixture1::class];
  196. }
  197. }
  198. class ContactFixture implements FixtureInterface, DependentFixtureInterface
  199. {
  200. public function load(ObjectManager $manager)
  201. {}
  202. public function getDependencies()
  203. {
  204. return [
  205. AddressFixture::class,
  206. ContactMethodFixture::class
  207. ];
  208. }
  209. }
  210. class CircularReferenceFixture implements FixtureInterface, DependentFixtureInterface
  211. {
  212. public function load(ObjectManager $manager)
  213. {}
  214. public function getDependencies()
  215. {
  216. return [CircularReferenceFixture3::class];
  217. }
  218. }
  219. class CircularReferenceFixture2 implements FixtureInterface, DependentFixtureInterface
  220. {
  221. public function load(ObjectManager $manager)
  222. {}
  223. public function getDependencies()
  224. {
  225. return [CircularReferenceFixture::class];
  226. }
  227. }
  228. class CircularReferenceFixture3 implements FixtureInterface, DependentFixtureInterface
  229. {
  230. public function load(ObjectManager $manager)
  231. {}
  232. public function getDependencies()
  233. {
  234. return [CircularReferenceFixture2::class];
  235. }
  236. }
  237. class FixtureWithItselfAsParent implements FixtureInterface, DependentFixtureInterface
  238. {
  239. public function load(ObjectManager $manager)
  240. {}
  241. public function getDependencies()
  242. {
  243. return [FixtureWithItselfAsParent::class];
  244. }
  245. }
  246. class FixtureWithUnexistentDependency implements FixtureInterface, DependentFixtureInterface
  247. {
  248. public function load(ObjectManager $manager)
  249. {}
  250. public function getDependencies()
  251. {
  252. return ['UnexistentDependency'];
  253. }
  254. }
  255. class FixtureImplementingBothOrderingInterfaces implements FixtureInterface, OrderedFixtureInterface, DependentFixtureInterface
  256. {
  257. public function load(ObjectManager $manager)
  258. {}
  259. public function getOrder()
  260. {
  261. return 1;
  262. }
  263. public function getDependencies()
  264. {
  265. return [FixtureWithItselfAsParent::class];
  266. }
  267. }
  268. class OrderedByNumberFixture1 implements FixtureInterface, OrderedFixtureInterface
  269. {
  270. public function load(ObjectManager $manager)
  271. {}
  272. public function getOrder()
  273. {
  274. return 1;
  275. }
  276. }
  277. class OrderedByNumberFixture2 implements FixtureInterface, OrderedFixtureInterface
  278. {
  279. public function load(ObjectManager $manager)
  280. {}
  281. public function getOrder()
  282. {
  283. return 5;
  284. }
  285. }
  286. class OrderedByNumberFixture3 implements FixtureInterface, OrderedFixtureInterface
  287. {
  288. public function load(ObjectManager $manager)
  289. {}
  290. public function getOrder()
  291. {
  292. return 10;
  293. }
  294. }