PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/test/testsuite/generator/behavior/archivable/ArchivableBehaviorObjectBuilderModifierTest.php

http://github.com/propelorm/Propel
PHP | 454 lines | 381 code | 51 blank | 22 comment | 2 complexity | c8256d8bba34a354eae22070676173a9 MD5 | raw file
  1. <?php
  2. /*
  3. * $Id$
  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/archivable/ArchivableBehavior.php';
  12. require_once dirname(__FILE__) . '/../../../../../runtime/lib/Propel.php';
  13. /**
  14. * Tests for ArchivableBehavior class
  15. *
  16. * @author François Zaninotto
  17. * @version $Revision$
  18. * @package generator.behavior.archivable
  19. */
  20. class ArchivableBehaviorObjectBuilderModifierTest extends PHPUnit_Framework_TestCase
  21. {
  22. public function setUp()
  23. {
  24. if (!class_exists('ArchivableTest10')) {
  25. $schema = <<<EOF
  26. <database name="archivable_behavior_test_10">
  27. <table name="archivable_test_10">
  28. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  29. <column name="title" type="VARCHAR" size="100" primaryString="true" />
  30. <column name="age" type="INTEGER" />
  31. <column name="foo_id" type="INTEGER" />
  32. <foreign-key foreignTable="archivable_test_20">
  33. <reference local="foo_id" foreign="id" />
  34. </foreign-key>
  35. <index>
  36. <index-column name="title" />
  37. <index-column name="age" />
  38. </index>
  39. <behavior name="archivable" />
  40. </table>
  41. <table name="archivable_test_20">
  42. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  43. <column name="title" type="VARCHAR" size="100" primaryString="true" />
  44. <behavior name="archivable" />
  45. </table>
  46. <table name="archivable_test_20_archive">
  47. <column name="id" required="true" primaryKey="true" type="INTEGER" />
  48. <column name="title" type="VARCHAR" size="100" primaryString="true" />
  49. </table>
  50. <table name="archivable_test_30">
  51. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  52. <column name="title" type="VARCHAR" size="100" primaryString="true" />
  53. <column name="age" type="INTEGER" />
  54. <column name="foo_id" type="INTEGER" />
  55. <behavior name="archivable">
  56. <parameter name="log_archived_at" value="false" />
  57. <parameter name="archive_table" value="my_old_archivable_test_30" />
  58. <parameter name="archive_on_insert" value="true" />
  59. <parameter name="archive_on_update" value="true" />
  60. <parameter name="archive_on_delete" value="false" />
  61. </behavior>
  62. </table>
  63. <table name="archivable_test_40">
  64. <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
  65. <column name="title" type="VARCHAR" size="100" primaryString="true" />
  66. <column name="age" type="INTEGER" />
  67. <behavior name="archivable">
  68. <parameter name="archive_class" value="FooArchive" />
  69. </behavior>
  70. </table>
  71. </database>
  72. EOF;
  73. PropelQuickBuilder::buildSchema($schema);
  74. }
  75. }
  76. public function testHasGetArchiveMethod()
  77. {
  78. $this->assertTrue(method_exists('ArchivableTest10', 'getArchive'));
  79. }
  80. public function testGetArchiveReturnsNullOnNewObjects()
  81. {
  82. $a = new ArchivableTest10();
  83. $this->assertNull($a->getArchive());
  84. }
  85. public function testGetArchiveReturnsNullWhenNoArchiveIsFound()
  86. {
  87. $a = new ArchivableTest10();
  88. $a->setTitle('foo');
  89. $a->setAge(12);
  90. $a->save();
  91. $this->assertNull($a->getArchive());
  92. }
  93. public function testGetArchiveReturnsExistingArchive()
  94. {
  95. $a = new ArchivableTest10();
  96. $a->setTitle('foo');
  97. $a->setAge(12);
  98. $a->save();
  99. $archive = new ArchivableTest10Archive();
  100. $archive->setId($a->getId());
  101. $archive->setTitle('bar');
  102. $archive->save();
  103. $this->assertSame($archive, $a->getArchive());
  104. }
  105. public function testHasArchiveMethod()
  106. {
  107. $this->assertTrue(method_exists('ArchivableTest10', 'archive'));
  108. }
  109. public function testArchiveCreatesACopyByDefault()
  110. {
  111. ArchivableTest10ArchiveQuery::create()->deleteAll();
  112. $a = new ArchivableTest10();
  113. $a->setTitle('foo');
  114. $a->setAge(12);
  115. $a->save();
  116. $a->archive();
  117. $archive = ArchivableTest10ArchiveQuery::create()
  118. ->filterById($a->getId())
  119. ->findOne();
  120. $this->assertInstanceOf('ArchivableTest10Archive', $archive);
  121. $this->assertEquals('foo', $archive->getTitle());
  122. $this->assertEquals(12, $archive->getAge());
  123. }
  124. public function testArchiveUpdatesExistingArchive()
  125. {
  126. ArchivableTest10ArchiveQuery::create()->deleteAll();
  127. $a = new ArchivableTest10();
  128. $a->setTitle('foo');
  129. $a->setAge(12);
  130. $a->save();
  131. $b = new ArchivableTest10Archive();
  132. $b->setId($a->getId());
  133. $b->setTitle('bar');
  134. $b->save();
  135. $a->archive();
  136. $this->assertEquals(1, ArchivableTest10ArchiveQuery::create()->count());
  137. $this->assertEquals('foo', $b->getTitle());
  138. }
  139. public function testArchiveUsesArchiveClassIfSpecified()
  140. {
  141. $a = new ArchivableTest40();
  142. $a->setTitle('foo');
  143. $a->setAge(12);
  144. $a->save();
  145. $a->archive();
  146. $archive = FooArchiveCollection::getArchiveSingleton();
  147. $this->assertEquals($a->getId(), $archive->id);
  148. $this->assertEquals('foo', $archive->title);
  149. $this->assertEquals(12, $archive->age);
  150. }
  151. public function testArchiveReturnsArchivedObject()
  152. {
  153. $a = new ArchivableTest10();
  154. $a->setTitle('foo');
  155. $a->save();
  156. $ret = $a->archive();
  157. $this->assertInstanceOf('ArchivableTest10Archive', $ret);
  158. $this->assertEquals($a->getPrimaryKey(), $ret->getPrimaryKey());
  159. $this->assertEquals($a->getTitle(), $ret->getTitle());
  160. }
  161. /**
  162. * @expectedException PropelException
  163. */
  164. public function testArchiveThrowsExceptionOnNewObjects()
  165. {
  166. $a = new ArchivableTest10();
  167. $a->archive();
  168. }
  169. public function testHasRestoreFromArchiveMethod()
  170. {
  171. $this->assertTrue(method_exists('ArchivableTest10', 'restoreFromArchive'));
  172. }
  173. /**
  174. * @expectedException PropelException
  175. */
  176. public function testRestoreFromArchiveThrowsExceptionOnUnarchivedObjects()
  177. {
  178. $a = new ArchivableTest10();
  179. $a->setTitle('foo');
  180. $a->setAge(12);
  181. $a->save();
  182. $a->restoreFromArchive();
  183. }
  184. public function testRestoreFromArchiveChangesStateToTheArchiveState()
  185. {
  186. $a = new ArchivableTest10();
  187. $a->setTitle('foo');
  188. $a->setAge(12);
  189. $a->save();
  190. $archive = new ArchivableTest10Archive();
  191. $archive->setId($a->getId());
  192. $archive->setTitle('bar');
  193. $archive->setAge(15);
  194. $archive->save();
  195. $a->restoreFromArchive();
  196. $this->assertEquals('bar', $a->getTitle());
  197. $this->assertEquals(15, $a->getAge());
  198. }
  199. public function testHasPopulateFromArchiveMethod()
  200. {
  201. $this->assertTrue(method_exists('ArchivableTest10', 'populateFromArchive'));
  202. }
  203. public function testPopulateFromArchiveReturnsCurrentObject()
  204. {
  205. $archive = new ArchivableTest10Archive();
  206. $a = new ArchivableTest10();
  207. $ret = $a->populateFromArchive($archive);
  208. $this->assertSame($ret, $a);
  209. }
  210. public function testPopulateFromArchive()
  211. {
  212. ArchivableTest10ArchiveQuery::create()->deleteAll();
  213. ArchivableTest10Query::create()->deleteAllWithoutArchive();
  214. $archive = new ArchivableTest10Archive();
  215. $archive->setId(123); // not autoincremented
  216. $archive->setTitle('foo');
  217. $archive->setAge(12);
  218. $archive->save();
  219. $a = new ArchivableTest10();
  220. $a->populateFromArchive($archive);
  221. $this->assertNotEquals(123, $a->getId());
  222. $this->assertEquals('foo', $a->getTitle());
  223. $this->assertEquals(12, $a->getAge());
  224. $b = new ArchivableTest10();
  225. $b->populateFromArchive($archive, true);
  226. $this->assertEquals(123, $b->getId());
  227. }
  228. public function testInsertDoesNotCreateArchiveByDefault()
  229. {
  230. $a = new ArchivableTest10();
  231. $a->setTitle('foo');
  232. $a->setAge(12);
  233. ArchivableTest10ArchiveQuery::create()->deleteAll();
  234. $a->save();
  235. $this->assertEquals(0, ArchivableTest10ArchiveQuery::create()->count());
  236. }
  237. public function testInsertCreatesArchiveIfSpecified()
  238. {
  239. $a = new ArchivableTest30();
  240. $a->setTitle('foo');
  241. $a->setAge(12);
  242. MyOldArchivableTest30Query::create()->deleteAll();
  243. $a->save();
  244. $this->assertEquals(1, MyOldArchivableTest30Query::create()->count());
  245. $archive = MyOldArchivableTest30Query::create()
  246. ->filterById($a->getId())
  247. ->findOne();
  248. $this->assertInstanceOf('MyOldArchivableTest30', $archive);
  249. $this->assertEquals('foo', $archive->getTitle());
  250. $this->assertEquals(12, $archive->getAge());
  251. }
  252. public function testUpdateDoesNotCreateArchiveByDefault()
  253. {
  254. $a = new ArchivableTest10();
  255. $a->setTitle('foo');
  256. $a->setAge(12);
  257. $a->save();
  258. $a->setTitle('bar');
  259. ArchivableTest10ArchiveQuery::create()->deleteAll();
  260. $a->save();
  261. $this->assertEquals(0, ArchivableTest10ArchiveQuery::create()->count());
  262. }
  263. public function testUpdateCreatesArchiveIfSpecified()
  264. {
  265. $a = new ArchivableTest30();
  266. $a->setTitle('foo');
  267. $a->setAge(12);
  268. $a->save();
  269. $a->setTitle('bar');
  270. MyOldArchivableTest30Query::create()->deleteAll();
  271. $a->save();
  272. $this->assertEquals(1, MyOldArchivableTest30Query::create()->count());
  273. $archive = MyOldArchivableTest30Query::create()
  274. ->filterById($a->getId())
  275. ->findOne();
  276. $this->assertInstanceOf('MyOldArchivableTest30', $archive);
  277. $this->assertEquals('bar', $archive->getTitle());
  278. $this->assertEquals(12, $archive->getAge());
  279. }
  280. public function testDeleteCreatesArchiveByDefault()
  281. {
  282. $a = new ArchivableTest10();
  283. $a->setTitle('foo');
  284. $a->setAge(12);
  285. $a->save();
  286. ArchivableTest10ArchiveQuery::create()->deleteAll();
  287. $a->delete();
  288. $this->assertEquals(1, ArchivableTest10ArchiveQuery::create()->count());
  289. $archive = ArchivableTest10ArchiveQuery::create()
  290. ->filterById($a->getId())
  291. ->findOne();
  292. $this->assertInstanceOf('ArchivableTest10Archive', $archive);
  293. $this->assertEquals('foo', $archive->getTitle());
  294. $this->assertEquals(12, $archive->getAge());
  295. }
  296. public function testDeleteDoesNotCreateArchiveIfSpecified()
  297. {
  298. $a = new ArchivableTest30();
  299. $a->setTitle('foo');
  300. $a->setAge(12);
  301. $a->save();
  302. MyOldArchivableTest30Query::create()->deleteAll();
  303. $a->delete();
  304. $this->assertEquals(0, MyOldArchivableTest30Query::create()->count());
  305. }
  306. public function testHasSaveWithoutArchiveMethod()
  307. {
  308. $this->assertTrue(method_exists('ArchivableTest30', 'saveWithoutArchive'));
  309. }
  310. public function testSaveWithoutArchiveDoesNotCreateArchiveOnInsert()
  311. {
  312. $a = new ArchivableTest30();
  313. $a->setTitle('foo');
  314. $a->setAge(12);
  315. MyOldArchivableTest30Query::create()->deleteAll();
  316. $a->saveWithoutArchive();
  317. $this->assertEquals(0, MyOldArchivableTest30Query::create()->count());
  318. }
  319. public function testSaveWithoutArchiveDoesNotCreateArchiveOnUpdate()
  320. {
  321. $a = new ArchivableTest30();
  322. $a->setTitle('foo');
  323. $a->setAge(12);
  324. $a->save();
  325. $a->setTitle('bar');
  326. MyOldArchivableTest30Query::create()->deleteAll();
  327. $a->saveWithoutArchive();
  328. $this->assertEquals(0, MyOldArchivableTest30Query::create()->count());
  329. }
  330. public function testHasDeleteWithoutArchiveMethod()
  331. {
  332. $this->assertTrue(method_exists('ArchivableTest10', 'deleteWithoutArchive'));
  333. }
  334. public function testDeleteWithoutArchiveDoesNotCreateArchive()
  335. {
  336. $a = new ArchivableTest10();
  337. $a->setTitle('foo');
  338. $a->setAge(12);
  339. $a->save();
  340. ArchivableTest10ArchiveQuery::create()->deleteAll();
  341. $a->deleteWithoutArchive();
  342. $this->assertEquals(0, ArchivableTest10ArchiveQuery::create()->count());
  343. }
  344. public function testArchiveSetArchivedAtToTheCurrentTime()
  345. {
  346. $a = new ArchivableTest10();
  347. $a->setTitle('foo');
  348. $a->save();
  349. $ret = $a->archive();
  350. // time without seconds
  351. $this->assertEquals(date('Y-m-d H:i'), $ret->getArchivedAt('Y-m-d H:i'));
  352. }
  353. }
  354. class FooArchiveQuery
  355. {
  356. protected $pk;
  357. public static function create()
  358. {
  359. return new self();
  360. }
  361. public function filterByPrimaryKey($pk)
  362. {
  363. $this->pk = $pk;
  364. return $this;
  365. }
  366. public function findOne()
  367. {
  368. $archive = FooArchiveCollection::getArchiveSingleton();
  369. $archive->setId($this->pk);
  370. return $archive;
  371. }
  372. }
  373. class FooArchive
  374. {
  375. public $id, $title, $age;
  376. public function setId($value)
  377. {
  378. $this->id = $value;
  379. }
  380. public function setTitle($value)
  381. {
  382. $this->title = $value;
  383. }
  384. public function setAge($value)
  385. {
  386. $this->age = $value;
  387. }
  388. public function save()
  389. {
  390. return $this;
  391. }
  392. }
  393. class FooArchiveCollection
  394. {
  395. protected static $instance;
  396. public static function getArchiveSingleton()
  397. {
  398. if (null === self::$instance) {
  399. self::$instance = new FooArchive();
  400. }
  401. return self::$instance;
  402. }
  403. }