PageRenderTime 52ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://bitbucket.org/franhb/propel
PHP | 906 lines | 777 code | 88 blank | 41 comment | 4 complexity | 122e36ac3f45f94c04cb4d141be66408 MD5 | raw file
Possible License(s): LGPL-3.0
  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 dirname(__FILE__) . '/../../../../../generator/lib/util/PropelQuickBuilder.php';
  11. require_once dirname(__FILE__) . '/../../../../../generator/lib/behavior/versionable/VersionableBehavior.php';
  12. require_once dirname(__FILE__) . '/../../../../../runtime/lib/Propel.php';
  13. /**
  14. * Tests for VersionableBehavior class
  15. *
  16. * @author Franรงois Zaninotto
  17. * @version $Revision$
  18. * @package generator.behavior.versionable
  19. */
  20. class VersionableBehaviorObjectBuilderModifierTest extends PHPUnit_Framework_TestCase
  21. {
  22. public function setUp()
  23. {
  24. if (!class_exists('VersionableBehaviorTest1')) {
  25. $schema = <<<EOF
  26. <database name="versionable_behavior_test_1">
  27. <table name="versionable_behavior_test_1">
  28. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  29. <column name="bar" type="INTEGER" />
  30. <behavior name="versionable" />
  31. </table>
  32. <table name="versionable_behavior_test_2">
  33. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  34. <column name="bar" type="INTEGER" />
  35. <behavior name="versionable">
  36. <parameter name="version_column" value="foo_ver" />
  37. </behavior>
  38. </table>
  39. <table name="versionable_behavior_test_3">
  40. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  41. <column name="bar" type="INTEGER" />
  42. <behavior name="versionable">
  43. <parameter name="version_table" value="foo_ver" />
  44. </behavior>
  45. </table>
  46. <table name="versionable_behavior_test_4">
  47. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  48. <column name="bar" type="INTEGER" />
  49. <behavior name="versionable">
  50. <parameter name="log_created_at" value="true" />
  51. <parameter name="log_created_by" value="true" />
  52. <parameter name="log_comment" value="true" />
  53. </behavior>
  54. </table>
  55. <table name="versionable_behavior_test_5">
  56. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  57. <column name="foo" type="VARCHAR" size="100" />
  58. <column name="foreign_id" type="INTEGER" />
  59. <foreign-key foreignTable="versionable_behavior_test_4">
  60. <reference local="foreign_id" foreign="id" />
  61. </foreign-key>
  62. <behavior name="versionable" />
  63. </table>
  64. </database>
  65. EOF;
  66. PropelQuickBuilder::buildSchema($schema);
  67. }
  68. if (!class_exists('VersionableBehaviorTest6')) {
  69. $schema2 = <<<EOF
  70. <database name="versionable_behavior_test_2" defaultPhpNamingMethod="nochange">
  71. <table name="VersionableBehaviorTest6">
  72. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  73. <column name="FooBar" type="VARCHAR" size="100" />
  74. <behavior name="versionable">
  75. <parameter name="log_created_at" value="true" />
  76. <parameter name="log_created_by" value="true" />
  77. <parameter name="log_comment" value="true" />
  78. </behavior>
  79. </table>
  80. <table name="VersionableBehaviorTest7">
  81. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  82. <column name="FooBar" type="VARCHAR" size="100" />
  83. <column name="Style" type="ENUM" valueSet="novel, essay, poetry" />
  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. if (!class_exists('VersionableBehaviorTest8')) {
  97. $schema3 = <<<EOF
  98. <database name="versionable_behavior_test_3">
  99. <table name="VersionableBehaviorTest8">
  100. <column name="alter_id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  101. <column name="FooBar" type="VARCHAR" size="100" />
  102. <column name="class_key" type="INTEGER" required="true" default="1" inheritance="single">
  103. <inheritance key="1" class="VersionableBehaviorTest8" />
  104. <inheritance key="2" class="VersionableBehaviorTest8Foo" extends="VersionableBehaviorTest8" />
  105. <inheritance key="3" class="VersionableBehaviorTest8Bar" extends="VersionableBehaviorTest8Foo" />
  106. </column>
  107. <behavior name="versionable" />
  108. </table>
  109. <table name="VersionableBehaviorTest9">
  110. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  111. <column name="foo" type="VARCHAR" size="100" />
  112. <column name="foreign_id" type="INTEGER" />
  113. <foreign-key foreignTable="VersionableBehaviorTest8">
  114. <reference local="foreign_id" foreign="alter_id" />
  115. </foreign-key>
  116. <behavior name="versionable" />
  117. </table>
  118. EOF;
  119. PropelQuickBuilder::buildSchema($schema3);
  120. }
  121. if (!class_exists('VersionableBehaviorTest10')) {
  122. $schema4 = <<<EOF
  123. <database name="versionable_behavior_test_4">
  124. <table name="VersionableBehaviorTest10">
  125. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  126. <column name="bar" type="INTEGER" />
  127. <behavior name="versionable" />
  128. </table>
  129. <table name="VersionableBehaviorTest11">
  130. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  131. <column name="foo" type="VARCHAR" size="100" />
  132. </table>
  133. <table name="VersionableBehaviorTest12">
  134. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  135. <column name="bar_id" type="INTEGER" />
  136. <column name="foo_id" type="INTEGER" />
  137. <column name="baz" type="VARCHAR" size="25" />
  138. <behavior name="versionable" />
  139. <foreign-key foreignTable="VersionableBehaviorTest10">
  140. <reference local="bar_id" foreign="id" />
  141. </foreign-key>
  142. <foreign-key foreignTable="VersionableBehaviorTest11">
  143. <reference local="foo_id" foreign="id" />
  144. </foreign-key>
  145. </table>
  146. </database>
  147. EOF;
  148. PropelQuickBuilder::buildSchema($schema4);
  149. }
  150. }
  151. public function testGetVersionExists()
  152. {
  153. $this->assertTrue(method_exists('VersionableBehaviorTest1', 'getVersion'));
  154. $this->assertTrue(method_exists('VersionableBehaviorTest2', 'getVersion'));
  155. }
  156. public function testSetVersionExists()
  157. {
  158. $this->assertTrue(method_exists('VersionableBehaviorTest1', 'setVersion'));
  159. $this->assertTrue(method_exists('VersionableBehaviorTest2', 'setVersion'));
  160. }
  161. public function testMethodsExistsNoChangeNaming()
  162. {
  163. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setFooBar'));
  164. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_created_at'));
  165. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_created_by'));
  166. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_comment'));
  167. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setFooBar'));
  168. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setVersionCreatedAt'));
  169. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setVersionCreatedBy'));
  170. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setMyComment'));
  171. }
  172. public function providerForNewActiveRecordTests()
  173. {
  174. return array(
  175. array('VersionableBehaviorTest1'),
  176. array('VersionableBehaviorTest2'),
  177. );
  178. }
  179. /**
  180. * @dataProvider providerForNewActiveRecordTests
  181. */
  182. public function testVersionGetterAndSetter($class)
  183. {
  184. $o = new $class;
  185. $o->setVersion(1234);
  186. $this->assertEquals(1234, $o->getVersion());
  187. }
  188. /**
  189. * @dataProvider providerForNewActiveRecordTests
  190. */
  191. public function testVersionDefaultValue($class)
  192. {
  193. $o = new $class;
  194. $this->assertEquals(0, $o->getVersion());
  195. }
  196. /**
  197. * @dataProvider providerForNewActiveRecordTests
  198. */
  199. public function testVersionValueInitializesOnInsert($class)
  200. {
  201. $o = new $class;
  202. $o->save();
  203. $this->assertEquals(1, $o->getVersion());
  204. }
  205. /**
  206. * @dataProvider providerForNewActiveRecordTests
  207. */
  208. public function testVersionValueIncrementsOnUpdate($class)
  209. {
  210. $o = new $class;
  211. $o->save();
  212. $this->assertEquals(1, $o->getVersion());
  213. $o->setBar(12);
  214. $o->save();
  215. $this->assertEquals(2, $o->getVersion());
  216. $o->setBar(13);
  217. $o->save();
  218. $this->assertEquals(3, $o->getVersion());
  219. $o->setBar(12);
  220. $o->save();
  221. $this->assertEquals(4, $o->getVersion());
  222. }
  223. public function testVersionValueIncrementsOnDeleteManyToMany()
  224. {
  225. $bar = new VersionableBehaviorTest10();
  226. $bar->setBar(42);
  227. $bar->save();
  228. $foo = new VersionableBehaviorTest11();
  229. $foo->setFoo('Marvin');
  230. $foo->save();
  231. $baz = new VersionableBehaviorTest12();
  232. $baz->setVersionablebehaviortest11($foo);
  233. $baz->setBaz('So long and thanks for all the fish');
  234. $bar->addVersionablebehaviortest12($baz);
  235. $bar->save();
  236. $this->assertEquals(1, $baz->getVersion());
  237. $this->assertEquals(2, $bar->getVersion());
  238. $baz->delete();
  239. $bar->save();
  240. $this->assertEquals(3, $bar->getVersion());
  241. }
  242. /**
  243. * @dataProvider providerForNewActiveRecordTests
  244. */
  245. public function testVersionDoesNotIncrementOnUpdateWithNoChange($class)
  246. {
  247. $o = new $class;
  248. $o->setBar(12);
  249. $o->save();
  250. $this->assertEquals(1, $o->getVersion());
  251. $o->setBar(12);
  252. $o->save();
  253. $this->assertEquals(1, $o->getVersion());
  254. }
  255. /**
  256. * @dataProvider providerForNewActiveRecordTests
  257. */
  258. public function testVersionDoesNotIncrementWhenVersioningIsDisabled($class)
  259. {
  260. $o = new $class;
  261. VersionableBehaviorTest1Peer::disableVersioning();
  262. VersionableBehaviorTest2Peer::disableVersioning();
  263. $o->setBar(12);
  264. $o->save();
  265. $this->assertEquals(0, $o->getVersion());
  266. $o->setBar(13);
  267. $o->save();
  268. $this->assertEquals(0, $o->getVersion());
  269. VersionableBehaviorTest1Peer::enableVersioning();
  270. VersionableBehaviorTest2Peer::enableVersioning();
  271. }
  272. public function testNewVersionCreatesRecordInVersionTable()
  273. {
  274. VersionableBehaviorTest1Query::create()->deleteAll();
  275. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  276. $o = new VersionableBehaviorTest1();
  277. $o->save();
  278. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  279. $this->assertEquals(1, $versions->count());
  280. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest1());
  281. $o->save();
  282. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  283. $this->assertEquals(1, $versions->count());
  284. $o->setBar(123);
  285. $o->save();
  286. $versions = VersionableBehaviorTest1VersionQuery::create()->orderByVersion()->find();
  287. $this->assertEquals(2, $versions->count());
  288. $this->assertEquals($o->getId(), $versions[0]->getId());
  289. $this->assertNull($versions[0]->getBar());
  290. $this->assertEquals($o->getId(), $versions[1]->getId());
  291. $this->assertEquals(123, $versions[1]->getBar());
  292. }
  293. public function testNewVersionCreatesRecordInVersionTableWithCustomName()
  294. {
  295. VersionableBehaviorTest3Query::create()->deleteAll();
  296. VersionableBehaviorTest3VersionQuery::create()->deleteAll();
  297. $o = new VersionableBehaviorTest3();
  298. $o->save();
  299. $versions = VersionableBehaviorTest3VersionQuery::create()->find();
  300. $this->assertEquals(1, $versions->count());
  301. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest3());
  302. $o->save();
  303. $versions = VersionableBehaviorTest3VersionQuery::create()->find();
  304. $this->assertEquals(1, $versions->count());
  305. $o->setBar(123);
  306. $o->save();
  307. $versions = VersionableBehaviorTest3VersionQuery::create()->orderByVersion()->find();
  308. $this->assertEquals(2, $versions->count());
  309. $this->assertEquals($o->getId(), $versions[0]->getId());
  310. $this->assertNull($versions[0]->getBar());
  311. $this->assertEquals($o->getId(), $versions[1]->getId());
  312. $this->assertEquals(123, $versions[1]->getBar());
  313. }
  314. public function testNewVersionDoesNotCreateRecordInVersionTableWhenVersioningIsDisabled()
  315. {
  316. VersionableBehaviorTest1Query::create()->deleteAll();
  317. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  318. VersionableBehaviorTest1Peer::disableVersioning();
  319. $o = new VersionableBehaviorTest1();
  320. $o->save();
  321. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  322. $this->assertEquals(0, $versions->count());
  323. VersionableBehaviorTest1Peer::enableVersioning();
  324. }
  325. public function testDeleteObjectDeletesRecordInVersionTable()
  326. {
  327. VersionableBehaviorTest1Query::create()->deleteAll();
  328. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  329. $o = new VersionableBehaviorTest1();
  330. $o->save();
  331. $o->setBar(123);
  332. $o->save();
  333. $nbVersions = VersionableBehaviorTest1VersionQuery::create()->count();
  334. $this->assertEquals(2, $nbVersions);
  335. $o->delete();
  336. $nbVersions = VersionableBehaviorTest1VersionQuery::create()->count();
  337. $this->assertEquals(0, $nbVersions);
  338. }
  339. public function testDeleteObjectDeletesRecordInVersionTableWithCustomName()
  340. {
  341. VersionableBehaviorTest3Query::create()->deleteAll();
  342. VersionableBehaviorTest3VersionQuery::create()->deleteAll();
  343. $o = new VersionableBehaviorTest3();
  344. $o->save();
  345. $o->setBar(123);
  346. $o->save();
  347. $nbVersions = VersionableBehaviorTest3VersionQuery::create()->count();
  348. $this->assertEquals(2, $nbVersions);
  349. $o->delete();
  350. $nbVersions = VersionableBehaviorTest3VersionQuery::create()->count();
  351. $this->assertEquals(0, $nbVersions);
  352. }
  353. public function testToVersion()
  354. {
  355. $o = new VersionableBehaviorTest1();
  356. $o->setBar(123); // version 1
  357. $o->save();
  358. $o->setBar(456); // version 2
  359. $o->save();
  360. $o->toVersion(1);
  361. $this->assertEquals(123, $o->getBar());
  362. $o->toVersion(2);
  363. $this->assertEquals(456, $o->getBar());
  364. }
  365. public function testToVersionAllowsFurtherSave()
  366. {
  367. $o = new VersionableBehaviorTest1();
  368. $o->setBar(123); // version 1
  369. $o->save();
  370. $o->setBar(456); // version 2
  371. $o->save();
  372. $o->toVersion(1);
  373. $this->assertTrue($o->isModified());
  374. $o->save();
  375. $this->assertEquals(3, $o->getVersion());
  376. }
  377. /**
  378. * @expectedException PropelException
  379. */
  380. public function testToVersionThrowsExceptionOnIncorrectVersion()
  381. {
  382. $o = new VersionableBehaviorTest1();
  383. $o->setBar(123); // version 1
  384. $o->save();
  385. $o->toVersion(2);
  386. }
  387. public function testToVersionPreservesVersionedFkObjects()
  388. {
  389. $a = new VersionableBehaviorTest4();
  390. $a->setBar(123); // a1
  391. $b = new VersionableBehaviorTest5();
  392. $b->setFoo('Hello');
  393. $b->setVersionableBehaviorTest4($a);
  394. $b->save(); //b1
  395. $a->setBar(456); //a2
  396. $b->save(); // b2
  397. $b->setFoo('World');
  398. $b->save(); // b3
  399. $b->toVersion(2);
  400. $this->assertEquals($b->getVersion(), 2);
  401. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  402. $b->toVersion(1);
  403. $this->assertEquals($b->getVersion(), 1);
  404. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 1);
  405. $b->toVersion(3);
  406. $this->assertEquals($b->getVersion(), 3);
  407. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  408. }
  409. public function testToVersionPreservesVersionedReferrerObjects()
  410. {
  411. $b1 = new VersionableBehaviorTest5();
  412. $b1->setFoo('Hello');
  413. $b2 = new VersionableBehaviorTest5();
  414. $b2->setFoo('World');
  415. $a = new VersionableBehaviorTest4();
  416. $a->setBar(123); // a1
  417. $a->addVersionableBehaviorTest5($b1);
  418. $a->addVersionableBehaviorTest5($b2);
  419. $a->save(); //b1
  420. $this->assertEquals(1, $a->getVersion());
  421. $bs = $a->getVersionableBehaviorTest5s();
  422. $this->assertEquals(1, $bs[0]->getVersion());
  423. $this->assertEquals(1, $bs[1]->getVersion());
  424. $b1->setFoo('Heloo');
  425. $a->save();
  426. $this->assertEquals(2, $a->getVersion());
  427. $bs = $a->getVersionableBehaviorTest5s();
  428. $this->assertEquals(2, $bs[0]->getVersion());
  429. $this->assertEquals(1, $bs[1]->getVersion());
  430. $b3 = new VersionableBehaviorTest5();
  431. $b3->setFoo('Yep');
  432. $a->clearVersionableBehaviorTest5s();
  433. $a->addVersionableBehaviorTest5($b3);
  434. $a->save();
  435. $a->clearVersionableBehaviorTest5s();
  436. $this->assertEquals(3, $a->getVersion());
  437. $bs = $a->getVersionableBehaviorTest5s();
  438. $this->assertEquals(2, $bs[0]->getVersion());
  439. $this->assertEquals(1, $bs[1]->getVersion());
  440. $this->assertEquals(1, $bs[2]->getVersion());
  441. $a->toVersion(1);
  442. $bs = $a->getVersionableBehaviorTest5s();
  443. $this->assertEquals(1, $bs[0]->getVersion());
  444. $this->assertEquals(1, $bs[1]->getVersion());
  445. }
  446. public function testGetLastVersionNumber()
  447. {
  448. $o = new VersionableBehaviorTest1();
  449. $this->assertEquals(0, $o->getLastVersionNumber());
  450. $o->setBar(123); // version 1
  451. $o->save();
  452. $this->assertEquals(1, $o->getLastVersionNumber());
  453. $o->setBar(456); // version 2
  454. $o->save();
  455. $this->assertEquals(2, $o->getLastVersionNumber());
  456. $o->toVersion(1);
  457. $o->save();
  458. $this->assertEquals(3, $o->getLastVersionNumber());
  459. }
  460. public function testIsLastVersion()
  461. {
  462. $o = new VersionableBehaviorTest1();
  463. $this->assertTrue($o->isLastVersion());
  464. $o->setBar(123); // version 1
  465. $o->save();
  466. $this->assertTrue($o->isLastVersion());
  467. $o->setBar(456); // version 2
  468. $o->save();
  469. $this->assertTrue($o->isLastVersion());
  470. $o->toVersion(1);
  471. $this->assertFalse($o->isLastVersion());
  472. $o->save();
  473. $this->assertTrue($o->isLastVersion());
  474. }
  475. public function testIsVersioningNecessary()
  476. {
  477. $o = new VersionableBehaviorTest1();
  478. $this->assertTrue($o->isVersioningNecessary());
  479. $o->save();
  480. $this->assertFalse($o->isVersioningNecessary());
  481. $o->setBar(123);
  482. $this->assertTrue($o->isVersioningNecessary());
  483. $o->save();
  484. $this->assertFalse($o->isVersioningNecessary());
  485. VersionableBehaviorTest1Peer::disableVersioning();
  486. $o = new VersionableBehaviorTest1();
  487. $this->assertFalse($o->isVersioningNecessary());
  488. $o->save();
  489. $this->assertFalse($o->isVersioningNecessary());
  490. $o->setBar(123);
  491. $this->assertFalse($o->isVersioningNecessary());
  492. $o->save();
  493. $this->assertFalse($o->isVersioningNecessary());
  494. VersionableBehaviorTest1Peer::enableVersioning();
  495. $b1 = new VersionableBehaviorTest5();
  496. $b1->setFoo('Hello');
  497. $b2 = new VersionableBehaviorTest5();
  498. $b2->setFoo('World');
  499. $a = new VersionableBehaviorTest4();
  500. $a->setBar(123); // a1
  501. $this->assertTrue($a->isVersioningNecessary());
  502. $a->save();
  503. $this->assertFalse($a->isVersioningNecessary());
  504. $a->addVersionableBehaviorTest5($b1);
  505. $this->assertTrue($a->isVersioningNecessary());
  506. $a->save();
  507. $this->assertFalse($a->isVersioningNecessary());
  508. $a->addVersionableBehaviorTest5($b2);
  509. $this->assertTrue($a->isVersioningNecessary());
  510. $a->save();
  511. $this->assertFalse($a->isVersioningNecessary());
  512. $b2->setFoo('World !');
  513. $this->assertTrue($b2->isVersioningNecessary());
  514. $this->assertTrue($a->isVersioningNecessary());
  515. $a->save();
  516. $this->assertFalse($b2->isVersioningNecessary());
  517. $this->assertFalse($a->isVersioningNecessary());
  518. }
  519. public function testIsVersioningNecessaryWithNullFk()
  520. {
  521. // the purpose of this tests is to highlight a bug with FK and isVersioningNecessary()
  522. $b1 = new VersionableBehaviorTest5();
  523. $b1->setNew(false);
  524. // this time, the object isn't modified, so the isVersioningNecessary()
  525. // method is called on FK objects... which can be null.
  526. $b1->isVersioningNecessary();
  527. $this->assertTrue(true, 'getting here means that nothing went wrong');
  528. }
  529. public function testAddVersionNewObject()
  530. {
  531. VersionableBehaviorTest1Peer::disableVersioning();
  532. VersionableBehaviorTest1Query::create()->deleteAll();
  533. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  534. $o = new VersionableBehaviorTest1();
  535. $o->addVersion();
  536. $o->save();
  537. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  538. $this->assertEquals(1, $versions->count());
  539. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest1());
  540. VersionableBehaviorTest1Peer::enableVersioning();
  541. }
  542. public function testVersionCreatedAt()
  543. {
  544. $o = new VersionableBehaviorTest4();
  545. $t = time();
  546. $o->save();
  547. $version = VersionableBehaviorTest4VersionQuery::create()
  548. ->filterByVersionableBehaviorTest4($o)
  549. ->findOne();
  550. $this->assertEquals($t, $version->getVersionCreatedAt('U'));
  551. $o = new VersionableBehaviorTest4();
  552. $inThePast = time() - 123456;
  553. $o->setVersionCreatedAt($inThePast);
  554. $o->save();
  555. $this->assertEquals($inThePast, $o->getVersionCreatedAt('U'));
  556. $version = VersionableBehaviorTest4VersionQuery::create()
  557. ->filterByVersionableBehaviorTest4($o)
  558. ->findOne();
  559. $this->assertEquals($o->getVersionCreatedAt(), $version->getVersionCreatedAt());
  560. }
  561. public function testVersionCreatedBy()
  562. {
  563. $o = new VersionableBehaviorTest4();
  564. $o->setVersionCreatedBy('me me me');
  565. $o->save();
  566. $version = VersionableBehaviorTest4VersionQuery::create()
  567. ->filterByVersionableBehaviorTest4($o)
  568. ->findOne();
  569. $this->assertEquals('me me me', $version->getVersionCreatedBy());
  570. }
  571. public function testSaveAndModifyWithNoChangeSchema()
  572. {
  573. $o = new VersionableBehaviorTest7();
  574. //$o->setVersionCreatedBy('You and I');
  575. $o->save();
  576. $this->assertEquals(1, $o->getVersion());
  577. $o->setFooBar('Something');
  578. $o->save();
  579. $this->assertEquals(2, $o->getVersion());
  580. $o = new VersionableBehaviorTest6();
  581. //$o->setVersionCreatedBy('You and I');
  582. $o->save();
  583. $this->assertEquals(1, $o->getVersion());
  584. $o->setFooBar('Something');
  585. $o->save();
  586. $this->assertEquals(2, $o->getVersion());
  587. }
  588. public function testVersionComment()
  589. {
  590. $o = new VersionableBehaviorTest4();
  591. $o->setVersionComment('Because you deserve it');
  592. $o->save();
  593. $version = VersionableBehaviorTest4VersionQuery::create()
  594. ->filterByVersionableBehaviorTest4($o)
  595. ->findOne();
  596. $this->assertEquals('Because you deserve it', $version->getVersionComment());
  597. }
  598. public function testToVersionWorksWithComments()
  599. {
  600. $o = new VersionableBehaviorTest4();
  601. $o->setVersionComment('Because you deserve it');
  602. $o->setBar(123); // version 1
  603. $o->save();
  604. $o->setVersionComment('Unless I change my mind');
  605. $o->setBar(456); // version 2
  606. $o->save();
  607. $o->toVersion(1);
  608. $this->assertEquals('Because you deserve it', $o->getVersionComment());
  609. $o->toVersion(2);
  610. $this->assertEquals('Unless I change my mind', $o->getVersionComment());
  611. }
  612. public function testGetOneVersion()
  613. {
  614. $o = new VersionableBehaviorTest1();
  615. $o->setBar(123); // version 1
  616. $o->save();
  617. $o->setBar(456); // version 2
  618. $o->save();
  619. $version = $o->getOneVersion(1);
  620. $this->assertTrue($version instanceof VersionableBehaviorTest1Version);
  621. $this->assertEquals(1, $version->getVersion());
  622. $this->assertEquals(123, $version->getBar());
  623. $version = $o->getOneVersion(2);
  624. $this->assertEquals(2, $version->getVersion());
  625. $this->assertEquals(456, $version->getBar());
  626. }
  627. public function testGetAllVersions()
  628. {
  629. $o = new VersionableBehaviorTest1();
  630. $versions = $o->getAllVersions();
  631. $this->assertTrue($versions->isEmpty());
  632. $o->setBar(123); // version 1
  633. $o->save();
  634. $o->setBar(456); // version 2
  635. $o->save();
  636. $versions = $o->getAllVersions();
  637. $this->assertTrue($versions instanceof PropelObjectCollection);
  638. $this->assertEquals(2, $versions->count());
  639. $this->assertEquals(1, $versions[0]->getVersion());
  640. $this->assertEquals(123, $versions[0]->getBar());
  641. $this->assertEquals(2, $versions[1]->getVersion());
  642. $this->assertEquals(456, $versions[1]->getBar());
  643. }
  644. public function testGetLastVersions()
  645. {
  646. $o = new VersionableBehaviorTest1();
  647. $versions = $o->getAllVersions();
  648. $this->assertTrue($versions->isEmpty());
  649. $o->setBar(123); // version 1
  650. $o->save();
  651. $o->setBar(456); // version 2
  652. $o->save();
  653. $o->setBar(789); // version 3
  654. $o->save();
  655. $o->setBar(101112); // version 4
  656. $o->save();
  657. $versions = $o->getLastVersions();
  658. $this->assertTrue($versions instanceof PropelObjectCollection);
  659. $this->assertEquals(4, $versions->count());
  660. $this->assertEquals(4, $versions[0]->getVersion());
  661. $this->assertEquals(101112, $versions[0]->getBar());
  662. $this->assertEquals(3, $versions[1]->getVersion());
  663. $this->assertEquals(789, $versions[1]->getBar());
  664. $this->assertEquals(2, $versions[2]->getVersion());
  665. $this->assertEquals(456, $versions[2]->getBar());
  666. $this->assertEquals(1, $versions[3]->getVersion());
  667. $this->assertEquals(123, $versions[3]->getBar());
  668. $versions = $o->getLastVersions(2);
  669. $this->assertTrue($versions instanceof PropelObjectCollection);
  670. $this->assertEquals(2, $versions->count());
  671. $this->assertEquals(4, $versions[0]->getVersion());
  672. $this->assertEquals(101112, $versions[0]->getBar());
  673. $this->assertEquals(3, $versions[1]->getVersion());
  674. $this->assertEquals(789, $versions[1]->getBar());
  675. }
  676. public function testCompareVersion()
  677. {
  678. $o = new VersionableBehaviorTest4();
  679. $versions = $o->getAllVersions();
  680. $this->assertTrue($versions->isEmpty());
  681. $o->setBar(123); // version 1
  682. $o->save();
  683. $o->setBar(456); // version 2
  684. $o->save();
  685. $o->setBar(789); // version 3
  686. $o->setVersionComment('Foo');
  687. $o->save();
  688. $diff = $o->compareVersion(3); // $o is in version 3
  689. $expected = array();
  690. $this->assertEquals($expected, $diff);
  691. $diff = $o->compareVersion(2);
  692. $expected = array(
  693. 'Bar' => array(2 => 456, 3 => 789),
  694. );
  695. $this->assertEquals($expected, $diff);
  696. $diff = $o->compareVersion(1);
  697. $expected = array(
  698. 'Bar' => array(1 => 123, 3 => 789),
  699. );
  700. $this->assertEquals($expected, $diff);
  701. }
  702. public function testCompareVersions()
  703. {
  704. $o = new VersionableBehaviorTest4();
  705. $versions = $o->getAllVersions();
  706. $this->assertTrue($versions->isEmpty());
  707. $o->setBar(123); // version 1
  708. $o->save();
  709. $o->setBar(456); // version 2
  710. $o->save();
  711. $o->setBar(789); // version 3
  712. $o->setVersionComment('Foo');
  713. $o->save();
  714. $diff = $o->compareVersions(1, 3);
  715. $expected = array(
  716. 'Bar' => array(1 => 123, 3 => 789)
  717. );
  718. $this->assertEquals($expected, $diff);
  719. $diff = $o->compareVersions(1, 3, 'versions');
  720. $expected = array(
  721. 1 => array('Bar' => 123),
  722. 3 => array('Bar' => 789)
  723. );
  724. $this->assertEquals($expected, $diff);
  725. }
  726. public function testForeignKeyVersion()
  727. {
  728. $a = new VersionableBehaviorTest4();
  729. $a->setBar(123); // a1
  730. $b = new VersionableBehaviorTest5();
  731. $b->setFoo('Hello');
  732. $b->setVersionableBehaviorTest4($a);
  733. $b->save(); //b1
  734. $this->assertEquals($b->getVersion(), 1);
  735. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 1);
  736. $a->setBar(456); //a2
  737. $b->save(); // b2
  738. $this->assertEquals($b->getVersion(), 2);
  739. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  740. $b->setFoo('World');
  741. $b->save(); // b3
  742. $this->assertEquals($b->getVersion(), 3);
  743. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  744. }
  745. public function testReferrerVersion()
  746. {
  747. $b1 = new VersionableBehaviorTest5();
  748. $b1->setFoo('Hello');
  749. $b2 = new VersionableBehaviorTest5();
  750. $b2->setFoo('World');
  751. $a = new VersionableBehaviorTest4();
  752. $a->setBar(123); // a1
  753. $a->addVersionableBehaviorTest5($b1);
  754. $a->addVersionableBehaviorTest5($b2);
  755. $a->save(); //b1
  756. $this->assertEquals(1, $a->getVersion());
  757. $this->assertEquals(array(1, 1), $a->getOneVersion(1)->getVersionableBehaviorTest5Versions());
  758. $b1->setFoo('Heloo');
  759. $a->save();
  760. $this->assertEquals(2, $a->getVersion());
  761. $this->assertEquals(array(2, 1), $a->getOneVersion(2)->getVersionableBehaviorTest5Versions());
  762. $b3 = new VersionableBehaviorTest5();
  763. $b3->setFoo('Yep');
  764. $a->clearVersionableBehaviorTest5s();
  765. $a->addVersionableBehaviorTest5($b3);
  766. $a->save();
  767. $a->clearVersionableBehaviorTest5s();
  768. $this->assertEquals(3, $a->getVersion());
  769. $this->assertEquals(array(2, 1, 1), $a->getOneVersion(3)->getVersionableBehaviorTest5Versions());
  770. }
  771. public function testEnumField()
  772. {
  773. $o = new VersionableBehaviorTest7();
  774. $o->setStyle('novel');
  775. $o->save();
  776. $this->assertEquals('novel', $o->getStyle(), 'Set style to novel');
  777. $this->assertEquals(1, $o->getVersion(), '');
  778. $o->setStyle('essay');
  779. $o->save();
  780. $this->assertEquals('essay', $o->getStyle(), 'Set style to essay');
  781. $this->assertEquals(2, $o->getVersion(), '');
  782. $this->assertEquals('novel', $o->getOneVersion(1)->getStyle(), 'First version is a novel');
  783. $this->assertEquals('essay', $o->getOneVersion(2)->getStyle(), 'Second version is an essay');
  784. }
  785. public function testCustomIdName()
  786. {
  787. $b1 = new VersionableBehaviorTest8();
  788. $b2 = new VersionableBehaviorTest9();
  789. $b1->save();
  790. $b2->setVersionableBehaviorTest8($b1);
  791. $b2->save();
  792. $b2->setFoo('test2');
  793. $b2->save();
  794. $b1->setFoobar('test1');
  795. $b1->save();
  796. }
  797. public function testWithInheritance()
  798. {
  799. $b1 = new VersionableBehaviorTest8Foo();
  800. $b1->save();
  801. $b1->setFoobar('name');
  802. $b1->save();
  803. $object = $b1->getOneVersion($b1->getVersion());
  804. $this->assertTrue($object instanceof Versionablebehaviortest8Version);
  805. }
  806. public function testEnforceVersioning()
  807. {
  808. $bar = new VersionableBehaviorTest10();
  809. $bar->setBar(42);
  810. $bar->save();
  811. $this->assertEquals(1, $bar->getVersion());
  812. $this->assertFalse($bar->isVersioningNecessary());
  813. $bar->enforceVersioning();
  814. $this->assertTrue($bar->isVersioningNecessary());
  815. $bar->save();
  816. $this->assertEquals(2, $bar->getVersion());
  817. }
  818. }