PageRenderTime 87ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/Propel/Tests/Generator/Behavior/Delegate/DelegateBehaviorTest.php

http://github.com/propelorm/Propel2
PHP | 310 lines | 232 code | 29 blank | 49 comment | 1 complexity | 38d8acf248111ef7d0e4f70296fe6ab6 MD5 | raw file
  1. <?php
  2. /**
  3. * MIT License. This file is part of the Propel package.
  4. * For the full copyright and license information, please view the LICENSE
  5. * file that was distributed with this source code.
  6. */
  7. namespace Propel\Tests\Generator\Behavior\Delegate;
  8. use DelegateBasketballer;
  9. use DelegateDelegate;
  10. use DelegateFootballer;
  11. use DelegateMain;
  12. use Map\DelegateDelegateTableMap;
  13. use Propel\Generator\Util\QuickBuilder;
  14. use Propel\Runtime\Exception\BadMethodCallException;
  15. use Propel\Tests\TestCase;
  16. use SecondDelegateDelegate;
  17. use TestTablePrefixSameDatabaseMain;
  18. /**
  19. * Tests for DelegateBehavior class
  20. *
  21. * @author François Zaninotto
  22. */
  23. class DelegateBehaviorTest extends TestCase
  24. {
  25. /**
  26. * @return void
  27. */
  28. public function setUp(): void
  29. {
  30. if (!class_exists('DelegateDelegate')) {
  31. $schema = <<<EOF
  32. <database name="delegate_behavior_test_1">
  33. <table name="delegate_main">
  34. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  35. <column name="title" type="VARCHAR" size="100" primaryString="true"/>
  36. <column name="delegate_id" type="INTEGER"/>
  37. <foreign-key foreignTable="second_delegate_delegate">
  38. <reference local="delegate_id" foreign="id"/>
  39. </foreign-key>
  40. <behavior name="delegate">
  41. <parameter name="to" value="delegate_delegate, second_delegate_delegate"/>
  42. </behavior>
  43. </table>
  44. <table name="delegate_delegate">
  45. <column name="subtitle" type="VARCHAR" size="100" primaryString="true"/>
  46. </table>
  47. <table name="second_delegate_delegate">
  48. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  49. <column name="summary" type="VARCHAR" size="100" primaryString="true"/>
  50. <behavior name="delegate">
  51. <parameter name="to" value="third_delegate_delegate"/>
  52. </behavior>
  53. </table>
  54. <table name="third_delegate_delegate">
  55. <column name="body" type="VARCHAR" size="100" primaryString="true"/>
  56. </table>
  57. <table name="delegate_player">
  58. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  59. <column name="first_name" type="VARCHAR" size="100" primaryString="true"/>
  60. <column name="last_name" type="VARCHAR" size="100" primaryString="true"/>
  61. </table>
  62. <table name="delegate_basketballer">
  63. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  64. <column name="points" type="INTEGER"/>
  65. <column name="field_goals" type="INTEGER"/>
  66. <column name="player_id" type="INTEGER"/>
  67. <foreign-key foreignTable="delegate_player">
  68. <reference local="player_id" foreign="id"/>
  69. </foreign-key>
  70. <behavior name="delegate">
  71. <parameter name="to" value="delegate_player"/>
  72. </behavior>
  73. </table>
  74. <table name="delegate_team">
  75. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  76. <column name="name" type="VARCHAR" size="100" primaryString="true"/>
  77. </table>
  78. <table name="delegate_footballer">
  79. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  80. <column name="goals_scored" type="INTEGER"/>
  81. <column name="fouls_committed" type="INTEGER"/>
  82. <column name="player_id" type="INTEGER"/>
  83. <foreign-key foreignTable="delegate_player">
  84. <reference local="player_id" foreign="id"/>
  85. </foreign-key>
  86. <column name="team_id" type="INTEGER"/>
  87. <foreign-key foreignTable="delegate_team">
  88. <reference local="team_id" foreign="id"/>
  89. </foreign-key>
  90. <behavior name="delegate">
  91. <parameter name="to" value="delegate_player, delegate_team"/>
  92. </behavior>
  93. </table>
  94. </database>
  95. EOF;
  96. QuickBuilder::buildSchema($schema);
  97. }
  98. }
  99. /**
  100. * @return void
  101. */
  102. public function testModifyTableRelatesOneToOneDelegate()
  103. {
  104. $delegateTable = DelegateDelegateTableMap::getTableMap();
  105. $this->assertEquals(2, count($delegateTable->getColumns()));
  106. $this->assertEquals(1, count($delegateTable->getRelations()));
  107. $this->assertTrue(method_exists('DelegateMain', 'getDelegateDelegate'));
  108. $this->assertTrue(method_exists('DelegateDelegate', 'getDelegateMain'));
  109. }
  110. /**
  111. * @return void
  112. */
  113. public function testOneToOneDelegationCreatesANewDelegateIfNoneExists()
  114. {
  115. $main = new DelegateMain();
  116. $main->setSubtitle('foo');
  117. $delegate = $main->getDelegateDelegate();
  118. $this->assertInstanceOf('DelegateDelegate', $delegate);
  119. $this->assertTrue($delegate->isNew());
  120. $this->assertEquals('foo', $delegate->getSubtitle());
  121. $this->assertEquals('foo', $main->getSubtitle());
  122. }
  123. /**
  124. * @return void
  125. */
  126. public function testManyToOneDelegationCreatesANewDelegateIfNoneExists()
  127. {
  128. $main = new DelegateMain();
  129. $main->setSummary('foo');
  130. $delegate = $main->getSecondDelegateDelegate();
  131. $this->assertInstanceOf('SecondDelegateDelegate', $delegate);
  132. $this->assertTrue($delegate->isNew());
  133. $this->assertEquals('foo', $delegate->getSummary());
  134. $this->assertEquals('foo', $main->getSummary());
  135. }
  136. /**
  137. * @return void
  138. */
  139. public function testOneToOneDelegationUsesExistingDelegateIfExists()
  140. {
  141. $main = new DelegateMain();
  142. $delegate = new DelegateDelegate();
  143. $delegate->setSubtitle('bar');
  144. $main->setDelegateDelegate($delegate);
  145. $this->assertEquals('bar', $main->getSubtitle());
  146. }
  147. /**
  148. * @return void
  149. */
  150. public function testManyToOneDelegationUsesExistingDelegateIfExists()
  151. {
  152. $main = new DelegateMain();
  153. $delegate = new SecondDelegateDelegate();
  154. $delegate->setSummary('bar');
  155. $main->setSecondDelegateDelegate($delegate);
  156. $this->assertEquals('bar', $main->getSummary());
  157. }
  158. /**
  159. * @return void
  160. */
  161. public function testAModelCanHaveSeveralDelegates()
  162. {
  163. $main = new DelegateMain();
  164. $main->setSubtitle('foo');
  165. $main->setSummary('bar');
  166. $delegate = $main->getDelegateDelegate();
  167. $this->assertInstanceOf('DelegateDelegate', $delegate);
  168. $this->assertTrue($delegate->isNew());
  169. $this->assertEquals('foo', $delegate->getSubtitle());
  170. $this->assertEquals('foo', $main->getSubtitle());
  171. $delegate = $main->getSecondDelegateDelegate();
  172. $this->assertInstanceOf('SecondDelegateDelegate', $delegate);
  173. $this->assertTrue($delegate->isNew());
  174. $this->assertEquals('bar', $delegate->getSummary());
  175. $this->assertEquals('bar', $main->getSummary());
  176. }
  177. /**
  178. * @return void
  179. */
  180. public function testAModelCannotHaveCascadingDelegates()
  181. {
  182. $this->expectException(BadMethodCallException::class);
  183. $main = new DelegateMain();
  184. $main->setSummary('bar');
  185. $main->setBody('baz');
  186. }
  187. /**
  188. * @return void
  189. */
  190. public function testOneToOneDelegatesCanBePersisted()
  191. {
  192. $main = new DelegateMain();
  193. $main->setSubtitle('foo');
  194. $main->save();
  195. $this->assertFalse($main->isNew());
  196. $this->assertFalse($main->getDelegateDelegate()->isNew());
  197. $this->assertNull($main->getSecondDelegateDelegate());
  198. }
  199. /**
  200. * @return void
  201. */
  202. public function testManyToOneDelegatesCanBePersisted()
  203. {
  204. $main = new DelegateMain();
  205. $main->setSummary('foo');
  206. $main->save();
  207. $this->assertFalse($main->isNew());
  208. $this->assertFalse($main->getSecondDelegateDelegate()->isNew());
  209. $this->assertNull($main->getDelegateDelegate());
  210. }
  211. /**
  212. * @return void
  213. */
  214. public function testDelegateSimulatesClassTableInheritance()
  215. {
  216. $basketballer = new DelegateBasketballer();
  217. $basketballer->setPoints(101);
  218. $basketballer->setFieldGoals(47);
  219. $this->assertNull($basketballer->getDelegatePlayer());
  220. $basketballer->setFirstName('Michael');
  221. $basketballer->setLastName('Giordano');
  222. $this->assertNotNull($basketballer->getDelegatePlayer());
  223. $this->assertEquals('Michael', $basketballer->getDelegatePlayer()->getFirstName());
  224. $this->assertEquals('Michael', $basketballer->getFirstName());
  225. $basketballer->save(); // should not throw exception
  226. }
  227. /**
  228. * @return void
  229. */
  230. public function testDelegateSimulatesMultipleClassTableInheritance()
  231. {
  232. $footballer = new DelegateFootballer();
  233. $footballer->setGoalsScored(43);
  234. $footballer->setFoulsCommitted(4);
  235. $this->assertNull($footballer->getDelegatePlayer());
  236. $this->assertNull($footballer->getDelegateTeam());
  237. $footballer->setFirstName('Michael');
  238. $footballer->setLastName('Giordano');
  239. $this->assertNotNull($footballer->getDelegatePlayer());
  240. $this->assertEquals('Michael', $footballer->getDelegatePlayer()->getFirstName());
  241. $this->assertEquals('Michael', $footballer->getFirstName());
  242. $footballer->setName('Saint Etienne');
  243. $this->assertNotNull($footballer->getDelegateTeam());
  244. $this->assertEquals('Saint Etienne', $footballer->getDelegateTeam()->getName());
  245. $this->assertEquals('Saint Etienne', $footballer->getName());
  246. $footballer->save(); // should not throw exception
  247. }
  248. /**
  249. * @return void
  250. */
  251. public function testTablePrefixSameDatabase()
  252. {
  253. $schema = <<<EOF
  254. <database name="testTablePrefixSameDatabase_database" tablePrefix="foo">
  255. <table name="testTablePrefixSameDatabase_main">
  256. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  257. <column name="title" type="VARCHAR" size="100" primaryString="true"/>
  258. <column name="delegate_id" type="INTEGER"/>
  259. <foreign-key foreignTable="testTablePrefixSameDatabase_delegate">
  260. <reference local="delegate_id" foreign="id"/>
  261. </foreign-key>
  262. <behavior name="delegate">
  263. <parameter name="to" value="testTablePrefixSameDatabase_delegate"/>
  264. </behavior>
  265. </table>
  266. <table name="testTablePrefixSameDatabase_delegate">
  267. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER"/>
  268. <column name="subtitle" type="VARCHAR" size="100" primaryString="true"/>
  269. </table>
  270. </database>
  271. EOF;
  272. QuickBuilder::buildSchema($schema);
  273. $main = new TestTablePrefixSameDatabaseMain();
  274. $main->setSubtitle('bar');
  275. $delegate = $main->getTestTablePrefixSameDatabaseDelegate();
  276. $this->assertInstanceOf('TestTablePrefixSameDatabaseDelegate', $delegate);
  277. $this->assertTrue($delegate->isNew());
  278. $this->assertEquals('bar', $delegate->getSubtitle());
  279. $this->assertEquals('bar', $main->getSubtitle());
  280. }
  281. }