/tests/Propel/Tests/Generator/Behavior/Versionable/VersionableBehaviorObjectBuilderModifierTest.php

http://github.com/propelorm/Propel2 · PHP · 1202 lines · 917 code · 121 blank · 164 comment · 0 complexity · 824cd16f80df73151da4bed9334aab24 MD5 · raw file

  1. <?php
  2. /**
  3. * MIT License. This file is part of the Propel package.
  4. * For the full copyright and license information, please view the LICENSE
  5. * file that was distributed with this source code.
  6. */
  7. namespace Propel\Tests\Generator\Behavior\Versionable;
  8. use Propel\Generator\Util\QuickBuilder;
  9. use Propel\Runtime\Collection\ObjectCollection;
  10. use Propel\Runtime\Exception\PropelException;
  11. use VersionableBehaviorTest1;
  12. use VersionableBehaviorTest10;
  13. use VersionableBehaviorTest11;
  14. use VersionableBehaviorTest12;
  15. use VersionableBehaviorTest1Query;
  16. use VersionableBehaviorTest1Version;
  17. use VersionableBehaviorTest1VersionQuery;
  18. use VersionableBehaviorTest2Query;
  19. use VersionableBehaviorTest3;
  20. use VersionableBehaviorTest3Query;
  21. use VersionableBehaviorTest3VersionQuery;
  22. use VersionableBehaviorTest4;
  23. use VersionableBehaviorTest4VersionQuery;
  24. use VersionableBehaviorTest5;
  25. use VersionableBehaviorTest6;
  26. use VersionableBehaviorTest7;
  27. use VersionableBehaviorTest8Foo;
  28. use Versionablebehaviortest8Version;
  29. use VersionableBehaviorTestCustomField;
  30. use VersionableBehaviorTestCustomFieldKey;
  31. use VersionableBehaviorTestCustomFieldKeyQuery;
  32. use VersionableBehaviorTestCustomFieldKeyVersionQuery;
  33. use VersionableBehaviorTestCustomFieldQuery;
  34. use VersionableBehaviorTestCustomFieldVersionQuery;
  35. use VersionableBehaviorTestOneToOne;
  36. use VersionableBehaviorTestOneToOneKey;
  37. use VersionableBehaviorTestOneToOneKeyQuery;
  38. use VersionableBehaviorTestOneToOneKeyVersionQuery;
  39. use VersionableBehaviorTestOneToOneQuery;
  40. use VersionableBehaviorTestOneToOneVersionQuery;
  41. /**
  42. * Tests for VersionableBehavior class
  43. *
  44. * @author François Zaninotto
  45. */
  46. class VersionableBehaviorObjectBuilderModifierTest extends TestCase
  47. {
  48. /**
  49. * @return void
  50. */
  51. public static function setUpBeforeClass(): void
  52. {
  53. $schema = <<<EOF
  54. <database name="versionable_behavior_test_1">
  55. <table name="versionable_behavior_test_1">
  56. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  57. <column name="bar" type="INTEGER"/>
  58. <behavior name="versionable"/>
  59. </table>
  60. <table name="versionable_behavior_test_2">
  61. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  62. <column name="bar" type="INTEGER"/>
  63. <behavior name="versionable">
  64. <parameter name="version_column" value="foo_ver"/>
  65. </behavior>
  66. </table>
  67. <table name="versionable_behavior_test_3">
  68. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  69. <column name="bar" type="INTEGER"/>
  70. <behavior name="versionable">
  71. <parameter name="version_table" value="foo_ver"/>
  72. </behavior>
  73. </table>
  74. <table name="versionable_behavior_test_4">
  75. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  76. <column name="bar" type="INTEGER"/>
  77. <behavior name="versionable">
  78. <parameter name="log_created_at" value="true"/>
  79. <parameter name="log_created_by" value="true"/>
  80. <parameter name="log_comment" value="true"/>
  81. </behavior>
  82. </table>
  83. <table name="versionable_behavior_test_5">
  84. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  85. <column name="foo" type="VARCHAR" size="100"/>
  86. <column name="foreign_id" type="INTEGER"/>
  87. <foreign-key foreignTable="versionable_behavior_test_4">
  88. <reference local="foreign_id" foreign="id"/>
  89. </foreign-key>
  90. <behavior name="versionable"/>
  91. </table>
  92. </database>
  93. EOF;
  94. QuickBuilder::buildSchema($schema);
  95. $schema2 = <<<EOF
  96. <database name="versionable_behavior_test_2" defaultPhpNamingMethod="nochange">
  97. <table name="VersionableBehaviorTest6">
  98. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  99. <column name="FooBar" type="VARCHAR" size="100"/>
  100. <behavior name="versionable">
  101. <parameter name="log_created_at" value="true"/>
  102. <parameter name="log_created_by" value="true"/>
  103. <parameter name="log_comment" value="true"/>
  104. </behavior>
  105. </table>
  106. <table name="VersionableBehaviorTest7">
  107. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  108. <column name="FooBar" type="VARCHAR" size="100"/>
  109. <column name="Style" type="ENUM" valueSet="novel, essay, poetry"/>
  110. <column name="Style2" type="SET" valueSet="novel, essay, poetry"/>
  111. <behavior name="versionable">
  112. <parameter name="log_created_at" value="true"/>
  113. <parameter name="log_created_by" value="true"/>
  114. <parameter name="log_comment" value="true"/>
  115. <parameter name="version_created_by_column" value="VersionCreatedBy"/>
  116. <parameter name="version_created_at_column" value="VersionCreatedAt"/>
  117. <parameter name="version_comment_column" value="MyComment"/>
  118. </behavior>
  119. </table>
  120. </database>
  121. EOF;
  122. QuickBuilder::buildSchema($schema2);
  123. $schema3 = <<<EOF
  124. <database name="versionable_behavior_test_3" defaultPhpNamingMethod="nochange">
  125. <table name="VersionableBehaviorTest8">
  126. <column name="Id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  127. <column name="FooBar" type="VARCHAR" size="100"/>
  128. <column name="class_key" type="INTEGER" required="true" default="1" inheritance="single">
  129. <inheritance key="1" class="VersionableBehaviorTest8"/>
  130. <inheritance key="2" class="VersionableBehaviorTest8Foo" extends="VersionableBehaviorTest8"/>
  131. <inheritance key="3" class="VersionableBehaviorTest8Bar" extends="VersionableBehaviorTest8Foo"/>
  132. </column>
  133. <behavior name="versionable"/>
  134. </table>
  135. </database>
  136. EOF;
  137. QuickBuilder::buildSchema($schema3);
  138. $schema4 = <<<EOF
  139. <database name="versionable_behavior_test_4">
  140. <table name="VersionableBehaviorTest10">
  141. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  142. <column name="bar" type="INTEGER"/>
  143. <behavior name="versionable"/>
  144. </table>
  145. <table name="VersionableBehaviorTest11">
  146. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  147. <column name="foo" type="VARCHAR" size="100"/>
  148. </table>
  149. <table name="VersionableBehaviorTest12">
  150. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  151. <column name="bar_id" type="INTEGER"/>
  152. <column name="foo_id" type="INTEGER"/>
  153. <column name="baz" type="VARCHAR" size="25"/>
  154. <behavior name="versionable"/>
  155. <foreign-key foreignTable="VersionableBehaviorTest10">
  156. <reference local="bar_id" foreign="id"/>
  157. </foreign-key>
  158. <foreign-key foreignTable="VersionableBehaviorTest11">
  159. <reference local="foo_id" foreign="id"/>
  160. </foreign-key>
  161. </table>
  162. </database>
  163. EOF;
  164. QuickBuilder::buildSchema($schema4);
  165. /**
  166. * Schema to test relation 1:1 versionable
  167. */
  168. $schema5 = <<<XML
  169. <database name="versionable_behavior_test_one_to_one_database">
  170. <table name="versionable_behavior_test_one_to_one">
  171. <column name="id" type="integer" primaryKey="true" autoIncrement="true"/>
  172. <column name="bar" type="varchar" size="32"/>
  173. <behavior name="versionable"/>
  174. </table>
  175. <table name="versionable_behavior_test_one_to_one_key">
  176. <column name="foo_id" type="integer" primaryKey="true"/>
  177. <column name="bar" type="varchar" size="32"/>
  178. <foreign-key foreignTable="versionable_behavior_test_one_to_one">
  179. <reference local="foo_id" foreign="id"/>
  180. </foreign-key>
  181. <behavior name="versionable"/>
  182. </table>
  183. </database>
  184. XML;
  185. QuickBuilder::buildSchema($schema5);
  186. $schemaCustomName = <<<EOF
  187. <database name="versionable_behavior_test_custom_field_database">
  188. <table name="versionable_behavior_test_custom_field">
  189. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  190. <column name="bar" type="INTEGER"/>
  191. <behavior name="versionable">
  192. <parameter name="version_column" value="CustomVersion"/>
  193. </behavior>
  194. </table>
  195. <table name="versionable_behavior_test_custom_field_key">
  196. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true"/>
  197. <column name="bar_id" type="INTEGER"/>
  198. <column name="baz" type="VARCHAR" size="25"/>
  199. <behavior name="versionable">
  200. <parameter name="version_column" value="CustomVersion"/>
  201. </behavior>
  202. <foreign-key foreignTable="versionable_behavior_test_custom_field">
  203. <reference local="bar_id" foreign="id"/>
  204. </foreign-key>
  205. </table>
  206. </database>
  207. EOF;
  208. QuickBuilder::buildSchema($schemaCustomName);
  209. }
  210. /**
  211. * @return void
  212. */
  213. public function testGetVersionExists()
  214. {
  215. $this->assertTrue(method_exists('VersionableBehaviorTest1', 'getVersion'));
  216. $this->assertTrue(method_exists('VersionableBehaviorTest2', 'getVersion'));
  217. $this->assertTrue(method_exists('VersionableBehaviorTestCustomField', 'getCustomVersion'));
  218. }
  219. /**
  220. * @return void
  221. */
  222. public function testSetVersionExists()
  223. {
  224. $this->assertTrue(method_exists('VersionableBehaviorTest1', 'setVersion'));
  225. $this->assertTrue(method_exists('VersionableBehaviorTest2', 'setVersion'));
  226. $this->assertTrue(method_exists('VersionableBehaviorTestCustomField', 'setCustomVersion'));
  227. }
  228. /**
  229. * @return void
  230. */
  231. public function testMethodsExistsNoChangeNaming()
  232. {
  233. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setFooBar'));
  234. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_created_at'));
  235. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_created_by'));
  236. $this->assertTrue(method_exists('VersionableBehaviorTest6', 'setversion_comment'));
  237. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setFooBar'));
  238. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setVersionCreatedAt'));
  239. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setVersionCreatedBy'));
  240. $this->assertTrue(method_exists('VersionableBehaviorTest7', 'setMyComment'));
  241. }
  242. public function providerForNewActiveRecordTests()
  243. {
  244. return [
  245. ['\VersionableBehaviorTest1'],
  246. ['VersionableBehaviorTest2'],
  247. ['VersionableBehaviorTestCustomField'],
  248. ['VersionableBehaviorTestOneToOne'],
  249. ];
  250. }
  251. /**
  252. * @dataProvider providerForNewActiveRecordTests
  253. *
  254. * @return void
  255. */
  256. public function testVersionGetterAndSetter($class)
  257. {
  258. $o = new $class();
  259. $o->setVersion(1234);
  260. $this->assertEquals(1234, $o->getVersion());
  261. }
  262. /**
  263. * @dataProvider providerForNewActiveRecordTests
  264. *
  265. * @return void
  266. */
  267. public function testVersionDefaultValue($class)
  268. {
  269. $o = new $class();
  270. $this->assertEquals(0, $o->getVersion());
  271. }
  272. /**
  273. * @dataProvider providerForNewActiveRecordTests
  274. *
  275. * @return void
  276. */
  277. public function testVersionValueInitializesOnInsert($class)
  278. {
  279. $o = new $class();
  280. $o->save();
  281. $this->assertEquals(1, $o->getVersion());
  282. }
  283. /**
  284. * @dataProvider providerForNewActiveRecordTests
  285. *
  286. * @return void
  287. */
  288. public function testVersionValueIncrementsOnUpdate($class)
  289. {
  290. $o = new $class();
  291. $o->save();
  292. $this->assertEquals(1, $o->getVersion());
  293. $o->setBar(12);
  294. $o->save();
  295. $this->assertEquals(2, $o->getVersion());
  296. $o->setBar(13);
  297. $o->save();
  298. $this->assertEquals(3, $o->getVersion());
  299. $o->setBar(12);
  300. $o->save();
  301. $this->assertEquals(4, $o->getVersion());
  302. }
  303. /**
  304. * @return void
  305. */
  306. public function testVersionValueIncrementsOnDeleteManyToMany()
  307. {
  308. $bar = new VersionableBehaviorTest10();
  309. $bar->setBar(42);
  310. $bar->save();
  311. $foo = new VersionableBehaviorTest11();
  312. $foo->setFoo('Marvin');
  313. $foo->save();
  314. $baz = new VersionableBehaviorTest12();
  315. $baz->setVersionablebehaviortest11($foo);
  316. $baz->setBaz('So long and thanks for all the fish');
  317. $bar->addVersionablebehaviortest12($baz);
  318. $bar->save();
  319. $this->assertEquals(1, $baz->getVersion());
  320. $this->assertEquals(2, $bar->getVersion());
  321. $baz->delete();
  322. $bar->save();
  323. $this->assertEquals(3, $bar->getVersion());
  324. }
  325. /**
  326. * @dataProvider providerForNewActiveRecordTests
  327. *
  328. * @return void
  329. */
  330. public function testVersionDoesNotIncrementOnUpdateWithNoChange($class)
  331. {
  332. $o = new $class();
  333. $o->setBar(12);
  334. $o->save();
  335. $this->assertEquals(1, $o->getVersion());
  336. $o->setBar(12);
  337. $o->save();
  338. $this->assertEquals(1, $o->getVersion());
  339. }
  340. /**
  341. * @dataProvider providerForNewActiveRecordTests
  342. *
  343. * @return void
  344. */
  345. public function testVersionDoesNotIncrementWhenVersioningIsDisabled($class)
  346. {
  347. $o = new $class();
  348. VersionableBehaviorTest1Query::disableVersioning();
  349. VersionableBehaviorTest2Query::disableVersioning();
  350. VersionableBehaviorTestCustomFieldQuery::disableVersioning();
  351. VersionableBehaviorTestOneToOneQuery::disableVersioning();
  352. $o->setBar(12);
  353. $o->save();
  354. $this->assertEquals(0, $o->getVersion());
  355. $o->setBar(13);
  356. $o->save();
  357. $this->assertEquals(0, $o->getVersion());
  358. VersionableBehaviorTest1Query::enableVersioning();
  359. VersionableBehaviorTest1Query::enableVersioning();
  360. VersionableBehaviorTestCustomFieldQuery::enableVersioning();
  361. VersionableBehaviorTestOneToOneQuery::enableVersioning();
  362. }
  363. /**
  364. * @return void
  365. */
  366. public function testNewVersionCreatesRecordInVersionTable()
  367. {
  368. VersionableBehaviorTest1Query::create()->deleteAll();
  369. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  370. $o = new VersionableBehaviorTest1();
  371. $o->save();
  372. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  373. $this->assertEquals(1, $versions->count());
  374. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest1());
  375. $o->save();
  376. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  377. $this->assertEquals(1, $versions->count());
  378. $o->setBar(123);
  379. $o->save();
  380. $versions = VersionableBehaviorTest1VersionQuery::create()->orderByVersion()->find();
  381. $this->assertEquals(2, $versions->count());
  382. $this->assertEquals($o->getId(), $versions[0]->getId());
  383. $this->assertNull($versions[0]->getBar());
  384. $this->assertEquals($o->getId(), $versions[1]->getId());
  385. $this->assertEquals(123, $versions[1]->getBar());
  386. }
  387. /**
  388. * @return void
  389. */
  390. public function testNewVersionCreatesRecordInVersionTableWithCustomName()
  391. {
  392. VersionableBehaviorTest3Query::create()->deleteAll();
  393. VersionableBehaviorTest3VersionQuery::create()->deleteAll();
  394. $o = new VersionableBehaviorTest3();
  395. $o->save();
  396. $versions = VersionableBehaviorTest3VersionQuery::create()->find();
  397. $this->assertEquals(1, $versions->count());
  398. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest3());
  399. $o->save();
  400. $versions = VersionableBehaviorTest3VersionQuery::create()->find();
  401. $this->assertEquals(1, $versions->count());
  402. $o->setBar(123);
  403. $o->save();
  404. $versions = VersionableBehaviorTest3VersionQuery::create()->orderByVersion()->find();
  405. $this->assertEquals(2, $versions->count());
  406. $this->assertEquals($o->getId(), $versions[0]->getId());
  407. $this->assertNull($versions[0]->getBar());
  408. $this->assertEquals($o->getId(), $versions[1]->getId());
  409. $this->assertEquals(123, $versions[1]->getBar());
  410. }
  411. /**
  412. * @return void
  413. */
  414. public function testNewVersionCreatesRecordInVersionTableWithFieldCustomName()
  415. {
  416. VersionableBehaviorTestCustomFieldQuery::create()->deleteAll();
  417. VersionableBehaviorTestCustomFieldVersionQuery::create()->deleteAll();
  418. VersionableBehaviorTestCustomFieldKeyQuery::create()->deleteAll();
  419. VersionableBehaviorTestCustomFieldKeyVersionQuery::create()->deleteAll();
  420. $o = new VersionableBehaviorTestCustomField();
  421. $o->setBar(150);
  422. $o->save();
  423. $k = new VersionableBehaviorTestCustomFieldKey();
  424. $k->setVersionableBehaviorTestCustomField($o);
  425. $k->save();
  426. $versions = VersionableBehaviorTestCustomFieldVersionQuery::create()->find();
  427. $versionsKeys = VersionableBehaviorTestCustomFieldKeyVersionQuery::create()->find();
  428. $this->assertEquals(1, $versions->count());
  429. $this->assertEquals(1, $versionsKeys->count());
  430. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTestCustomField());
  431. $this->assertEquals($k, $versionsKeys[0]->getVersionableBehaviorTestCustomFieldKey());
  432. $o->setBar(150);
  433. $o->save();
  434. $versions = VersionableBehaviorTestCustomFieldVersionQuery::create()->find();
  435. $this->assertEquals(1, $versions->count());
  436. $o->setBar(123);
  437. $o->save();
  438. $versions = VersionableBehaviorTestCustomFieldVersionQuery::create()->orderByCustomVersion()->find();
  439. $this->assertEquals(2, $versions->count());
  440. $this->assertEquals($o->getId(), $versions[0]->getId());
  441. $this->assertNotNull($versions[0]->getBar());
  442. $this->assertEquals($o->getId(), $versions[1]->getId());
  443. $this->assertEquals(123, $versions[1]->getBar());
  444. $this->assertEquals(2, $o->getVersion());
  445. $o->toVersion(1);
  446. $this->assertEquals(1, $o->getVersion());
  447. $this->assertEquals($o->getId(), $versions[0]->getId());
  448. }
  449. /**
  450. * @return void
  451. */
  452. public function testNewVersionDoesNotCreateRecordInVersionTableWhenVersioningIsDisabled()
  453. {
  454. VersionableBehaviorTest1Query::create()->deleteAll();
  455. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  456. VersionableBehaviorTest1Query::disableVersioning();
  457. $o = new VersionableBehaviorTest1();
  458. $o->save();
  459. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  460. $this->assertEquals(0, $versions->count());
  461. VersionableBehaviorTest1Query::enableVersioning();
  462. }
  463. /**
  464. * @return void
  465. */
  466. public function testDeleteObjectDeletesRecordInVersionTable()
  467. {
  468. VersionableBehaviorTest1Query::create()->deleteAll();
  469. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  470. $o = new VersionableBehaviorTest1();
  471. $o->save();
  472. $o->setBar(123);
  473. $o->save();
  474. $nbVersions = VersionableBehaviorTest1VersionQuery::create()->count();
  475. $this->assertEquals(2, $nbVersions);
  476. $o->delete();
  477. $nbVersions = VersionableBehaviorTest1VersionQuery::create()->count();
  478. $this->assertEquals(0, $nbVersions);
  479. }
  480. /**
  481. * @return void
  482. */
  483. public function testDeleteObjectDeletesRecordInVersionTableWithCustomName()
  484. {
  485. VersionableBehaviorTest3Query::create()->deleteAll();
  486. VersionableBehaviorTest3VersionQuery::create()->deleteAll();
  487. $o = new VersionableBehaviorTest3();
  488. $o->save();
  489. $o->setBar(123);
  490. $o->save();
  491. $nbVersions = VersionableBehaviorTest3VersionQuery::create()->count();
  492. $this->assertEquals(2, $nbVersions);
  493. $o->delete();
  494. $nbVersions = VersionableBehaviorTest3VersionQuery::create()->count();
  495. $this->assertEquals(0, $nbVersions);
  496. }
  497. /**
  498. * @return void
  499. */
  500. public function testToVersion()
  501. {
  502. $o = new VersionableBehaviorTest1();
  503. $o->setBar(123); // version 1
  504. $o->save();
  505. $o->setBar(456); // version 2
  506. $o->save();
  507. $o->toVersion(1);
  508. $this->assertEquals(123, $o->getBar());
  509. $o->toVersion(2);
  510. $this->assertEquals(456, $o->getBar());
  511. }
  512. /**
  513. * @return void
  514. */
  515. public function testToVersionAllowsFurtherSave()
  516. {
  517. $o = new VersionableBehaviorTest1();
  518. $o->setBar(123); // version 1
  519. $o->save();
  520. $o->setBar(456); // version 2
  521. $o->save();
  522. $o->toVersion(1);
  523. $this->assertTrue($o->isModified());
  524. $o->save();
  525. $this->assertEquals(3, $o->getVersion());
  526. }
  527. /**
  528. * @return void
  529. */
  530. public function testToVersionThrowsExceptionOnIncorrectVersion()
  531. {
  532. $this->expectException(PropelException::class);
  533. $o = new VersionableBehaviorTest1();
  534. $o->setBar(123); // version 1
  535. $o->save();
  536. $o->toVersion(2);
  537. }
  538. /**
  539. * @return void
  540. */
  541. public function testToVersionPreservesVersionedFkObjects()
  542. {
  543. $a = new VersionableBehaviorTest4();
  544. $a->setBar(123); // a1
  545. $b = new VersionableBehaviorTest5();
  546. $b->setFoo('Hello');
  547. $b->setVersionableBehaviorTest4($a);
  548. $b->save(); //b1
  549. $a->setBar(456); //a2
  550. $b->save(); // b2
  551. $b->setFoo('World');
  552. $b->save(); // b3
  553. $b->toVersion(2);
  554. $this->assertEquals($b->getVersion(), 2);
  555. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  556. $b->toVersion(1);
  557. $this->assertEquals($b->getVersion(), 1);
  558. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 1);
  559. $b->toVersion(3);
  560. $this->assertEquals($b->getVersion(), 3);
  561. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  562. }
  563. /**
  564. * @return void
  565. */
  566. public function testToVersionPreservesVersionedReferrerObjects()
  567. {
  568. $b1 = new VersionableBehaviorTest5();
  569. $b1->setFoo('Hello');
  570. $b2 = new VersionableBehaviorTest5();
  571. $b2->setFoo('World');
  572. $a = new VersionableBehaviorTest4();
  573. $a->setBar(123); // a1
  574. $a->addVersionableBehaviorTest5($b1);
  575. $a->addVersionableBehaviorTest5($b2);
  576. $a->save(); //b1
  577. $this->assertEquals(1, $a->getVersion());
  578. $bs = $a->getVersionableBehaviorTest5s();
  579. $this->assertEquals(1, $bs[0]->getVersion());
  580. $this->assertEquals(1, $bs[1]->getVersion());
  581. $b1->setFoo('Heloo');
  582. $a->save();
  583. $this->assertEquals(2, $a->getVersion());
  584. $bs = $a->getVersionableBehaviorTest5s();
  585. $this->assertEquals(2, $bs[0]->getVersion());
  586. $this->assertEquals(1, $bs[1]->getVersion());
  587. $b3 = new VersionableBehaviorTest5();
  588. $b3->setFoo('Yep');
  589. $a->clearVersionableBehaviorTest5s();
  590. $a->addVersionableBehaviorTest5($b3);
  591. $a->save();
  592. $a->clearVersionableBehaviorTest5s();
  593. $this->assertEquals(3, $a->getVersion());
  594. $bs = $a->getVersionableBehaviorTest5s();
  595. $this->assertEquals(2, $bs[0]->getVersion());
  596. $this->assertEquals(1, $bs[1]->getVersion());
  597. $this->assertEquals(1, $bs[2]->getVersion());
  598. $a->toVersion(1);
  599. $bs = $a->getVersionableBehaviorTest5s();
  600. $this->assertEquals(1, $bs[0]->getVersion());
  601. $this->assertEquals(1, $bs[1]->getVersion());
  602. $bs[0]->toVersion(2);
  603. $a = $bs[0]->getVersionableBehaviorTest4();
  604. $this->assertEquals(2, $a->getVersion());
  605. }
  606. /**
  607. * @return void
  608. */
  609. public function testGetLastVersionNumber()
  610. {
  611. $o = new VersionableBehaviorTest1();
  612. $this->assertEquals(0, $o->getLastVersionNumber());
  613. $o->setBar(123); // version 1
  614. $o->save();
  615. $this->assertEquals(1, $o->getLastVersionNumber());
  616. $o->setBar(456); // version 2
  617. $o->save();
  618. $this->assertEquals(2, $o->getLastVersionNumber());
  619. $o->toVersion(1);
  620. $o->save();
  621. $this->assertEquals(3, $o->getLastVersionNumber());
  622. }
  623. /**
  624. * @return void
  625. */
  626. public function testIsLastVersion()
  627. {
  628. $o = new VersionableBehaviorTest1();
  629. $this->assertTrue($o->isLastVersion());
  630. $o->setBar(123); // version 1
  631. $o->save();
  632. $this->assertTrue($o->isLastVersion());
  633. $o->setBar(456); // version 2
  634. $o->save();
  635. $this->assertTrue($o->isLastVersion());
  636. $o->toVersion(1);
  637. $this->assertFalse($o->isLastVersion());
  638. $o->save();
  639. $this->assertTrue($o->isLastVersion());
  640. }
  641. /**
  642. * @return void
  643. */
  644. public function testIsVersioningNecessary()
  645. {
  646. $o = new VersionableBehaviorTest1();
  647. $this->assertTrue($o->isVersioningNecessary());
  648. $o->save();
  649. $this->assertFalse($o->isVersioningNecessary());
  650. $o->setBar(123);
  651. $this->assertTrue($o->isVersioningNecessary());
  652. $o->save();
  653. $this->assertFalse($o->isVersioningNecessary());
  654. VersionableBehaviorTest1Query::disableVersioning();
  655. $o = new VersionableBehaviorTest1();
  656. $this->assertFalse($o->isVersioningNecessary());
  657. $o->save();
  658. $this->assertFalse($o->isVersioningNecessary());
  659. $o->setBar(123);
  660. $this->assertFalse($o->isVersioningNecessary());
  661. $o->save();
  662. $this->assertFalse($o->isVersioningNecessary());
  663. VersionableBehaviorTest1Query::enableVersioning();
  664. $b1 = new VersionableBehaviorTest5();
  665. $b1->setFoo('Hello');
  666. $b2 = new VersionableBehaviorTest5();
  667. $b2->setFoo('World');
  668. $a = new VersionableBehaviorTest4();
  669. $a->setBar(123); // a1
  670. $this->assertTrue($a->isVersioningNecessary());
  671. $a->save();
  672. $this->assertFalse($a->isVersioningNecessary());
  673. $a->addVersionableBehaviorTest5($b1);
  674. $this->assertTrue($a->isVersioningNecessary());
  675. $a->save();
  676. $this->assertFalse($a->isVersioningNecessary());
  677. $a->addVersionableBehaviorTest5($b2);
  678. $this->assertTrue($a->isVersioningNecessary());
  679. $a->save();
  680. $this->assertFalse($a->isVersioningNecessary());
  681. $b2->setFoo('World !');
  682. $this->assertTrue($b2->isVersioningNecessary());
  683. $this->assertTrue($a->isVersioningNecessary());
  684. $a->save();
  685. $this->assertFalse($b2->isVersioningNecessary());
  686. $this->assertFalse($a->isVersioningNecessary());
  687. }
  688. /**
  689. * @return void
  690. */
  691. public function testIsVersioningNecessaryWithNullFk()
  692. {
  693. // the purpose of this tests is to highlight a bug with FK
  694. // and isVersioningNecessary()
  695. $b1 = new VersionableBehaviorTest5();
  696. $b1->setNew(false);
  697. // this time, the object isn't modified, so the
  698. // isVersioningNecessary() method is called on FK objects...
  699. // which can be null.
  700. $b1->isVersioningNecessary();
  701. $this->assertTrue(true, 'getting here means that nothing went wrong');
  702. }
  703. /**
  704. * @return void
  705. */
  706. public function testAddVersionNewObject()
  707. {
  708. VersionableBehaviorTest1Query::disableVersioning();
  709. VersionableBehaviorTest1Query::create()->deleteAll();
  710. VersionableBehaviorTest1VersionQuery::create()->deleteAll();
  711. $o = new VersionableBehaviorTest1();
  712. $o->addVersion();
  713. $o->save();
  714. $versions = VersionableBehaviorTest1VersionQuery::create()->find();
  715. $this->assertEquals(1, $versions->count());
  716. $this->assertEquals($o, $versions[0]->getVersionableBehaviorTest1());
  717. VersionableBehaviorTest1Query::enableVersioning();
  718. }
  719. /**
  720. * @return void
  721. */
  722. public function testVersionCreatedAt()
  723. {
  724. $o = new VersionableBehaviorTest4();
  725. $t = time();
  726. $o->save();
  727. $version = VersionableBehaviorTest4VersionQuery::create()
  728. ->filterByVersionableBehaviorTest4($o)
  729. ->findOne();
  730. $this->assertEquals($t, $version->getVersionCreatedAt('U'));
  731. $o = new VersionableBehaviorTest4();
  732. $inThePast = time() - 123456;
  733. $o->setVersionCreatedAt($inThePast);
  734. $o->save();
  735. $this->assertEquals($inThePast, $o->getVersionCreatedAt('U'));
  736. $version = VersionableBehaviorTest4VersionQuery::create()
  737. ->filterByVersionableBehaviorTest4($o)
  738. ->findOne();
  739. $this->assertEquals($o->getVersionCreatedAt(), $version->getVersionCreatedAt());
  740. }
  741. /**
  742. * @return void
  743. */
  744. public function testVersionCreatedBy()
  745. {
  746. $o = new VersionableBehaviorTest4();
  747. $o->setVersionCreatedBy('me me me');
  748. $o->save();
  749. $version = VersionableBehaviorTest4VersionQuery::create()
  750. ->filterByVersionableBehaviorTest4($o)
  751. ->findOne();
  752. $this->assertEquals('me me me', $version->getVersionCreatedBy());
  753. }
  754. /**
  755. * @return void
  756. */
  757. public function testSaveAndModifyWithNoChangeSchema()
  758. {
  759. $o = new VersionableBehaviorTest7();
  760. //$o->setVersionCreatedBy('You and I');
  761. $o->save();
  762. $this->assertEquals(1, $o->getVersion());
  763. $o->setFooBar('Something');
  764. $o->save();
  765. $this->assertEquals(2, $o->getVersion());
  766. $o = new VersionableBehaviorTest6();
  767. //$o->setVersionCreatedBy('You and I');
  768. $o->save();
  769. $this->assertEquals(1, $o->getVersion());
  770. $o->setFooBar('Something');
  771. $o->save();
  772. $this->assertEquals(2, $o->getVersion());
  773. }
  774. /**
  775. * @return void
  776. */
  777. public function testVersionComment()
  778. {
  779. $o = new VersionableBehaviorTest4();
  780. $o->setVersionComment('Because you deserve it');
  781. $o->save();
  782. $version = VersionableBehaviorTest4VersionQuery::create()
  783. ->filterByVersionableBehaviorTest4($o)
  784. ->findOne();
  785. $this->assertEquals('Because you deserve it', $version->getVersionComment());
  786. }
  787. /**
  788. * @return void
  789. */
  790. public function testToVersionWorksWithComments()
  791. {
  792. $o = new VersionableBehaviorTest4();
  793. $o->setVersionComment('Because you deserve it');
  794. $o->setBar(123); // version 1
  795. $o->save();
  796. $o->setVersionComment('Unless I change my mind');
  797. $o->setBar(456); // version 2
  798. $o->save();
  799. $o->toVersion(1);
  800. $this->assertEquals('Because you deserve it', $o->getVersionComment());
  801. $o->toVersion(2);
  802. $this->assertEquals('Unless I change my mind', $o->getVersionComment());
  803. }
  804. /**
  805. * @return void
  806. */
  807. public function testGetOneVersion()
  808. {
  809. $o = new VersionableBehaviorTest1();
  810. $o->setBar(123); // version 1
  811. $o->save();
  812. $o->setBar(456); // version 2
  813. $o->save();
  814. $version = $o->getOneVersion(1);
  815. $this->assertTrue($version instanceof VersionableBehaviorTest1Version);
  816. $this->assertEquals(1, $version->getVersion());
  817. $this->assertEquals(123, $version->getBar());
  818. $version = $o->getOneVersion(2);
  819. $this->assertEquals(2, $version->getVersion());
  820. $this->assertEquals(456, $version->getBar());
  821. }
  822. /**
  823. * @return void
  824. */
  825. public function testGetAllVersions()
  826. {
  827. $o = new VersionableBehaviorTest1();
  828. $versions = $o->getAllVersions();
  829. $this->assertTrue($versions->isEmpty());
  830. $o->setBar(123); // version 1
  831. $o->save();
  832. $o->setBar(456); // version 2
  833. $o->save();
  834. $versions = $o->getAllVersions();
  835. $this->assertTrue($versions instanceof ObjectCollection);
  836. $this->assertEquals(2, $versions->count());
  837. $this->assertEquals(1, $versions[0]->getVersion());
  838. $this->assertEquals(123, $versions[0]->getBar());
  839. $this->assertEquals(2, $versions[1]->getVersion());
  840. $this->assertEquals(456, $versions[1]->getBar());
  841. }
  842. /**
  843. * @return void
  844. */
  845. public function testGetLastVersions()
  846. {
  847. $o = new VersionableBehaviorTest1();
  848. $versions = $o->getAllVersions();
  849. $this->assertTrue($versions->isEmpty());
  850. $o->setBar(123); // version 1
  851. $o->save();
  852. $o->setBar(456); // version 2
  853. $o->save();
  854. $o->setBar(789); // version 3
  855. $o->save();
  856. $o->setBar(101112); // version 4
  857. $o->save();
  858. $versions = $o->getLastVersions();
  859. $this->assertTrue($versions instanceof ObjectCollection);
  860. $this->assertEquals(4, $versions->count());
  861. $this->assertEquals(4, $versions[0]->getVersion());
  862. $this->assertEquals(101112, $versions[0]->getBar());
  863. $this->assertEquals(3, $versions[1]->getVersion());
  864. $this->assertEquals(789, $versions[1]->getBar());
  865. $this->assertEquals(2, $versions[2]->getVersion());
  866. $this->assertEquals(456, $versions[2]->getBar());
  867. $this->assertEquals(1, $versions[3]->getVersion());
  868. $this->assertEquals(123, $versions[3]->getBar());
  869. $versions = $o->getLastVersions(2);
  870. $this->assertTrue($versions instanceof ObjectCollection);
  871. $this->assertEquals(2, $versions->count());
  872. $this->assertEquals(4, $versions[0]->getVersion());
  873. $this->assertEquals(101112, $versions[0]->getBar());
  874. $this->assertEquals(3, $versions[1]->getVersion());
  875. $this->assertEquals(789, $versions[1]->getBar());
  876. }
  877. /**
  878. * @return void
  879. */
  880. public function testCompareVersion()
  881. {
  882. $o = new VersionableBehaviorTest4();
  883. $versions = $o->getAllVersions();
  884. $this->assertTrue($versions->isEmpty());
  885. $o->setBar(123); // version 1
  886. $o->save();
  887. $o->setBar(456); // version 2
  888. $o->save();
  889. $o->setBar(789); // version 3
  890. $o->setVersionComment('Foo');
  891. $o->save();
  892. $diff = $o->compareVersion(3); // $o is in version 3
  893. $expected = [];
  894. $this->assertEquals($expected, $diff);
  895. $diff = $o->compareVersion(2);
  896. $expected = [
  897. 'Bar' => [2 => 456, 3 => 789],
  898. ];
  899. $this->assertEquals($expected, $diff);
  900. $diff = $o->compareVersion(1);
  901. $expected = [
  902. 'Bar' => [1 => 123, 3 => 789],
  903. ];
  904. $this->assertEquals($expected, $diff);
  905. }
  906. /**
  907. * @return void
  908. */
  909. public function testCompareVersions()
  910. {
  911. $o = new VersionableBehaviorTest4();
  912. $versions = $o->getAllVersions();
  913. $this->assertTrue($versions->isEmpty());
  914. $o->setBar(123); // version 1
  915. $o->save();
  916. $o->setBar(456); // version 2
  917. $o->save();
  918. $o->setBar(789); // version 3
  919. $o->setVersionComment('Foo');
  920. $o->save();
  921. $diff = $o->compareVersions(1, 3);
  922. $expected = [
  923. 'Bar' => [1 => 123, 3 => 789],
  924. ];
  925. $this->assertEquals($expected, $diff);
  926. $diff = $o->compareVersions(1, 3, 'versions');
  927. $expected = [
  928. 1 => ['Bar' => 123],
  929. 3 => ['Bar' => 789],
  930. ];
  931. $this->assertEquals($expected, $diff);
  932. }
  933. /**
  934. * @return void
  935. */
  936. public function testForeignKeyVersion()
  937. {
  938. $a = new VersionableBehaviorTest4();
  939. $a->setBar(123); // a1
  940. $b = new VersionableBehaviorTest5();
  941. $b->setFoo('Hello');
  942. $b->setVersionableBehaviorTest4($a);
  943. $b->save(); //b1
  944. $this->assertEquals($b->getVersion(), 1);
  945. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 1);
  946. $a->setBar(456); //a2
  947. $b->save(); // b2
  948. $this->assertEquals($b->getVersion(), 2);
  949. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  950. $b->setFoo('World');
  951. $b->save(); // b3
  952. $this->assertEquals($b->getVersion(), 3);
  953. $this->assertEquals($b->getVersionableBehaviorTest4()->getVersion(), 2);
  954. }
  955. /**
  956. * @return void
  957. */
  958. public function testReferrerVersion()
  959. {
  960. $b1 = new VersionableBehaviorTest5();
  961. $b1->setFoo('Hello');
  962. $b2 = new VersionableBehaviorTest5();
  963. $b2->setFoo('World');
  964. $a = new VersionableBehaviorTest4();
  965. $a->setBar(123); // a1
  966. $a->addVersionableBehaviorTest5($b1);
  967. $a->addVersionableBehaviorTest5($b2);
  968. $a->save(); //b1
  969. $this->assertEquals(1, $a->getVersion());
  970. $this->assertEquals([1, 1], $a->getOneVersion(1)->getVersionableBehaviorTest5Versions());
  971. $b1->setFoo('Heloo');
  972. $a->save();
  973. $this->assertEquals(2, $a->getVersion());
  974. $this->assertEquals([2, 1], $a->getOneVersion(2)->getVersionableBehaviorTest5Versions());
  975. $b3 = new VersionableBehaviorTest5();
  976. $b3->setFoo('Yep');
  977. $a->clearVersionableBehaviorTest5s();
  978. $a->addVersionableBehaviorTest5($b3);
  979. $a->save();
  980. $a->clearVersionableBehaviorTest5s();
  981. $this->assertEquals(3, $a->getVersion());
  982. $this->assertEquals([2, 1, 1], $a->getOneVersion(3)->getVersionableBehaviorTest5Versions());
  983. }
  984. /**
  985. * @return void
  986. */
  987. public function testEnumField()
  988. {
  989. $o = new VersionableBehaviorTest7();
  990. $o->setStyle('novel');
  991. $o->save();
  992. $this->assertEquals('novel', $o->getStyle(), 'Set style to novel');
  993. $this->assertEquals(1, $o->getVersion(), '');
  994. $o->setStyle('essay');
  995. $o->save();
  996. $this->assertEquals('essay', $o->getStyle(), 'Set style to essay');
  997. $this->assertEquals(2, $o->getVersion(), '');
  998. $this->assertEquals('novel', $o->getOneVersion(1)->getStyle(), 'First version is a novel');
  999. $this->assertEquals('essay', $o->getOneVersion(2)->getStyle(), 'Second version is an essay');
  1000. }
  1001. /**
  1002. * @return void
  1003. */
  1004. public function testSetField()
  1005. {
  1006. $o = new VersionableBehaviorTest7();
  1007. $o->setStyle2(['novel', 'essay']);
  1008. $o->save();
  1009. $this->assertEquals(['novel', 'essay'], $o->getStyle2(), 'Set style to novel');
  1010. $this->assertEquals(1, $o->getVersion(), '');
  1011. $o->setStyle2(['essay']);
  1012. $o->save();
  1013. $this->assertEquals(['essay'], $o->getStyle2(), 'Set style to essay');
  1014. $this->assertEquals(2, $o->getVersion(), '');
  1015. $this->assertEquals(['novel', 'essay'], $o->getOneVersion(1)->getStyle2(), 'First version is a novel');
  1016. $this->assertEquals(['essay'], $o->getOneVersion(2)->getStyle2(), 'Second version is an essay');
  1017. }
  1018. /**
  1019. * @return void
  1020. */
  1021. public function testWithInheritance()
  1022. {
  1023. $b1 = new VersionableBehaviorTest8Foo();
  1024. $b1->save();
  1025. $b1->setFoobar('name');
  1026. $b1->save();
  1027. $object = $b1->getOneVersion($b1->getVersion());
  1028. $this->assertTrue($object instanceof Versionablebehaviortest8Version);
  1029. }
  1030. /**
  1031. * @return void
  1032. */
  1033. public function testEnforceVersioning()
  1034. {
  1035. $bar = new VersionableBehaviorTest10();
  1036. $bar->setBar(42);
  1037. $bar->save();
  1038. $this->assertEquals(1, $bar->getVersion());
  1039. $this->assertFalse($bar->isVersioningNecessary());
  1040. $bar->enforceVersioning();
  1041. $this->assertTrue($bar->isVersioningNecessary());
  1042. $bar->save();
  1043. $this->assertEquals(2, $bar->getVersion());
  1044. }
  1045. /**
  1046. * @return void
  1047. */
  1048. public function testOneToOneCreatesValidRecord()
  1049. {
  1050. VersionableBehaviorTestOneToOneQuery::create()->deleteAll();
  1051. VersionableBehaviorTestOneToOneKeyQuery::create()->deleteAll();
  1052. VersionableBehaviorTestOneToOneVersionQuery::create()->deleteAll();
  1053. VersionableBehaviorTestOneToOneKeyVersionQuery::create()->deleteAll();
  1054. $x = new VersionableBehaviorTestOneToOne();
  1055. $x->setBar('One To....');
  1056. $x->save();
  1057. $y = new VersionableBehaviorTestOneToOneKey();
  1058. $y->setVersionableBehaviorTestOneToOne($x);
  1059. $y->setBar('One');
  1060. $y->save();
  1061. $this->assertEquals(1, $x->getVersion());
  1062. $this->assertEquals(1, $y->getVersion());
  1063. $newX = VersionableBehaviorTestOneToOneQuery::create()->findOne();
  1064. $this->assertInstanceOf('VersionableBehaviorTestOneToOne', $x);
  1065. $this->assertInstanceOf('VersionableBehaviorTestOneToOne', $newX);
  1066. $this->assertEquals($x, $newX);
  1067. $newY = $x->getVersionableBehaviorTestOneToOneKey();
  1068. $this->assertInstanceOf('VersionableBehaviorTestOneToOneKey', $y);
  1069. $this->assertInstanceOf('VersionableBehaviorTestOneToOneKey', $newY);
  1070. $this->assertEquals($y, $newY);
  1071. $this->assertFalse($x->isVersioningNecessary());
  1072. $x->setBar('Two');
  1073. $this->assertTrue($x->isVersioningNecessary());
  1074. $x->save();
  1075. $this->assertEquals(2, $x->getVersion());
  1076. $x->toVersion(1);
  1077. $x->save();
  1078. $this->assertEquals('One To....', $x->getBar());
  1079. $this->assertEquals('One', $x->getVersionableBehaviorTestOneToOneKey()->getBar());//$y
  1080. }
  1081. }