PageRenderTime 57ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

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

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