PageRenderTime 63ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/test/testsuite/generator/behavior/versionable/VersionableBehaviorObjectBuilderModifierTest.php

https://github.com/mattleff/propel
PHP | 650 lines | 565 code | 47 blank | 38 comment | 2 complexity | f71f84ecf34075f39a017377f8a46227 MD5 | raw file
  1. <?php
  2. /*
  3. * $Id: VersionableBehaviorTest.php 1460 2010-01-17 22:36:48Z francois $
  4. * This file is part of the Propel package.
  5. * For the full copyright and license information, please view the LICENSE
  6. * file that was distributed with this source code.
  7. *
  8. * @license MIT License
  9. */
  10. require_once 'PHPUnit/Framework.php';
  11. require_once dirname(__FILE__) . '/../../../../../generator/lib/util/PropelQuickBuilder.php';
  12. require_once dirname(__FILE__) . '/../../../../../generator/lib/behavior/versionable/VersionableBehavior.php';
  13. require_once dirname(__FILE__) . '/../../../../../runtime/lib/Propel.php';
  14. /**
  15. * Tests for VersionableBehavior class
  16. *
  17. * @author François Zaninotto
  18. * @version $Revision: 2266 $
  19. * @package generator.behavior.versionable
  20. */
  21. class VersionableBehaviorObjectBuilderModifierTest extends PHPUnit_Framework_TestCase
  22. {
  23. public function setUp()
  24. {
  25. if (!class_exists('VersionableBehaviorTest1')) {
  26. $schema = <<<EOF
  27. <database name="versionable_behavior_test_1">
  28. <table name="versionable_behavior_test_1">
  29. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  30. <column name="bar" type="INTEGER" />
  31. <behavior name="versionable" />
  32. </table>
  33. <table name="versionable_behavior_test_2">
  34. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  35. <column name="bar" type="INTEGER" />
  36. <behavior name="versionable">
  37. <parameter name="version_column" value="foo_ver" />
  38. </behavior>
  39. </table>
  40. <table name="versionable_behavior_test_3">
  41. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  42. <column name="bar" type="INTEGER" />
  43. <behavior name="versionable">
  44. <parameter name="version_table" value="foo_ver" />
  45. </behavior>
  46. </table>
  47. <table name="versionable_behavior_test_4">
  48. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  49. <column name="bar" type="INTEGER" />
  50. <behavior name="versionable">
  51. <parameter name="log_created_at" value="true" />
  52. <parameter name="log_created_by" value="true" />
  53. <parameter name="log_comment" value="true" />
  54. </behavior>
  55. </table>
  56. <table name="versionable_behavior_test_5">
  57. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  58. <column name="foo" type="VARCHAR" size="100" />
  59. <column name="foreign_id" type="INTEGER" />
  60. <foreign-key foreignTable="versionable_behavior_test_4">
  61. <reference local="foreign_id" foreign="id" />
  62. </foreign-key>
  63. <behavior name="versionable" />
  64. </table>
  65. </database>
  66. EOF;
  67. PropelQuickBuilder::buildSchema($schema);
  68. }
  69. if (!class_exists('VersionableBehaviorTest6')) {
  70. $schema2 = <<<EOF
  71. <database name="versionable_behavior_test_2" defaultPhpNamingMethod="nochange">
  72. <table name="VersionableBehaviorTest6">
  73. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  74. <column name="FooBar" type="VARCHAR" size="100" />
  75. <behavior name="versionable">
  76. <parameter name="log_created_at" value="true" />
  77. <parameter name="log_created_by" value="true" />
  78. <parameter name="log_comment" value="true" />
  79. </behavior>
  80. </table>
  81. <table name="VersionableBehaviorTest7">
  82. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  83. <column name="FooBar" type="VARCHAR" size="100" />
  84. <behavior name="versionable">
  85. <parameter name="log_created_at" value="true" />
  86. <parameter name="log_created_by" value="true" />
  87. <parameter name="log_comment" value="true" />
  88. <parameter name="version_created_by_column" value="VersionCreatedBy" />
  89. <parameter name="version_created_at_column" value="VersionCreatedAt" />
  90. <parameter name="version_comment_column" value="MyComment" />
  91. </behavior>
  92. </table>
  93. EOF;
  94. PropelQuickBuilder::buildSchema($schema2);
  95. }
  96. }
  97. public function testGetVersionExists()
  98. {
  99. $this->assertTrue(method_exists('VersionableBehaviorTest1', 'getVersion'));
  100. $this->assertTrue(method_exists('VersionableBehaviorTest2', 'getVersion'));
  101. }
  102. public function testSetVersionExists()
  103. {
  104. $this->assertTrue(method_exists('VersionableBehaviorTest1', 'setVersion'));
  105. $this->assertTrue(method_exists('VersionableBehaviorTest2', 'setVersion'));
  106. }
  107. public function testMethodsExistsNoChangeNaming()
  108. {
  109. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setFooBar'));
  110. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_created_at'));
  111. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_created_by'));
  112. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_comment'));
  113. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setFooBar'));
  114. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setVersionCreatedAt'));
  115. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setVersionCreatedBy'));
  116. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setMyComment'));
  117. }
  118. public function providerForNewActiveRecordTests()
  119. {
  120. return array(
  121. array('VersionableBehaviorTest1'),
  122. array('VersionableBehaviorTest2'),
  123. );
  124. }
  125. /**
  126. * @dataProvider providerForNewActiveRecordTests
  127. */
  128. public function testVersionGetterAndSetter($class)
  129. {
  130. $o = new $class;
  131. $o->setVersion(1234);
  132. $this->assertEquals(1234, $o->getVersion());
  133. }
  134. /**
  135. * @dataProvider providerForNewActiveRecordTests
  136. */
  137. public function testVersionDefaultValue($class)
  138. {
  139. $o = new $class;
  140. $this->assertEquals(0, $o->getVersion());
  141. }
  142. /**
  143. * @dataProvider providerForNewActiveRecordTests
  144. */
  145. public function testVersionValueInitializesOnInsert($class)
  146. {
  147. $o = new $class;
  148. $o->save();
  149. $this->assertEquals(1, $o->getVersion());
  150. }
  151. /**
  152. * @dataProvider providerForNewActiveRecordTests
  153. */
  154. public function testVersionValueIncrementsOnUpdate($class)
  155. {
  156. $o = new $class;
  157. $o->save();
  158. $this->assertEquals(1, $o->getVersion());
  159. $o->setBar(12);
  160. $o->save();
  161. $this->assertEquals(2, $o->getVersion());
  162. $o->setBar(13);
  163. $o->save();
  164. $this->assertEquals(3, $o->getVersion());
  165. $o->setBar(12);
  166. $o->save();
  167. $this->assertEquals(4, $o->getVersion());
  168. }
  169. /**
  170. * @dataProvider providerForNewActiveRecordTests
  171. */
  172. public function testVersionDoesNotIncrementOnUpdateWithNoChange($class)
  173. {
  174. $o = new $class;
  175. $o->setBar(12);
  176. $o->save();
  177. $this->assertEquals(1, $o->getVersion());
  178. $o->setBar(12);
  179. $o->save();
  180. $this->assertEquals(1, $o->getVersion());
  181. }
  182. /**
  183. * @dataProvider providerForNewActiveRecordTests
  184. */
  185. public function testVersionDoesNotIncrementWhenVersioningIsDisabled($class)
  186. {
  187. $o = new $class;
  188. VersionableBehaviorTest1Peer::disableVersioning();
  189. VersionableBehaviorTest2Peer::disableVersioning();
  190. $o->setBar(12);
  191. $o->save();
  192. $this->assertEquals(0, $o->getVersion());
  193. $o->setBar(13);
  194. $o->save();
  195. $this->assertEquals(0, $o->getVersion());
  196. VersionableBehaviorTest1Peer::enableVersioning();
  197. VersionableBehaviorTest2Peer::enableVersioning();
  198. }
  199. public function testNewVersionCreatesRecordInVersionTable()
  200. {
  201. VersionableBehaviorTest1Query::create()->deleteAll();
  202. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  203. $o = new VersionableBehaviorTest1();
  204. $o->save();
  205. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  206. $this->assertEquals(1, $versions->count());
  207. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest1());
  208. $o->save();
  209. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  210. $this->assertEquals(1, $versions->count());
  211. $o->setBar(123);
  212. $o->save();
  213. $versions = VersionableBehaviorTest1VersionQuery::create()->orderByVersion()->find();
  214. $this->assertEquals(2, $versions->count());
  215. $this->assertEquals($o->getId(), $versions[0]->getId());
  216. $this->assertNull($versions[0]->getBar());
  217. $this->assertEquals($o->getId(), $versions[1]->getId());
  218. $this->assertEquals(123, $versions[1]->getBar());
  219. }
  220. public function testNewVersionCreatesRecordInVersionTableWithCustomName()
  221. {
  222. VersionableBehaviorTest3Query::create()->deleteAll();
  223. VersionableBehaviorTest3VersionQuery::create()->deleteAll();
  224. $o = new VersionableBehaviorTest3();
  225. $o->save();
  226. $versions = VersionableBehaviorTest3VersionQuery::create()->find();
  227. $this->assertEquals(1, $versions->count());
  228. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest3());
  229. $o->save();
  230. $versions = VersionableBehaviorTest3VersionQuery::create()->find();
  231. $this->assertEquals(1, $versions->count());
  232. $o->setBar(123);
  233. $o->save();
  234. $versions = VersionableBehaviorTest3VersionQuery::create()->orderByVersion()->find();
  235. $this->assertEquals(2, $versions->count());
  236. $this->assertEquals($o->getId(), $versions[0]->getId());
  237. $this->assertNull($versions[0]->getBar());
  238. $this->assertEquals($o->getId(), $versions[1]->getId());
  239. $this->assertEquals(123, $versions[1]->getBar());
  240. }
  241. public function testNewVersionDoesNotCreateRecordInVersionTableWhenVersioningIsDisabled()
  242. {
  243. VersionableBehaviorTest1Query::create()->deleteAll();
  244. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  245. VersionableBehaviorTest1Peer::disableVersioning();
  246. $o = new VersionableBehaviorTest1();
  247. $o->save();
  248. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  249. $this->assertEquals(0, $versions->count());
  250. VersionableBehaviorTest1Peer::enableVersioning();
  251. }
  252. public function testDeleteObjectDeletesRecordInVersionTable()
  253. {
  254. VersionableBehaviorTest1Query::create()->deleteAll();
  255. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  256. $o = new VersionableBehaviorTest1();
  257. $o->save();
  258. $o->setBar(123);
  259. $o->save();
  260. $nbVersions = VersionableBehaviorTest1VersionQuery::create()->count();
  261. $this->assertEquals(2, $nbVersions);
  262. $o->delete();
  263. $nbVersions = VersionableBehaviorTest1VersionQuery::create()->count();
  264. $this->assertEquals(0, $nbVersions);
  265. }
  266. public function testDeleteObjectDeletesRecordInVersionTableWithCustomName()
  267. {
  268. VersionableBehaviorTest3Query::create()->deleteAll();
  269. VersionableBehaviorTest3VersionQuery::create()->deleteAll();
  270. $o = new VersionableBehaviorTest3();
  271. $o->save();
  272. $o->setBar(123);
  273. $o->save();
  274. $nbVersions = VersionableBehaviorTest3VersionQuery::create()->count();
  275. $this->assertEquals(2, $nbVersions);
  276. $o->delete();
  277. $nbVersions = VersionableBehaviorTest3VersionQuery::create()->count();
  278. $this->assertEquals(0, $nbVersions);
  279. }
  280. public function testToVersion()
  281. {
  282. $o = new VersionableBehaviorTest1();
  283. $o->setBar(123); // version 1
  284. $o->save();
  285. $o->setBar(456); // version 2
  286. $o->save();
  287. $o->toVersion(1);
  288. $this->assertEquals(123, $o->getBar());
  289. $o->toVersion(2);
  290. $this->assertEquals(456, $o->getBar());
  291. }
  292. public function testToVersionAllowsFurtherSave()
  293. {
  294. $o = new VersionableBehaviorTest1();
  295. $o->setBar(123); // version 1
  296. $o->save();
  297. $o->setBar(456); // version 2
  298. $o->save();
  299. $o->toVersion(1);
  300. $this->assertTrue($o->isModified());
  301. $o->save();
  302. $this->assertEquals(3, $o->getVersion());
  303. }
  304. /**
  305. * @expectedException PropelException
  306. */
  307. public function testToVersionThrowsExceptionOnIncorrectVersion()
  308. {
  309. $o = new VersionableBehaviorTest1();
  310. $o->setBar(123); // version 1
  311. $o->save();
  312. $o->toVersion(2);
  313. }
  314. public function testToVersionPreservesVersionedFkObjects()
  315. {
  316. $a = new VersionableBehaviorTest4();
  317. $a->setBar(123); // a1
  318. $b = new VersionableBehaviorTest5();
  319. $b->setFoo('Hello');
  320. $b->setVersionableBehaviorTest4($a);
  321. $b->save(); //b1
  322. $a->setBar(456); //a2
  323. $b->save(); // b2
  324. $b->setFoo('World');
  325. $b->save(); // b3
  326. $b->toVersion(2);
  327. $this->assertEquals($b->getVersion(), 2);
  328. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  329. $b->toVersion(1);
  330. $this->assertEquals($b->getVersion(), 1);
  331. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 1);
  332. $b->toVersion(3);
  333. $this->assertEquals($b->getVersion(), 3);
  334. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  335. }
  336. public function testToVersionPreservesVersionedReferrerObjects()
  337. {
  338. $b1 = new VersionableBehaviorTest5();
  339. $b1->setFoo('Hello');
  340. $b2 = new VersionableBehaviorTest5();
  341. $b2->setFoo('World');
  342. $a = new VersionableBehaviorTest4();
  343. $a->setBar(123); // a1
  344. $a->addVersionableBehaviorTest5($b1);
  345. $a->addVersionableBehaviorTest5($b2);
  346. $a->save(); //b1
  347. $this->assertEquals(1, $a->getVersion());
  348. $bs = $a->getVersionableBehaviorTest5s();
  349. $this->assertEquals(1, $bs[0]->getVersion());
  350. $this->assertEquals(1, $bs[1]->getVersion());
  351. $b1->setFoo('Heloo');
  352. $a->save();
  353. $this->assertEquals(2, $a->getVersion());
  354. $bs = $a->getVersionableBehaviorTest5s();
  355. $this->assertEquals(2, $bs[0]->getVersion());
  356. $this->assertEquals(1, $bs[1]->getVersion());
  357. $b3 = new VersionableBehaviorTest5();
  358. $b3->setFoo('Yep');
  359. $a->clearVersionableBehaviorTest5s();
  360. $a->addVersionableBehaviorTest5($b3);
  361. $a->save();
  362. $a->clearVersionableBehaviorTest5s();
  363. $this->assertEquals(3, $a->getVersion());
  364. $bs = $a->getVersionableBehaviorTest5s();
  365. $this->assertEquals(2, $bs[0]->getVersion());
  366. $this->assertEquals(1, $bs[1]->getVersion());
  367. $this->assertEquals(1, $bs[2]->getVersion());
  368. }
  369. public function testGetLastVersionNumber()
  370. {
  371. $o = new VersionableBehaviorTest1();
  372. $this->assertEquals(0, $o->getLastVersionNumber());
  373. $o->setBar(123); // version 1
  374. $o->save();
  375. $this->assertEquals(1, $o->getLastVersionNumber());
  376. $o->setBar(456); // version 2
  377. $o->save();
  378. $this->assertEquals(2, $o->getLastVersionNumber());
  379. $o->toVersion(1);
  380. $o->save();
  381. $this->assertEquals(3, $o->getLastVersionNumber());
  382. }
  383. public function testIsLastVersion()
  384. {
  385. $o = new VersionableBehaviorTest1();
  386. $this->assertTrue($o->isLastVersion());
  387. $o->setBar(123); // version 1
  388. $o->save();
  389. $this->assertTrue($o->isLastVersion());
  390. $o->setBar(456); // version 2
  391. $o->save();
  392. $this->assertTrue($o->isLastVersion());
  393. $o->toVersion(1);
  394. $this->assertFalse($o->isLastVersion());
  395. $o->save();
  396. $this->assertTrue($o->isLastVersion());
  397. }
  398. public function testIsVersioningNecessary()
  399. {
  400. $o = new VersionableBehaviorTest1();
  401. $this->assertTrue($o->isVersioningNecessary());
  402. $o->save();
  403. $this->assertFalse($o->isVersioningNecessary());
  404. $o->setBar(123);
  405. $this->assertTrue($o->isVersioningNecessary());
  406. $o->save();
  407. $this->assertFalse($o->isVersioningNecessary());
  408. VersionableBehaviorTest1Peer::disableVersioning();
  409. $o = new VersionableBehaviorTest1();
  410. $this->assertFalse($o->isVersioningNecessary());
  411. $o->save();
  412. $this->assertFalse($o->isVersioningNecessary());
  413. $o->setBar(123);
  414. $this->assertFalse($o->isVersioningNecessary());
  415. $o->save();
  416. $this->assertFalse($o->isVersioningNecessary());
  417. VersionableBehaviorTest1Peer::enableVersioning();
  418. }
  419. public function testAddVersionNewObject()
  420. {
  421. VersionableBehaviorTest1Peer::disableVersioning();
  422. VersionableBehaviorTest1Query::create()->deleteAll();
  423. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  424. $o = new VersionableBehaviorTest1();
  425. $o->addVersion();
  426. $o->save();
  427. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  428. $this->assertEquals(1, $versions->count());
  429. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest1());
  430. VersionableBehaviorTest1Peer::enableVersioning();
  431. }
  432. public function testVersionCreatedAt()
  433. {
  434. $o = new VersionableBehaviorTest4();
  435. $t = time();
  436. $o->save();
  437. $version = VersionableBehaviorTest4VersionQuery::create()
  438. ->filterByVersionableBehaviorTest4($o)
  439. ->findOne();
  440. $this->assertEquals($t, $version->getVersionCreatedAt('U'));
  441. $o = new VersionableBehaviorTest4();
  442. $inThePast = time() - 123456;
  443. $o->setVersionCreatedAt($inThePast);
  444. $o->save();
  445. $this->assertEquals($inThePast, $o->getVersionCreatedAt('U'));
  446. $version = VersionableBehaviorTest4VersionQuery::create()
  447. ->filterByVersionableBehaviorTest4($o)
  448. ->findOne();
  449. $this->assertEquals($o->getVersionCreatedAt(), $version->getVersionCreatedAt());
  450. }
  451. public function testVersionCreatedBy()
  452. {
  453. $o = new VersionableBehaviorTest4();
  454. $o->setVersionCreatedBy('me me me');
  455. $o->save();
  456. $version = VersionableBehaviorTest4VersionQuery::create()
  457. ->filterByVersionableBehaviorTest4($o)
  458. ->findOne();
  459. $this->assertEquals('me me me', $version->getVersionCreatedBy());
  460. }
  461. public function testSaveAndModifyWithNoChangeSchema()
  462. {
  463. $o = new VersionableBehaviorTest7();
  464. //$o->setVersionCreatedBy('You and I');
  465. $o->save();
  466. $this->assertEquals(1, $o->getVersion());
  467. $o->setFooBar('Something');
  468. $o->save();
  469. $this->assertEquals(2, $o->getVersion());
  470. $o = new VersionableBehaviorTest6();
  471. //$o->setVersionCreatedBy('You and I');
  472. $o->save();
  473. $this->assertEquals(1, $o->getVersion());
  474. $o->setFooBar('Something');
  475. $o->save();
  476. $this->assertEquals(2, $o->getVersion());
  477. }
  478. public function testVersionComment()
  479. {
  480. $o = new VersionableBehaviorTest4();
  481. $o->setVersionComment('Because you deserve it');
  482. $o->save();
  483. $version = VersionableBehaviorTest4VersionQuery::create()
  484. ->filterByVersionableBehaviorTest4($o)
  485. ->findOne();
  486. $this->assertEquals('Because you deserve it', $version->getVersionComment());
  487. }
  488. public function testToVersionWorksWithComments()
  489. {
  490. $o = new VersionableBehaviorTest4();
  491. $o->setVersionComment('Because you deserve it');
  492. $o->setBar(123); // version 1
  493. $o->save();
  494. $o->setVersionComment('Unless I change my mind');
  495. $o->setBar(456); // version 2
  496. $o->save();
  497. $o->toVersion(1);
  498. $this->assertEquals('Because you deserve it', $o->getVersionComment());
  499. $o->toVersion(2);
  500. $this->assertEquals('Unless I change my mind', $o->getVersionComment());
  501. }
  502. public function testGetOneVersion()
  503. {
  504. $o = new VersionableBehaviorTest1();
  505. $o->setBar(123); // version 1
  506. $o->save();
  507. $o->setBar(456); // version 2
  508. $o->save();
  509. $version = $o->getOneVersion(1);
  510. $this->assertTrue($version instanceof VersionableBehaviorTest1Version);
  511. $this->assertEquals(1, $version->getVersion());
  512. $this->assertEquals(123, $version->getBar());
  513. $version = $o->getOneVersion(2);
  514. $this->assertEquals(2, $version->getVersion());
  515. $this->assertEquals(456, $version->getBar());
  516. }
  517. public function testGetAllVersions()
  518. {
  519. $o = new VersionableBehaviorTest1();
  520. $versions = $o->getAllVersions();
  521. $this->assertTrue($versions->isEmpty());
  522. $o->setBar(123); // version 1
  523. $o->save();
  524. $o->setBar(456); // version 2
  525. $o->save();
  526. $versions = $o->getAllVersions();
  527. $this->assertTrue($versions instanceof PropelObjectCollection);
  528. $this->assertEquals(2, $versions->count());
  529. $this->assertEquals(1, $versions[0]->getVersion());
  530. $this->assertEquals(123, $versions[0]->getBar());
  531. $this->assertEquals(2, $versions[1]->getVersion());
  532. $this->assertEquals(456, $versions[1]->getBar());
  533. }
  534. public function testCompareVersions()
  535. {
  536. $o = new VersionableBehaviorTest4();
  537. $versions = $o->getAllVersions();
  538. $this->assertTrue($versions->isEmpty());
  539. $o->setBar(123); // version 1
  540. $o->save();
  541. $o->setBar(456); // version 2
  542. $o->save();
  543. $o->setBar(789); // version 3
  544. $o->setVersionComment('Foo');
  545. $o->save();
  546. $diff = $o->compareVersions(1, 3);
  547. $expected = array(
  548. 'Bar' => array(1 => 123, 3 => 789)
  549. );
  550. $this->assertEquals($expected, $diff);
  551. $diff = $o->compareVersions(1, 3, 'versions');
  552. $expected = array(
  553. 1 => array('Bar' => 123),
  554. 3 => array('Bar' => 789)
  555. );
  556. $this->assertEquals($expected, $diff);
  557. }
  558. public function testForeignKeyVersion()
  559. {
  560. $a = new VersionableBehaviorTest4();
  561. $a->setBar(123); // a1
  562. $b = new VersionableBehaviorTest5();
  563. $b->setFoo('Hello');
  564. $b->setVersionableBehaviorTest4($a);
  565. $b->save(); //b1
  566. $this->assertEquals($b->getVersion(), 1);
  567. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 1);
  568. $a->setBar(456); //a2
  569. $b->save(); // b2
  570. $this->assertEquals($b->getVersion(), 2);
  571. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  572. $b->setFoo('World');
  573. $b->save(); // b3
  574. $this->assertEquals($b->getVersion(), 3);
  575. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  576. }
  577. public function testReferrerVersion()
  578. {
  579. $b1 = new VersionableBehaviorTest5();
  580. $b1->setFoo('Hello');
  581. $b2 = new VersionableBehaviorTest5();
  582. $b2->setFoo('World');
  583. $a = new VersionableBehaviorTest4();
  584. $a->setBar(123); // a1
  585. $a->addVersionableBehaviorTest5($b1);
  586. $a->addVersionableBehaviorTest5($b2);
  587. $a->save(); //b1
  588. $this->assertEquals(1, $a->getVersion());
  589. $this->assertEquals(array(1, 1), $a->getOneVersion(1)->getVersionableBehaviorTest5Versions());
  590. $b1->setFoo('Heloo');
  591. $a->save();
  592. $this->assertEquals(2, $a->getVersion());
  593. $this->assertEquals(array(2, 1), $a->getOneVersion(2)->getVersionableBehaviorTest5Versions());
  594. $b3 = new VersionableBehaviorTest5();
  595. $b3->setFoo('Yep');
  596. $a->clearVersionableBehaviorTest5s();
  597. $a->addVersionableBehaviorTest5($b3);
  598. $a->save();
  599. $a->clearVersionableBehaviorTest5s();
  600. $this->assertEquals(3, $a->getVersion());
  601. $this->assertEquals(array(2, 1, 1), $a->getOneVersion(3)->getVersionableBehaviorTest5Versions());
  602. }
  603. }