PageRenderTime 61ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/test/testsuite/generator/behavior/SoftDeleteBehaviorTest.php

https://github.com/1989gaurav/Propel
PHP | 413 lines | 359 code | 36 blank | 18 comment | 0 complexity | ec1898206db45d56d917df5dae273cff 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__) . '/../../../tools/helpers/bookstore/BookstoreTestBase.php';
  11. /**
  12. * Tests for SoftDeleteBehavior class
  13. *
  14. * @author François Zaninotto
  15. * @version $Revision$
  16. * @package generator.behavior
  17. */
  18. class SoftDeleteBehaviorTest extends BookstoreTestBase
  19. {
  20. protected function setUp()
  21. {
  22. parent::setUp();
  23. Table4Peer::disableSoftDelete();
  24. Table4Peer::doDeleteAll();
  25. Table4Peer::enableSoftDelete();
  26. }
  27. public function testParameters()
  28. {
  29. $table2 = Table4Peer::getTableMap();
  30. $this->assertEquals(count($table2->getColumns()), 3, 'SoftDelete adds one columns by default');
  31. $this->assertTrue(method_exists('Table4', 'getDeletedAt'), 'SoftDelete adds an updated_at column by default');
  32. $table1 = Table5Peer::getTableMap();
  33. $this->assertEquals(count($table1->getColumns()), 3, 'SoftDelete does not add a column when it already exists');
  34. $this->assertTrue(method_exists('Table5', 'getDeletedOn'), 'SoftDelete allows customization of deleted_column name');
  35. }
  36. public function testStaticSoftDeleteStatus()
  37. {
  38. $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'The static soft delete is enabled by default');
  39. Table4Peer::disableSoftDelete();
  40. $this->assertFalse(Table4Peer::isSoftDeleteEnabled(), 'disableSoftDelete() disables the static soft delete');
  41. Table4Peer::enableSoftDelete();
  42. $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'enableSoftDelete() enables the static soft delete');
  43. }
  44. public function testInstancePoolingAndSoftDelete()
  45. {
  46. Table4Peer::doForceDeleteAll($this->con);
  47. $t = new Table4();
  48. $t->save($this->con);
  49. Table4Peer::enableSoftDelete();
  50. $t->delete($this->con);
  51. $t2 = Table4Peer::retrieveByPk($t->getPrimaryKey(), $this->con);
  52. $this->assertNull($t2, 'An object is removed from the instance pool on soft deletion');
  53. Table4Peer::disableSoftDelete();
  54. $t2 = Table4Peer::retrieveByPk($t->getPrimaryKey(), $this->con);
  55. $this->assertNotNull($t2);
  56. Table4Peer::enableSoftDelete();
  57. $t2 = Table4Peer::retrieveByPk($t->getPrimaryKey(), $this->con);
  58. $this->assertNull($t2, 'A soft deleted object is removed from the instance pool when the soft delete behavior is enabled');
  59. }
  60. public function testStaticDoForceDelete()
  61. {
  62. $t1 = new Table4();
  63. $t1->save();
  64. Table4Peer::doForceDelete($t1);
  65. Table4Peer::disableSoftDelete();
  66. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doForceDelete() actually deletes records');
  67. }
  68. public function testStaticDoSoftDelete()
  69. {
  70. $t1 = new Table4();
  71. $t1->save();
  72. $t2 = new Table4();
  73. $t2->save();
  74. $t3 = new Table4();
  75. $t3->save();
  76. // softDelete with a criteria
  77. $c = new Criteria();
  78. $c->add(Table4Peer::ID, $t1->getId());
  79. Table4Peer::doSoftDelete($c);
  80. Table4Peer::disableSoftDelete();
  81. $this->assertEquals(3, Table4Peer::doCount(new Criteria()), 'doSoftDelete() keeps deleted record in the database');
  82. Table4Peer::enableSoftDelete();
  83. $this->assertEquals(2, Table4Peer::doCount(new Criteria()), 'doSoftDelete() marks deleted record as deleted');
  84. // softDelete with a value
  85. Table4Peer::doSoftDelete(array($t2->getId()));
  86. Table4Peer::disableSoftDelete();
  87. $this->assertEquals(3, Table4Peer::doCount(new Criteria()), 'doSoftDelete() keeps deleted record in the database');
  88. Table4Peer::enableSoftDelete();
  89. $this->assertEquals(1, Table4Peer::doCount(new Criteria()), 'doSoftDelete() marks deleted record as deleted');
  90. // softDelete with an object
  91. Table4Peer::doSoftDelete($t3);
  92. Table4Peer::disableSoftDelete();
  93. $this->assertEquals(3, Table4Peer::doCount(new Criteria()), 'doSoftDelete() keeps deleted record in the database');
  94. Table4Peer::enableSoftDelete();
  95. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doSoftDelete() marks deleted record as deleted');
  96. }
  97. public function testStaticDoDelete()
  98. {
  99. $t1 = new Table4();
  100. $t1->save();
  101. $t2 = new Table4();
  102. $t2->save();
  103. Table4Peer::disableSoftDelete();
  104. Table4Peer::doDelete($t1);
  105. Table4Peer::disableSoftDelete();
  106. $this->assertEquals(1, Table4Peer::doCount(new Criteria()), 'doDelete() calls doForceDelete() when soft delete is disabled');
  107. Table4Peer::enableSoftDelete();
  108. Table4Peer::doDelete($t2);
  109. Table4Peer::disableSoftDelete();
  110. $this->assertEquals(1, Table4Peer::doCount(new Criteria()), 'doDelete() calls doSoftDelete() when soft delete is enabled');
  111. Table4Peer::enableSoftDelete();
  112. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doDelete() calls doSoftDelete() when soft delete is enabled');
  113. }
  114. public function testStaticDoForceDeleteAll()
  115. {
  116. $t1 = new Table4();
  117. $t1->save();
  118. Table4Peer::doForceDeleteAll();
  119. Table4Peer::disableSoftDelete();
  120. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doForceDeleteAll() actually deletes records');
  121. }
  122. public function testStaticDoSoftDeleteAll()
  123. {
  124. $t1 = new Table4();
  125. $t1->save();
  126. $t2 = new Table4();
  127. $t2->save();
  128. Table4Peer::enableSoftDelete();
  129. Table4Peer::doSoftDeleteAll();
  130. Table4Peer::disableSoftDelete();
  131. $this->assertEquals(2, Table4Peer::doCount(new Criteria()), 'doSoftDeleteAll() keeps deleted record in the database');
  132. Table4Peer::enableSoftDelete();
  133. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doSoftDeleteAll() marks deleted record as deleted');
  134. }
  135. public function testStaticDoDeleteAll()
  136. {
  137. $t1 = new Table4();
  138. $t1->save();
  139. $t2 = new Table4();
  140. $t2->save();
  141. Table4Peer::disableSoftDelete();
  142. Table4Peer::doDeleteAll();
  143. Table4Peer::disableSoftDelete();
  144. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doDeleteAll() calls doForceDeleteAll() when soft delete is disabled');
  145. $t1 = new Table4();
  146. $t1->save();
  147. $t2 = new Table4();
  148. $t2->save();
  149. Table4Peer::enableSoftDelete();
  150. Table4Peer::doDeleteAll();
  151. Table4Peer::disableSoftDelete();
  152. $this->assertEquals(2, Table4Peer::doCount(new Criteria()), 'doDeleteAll() calls doSoftDeleteAll() when soft delete is disabled');
  153. Table4Peer::enableSoftDelete();
  154. $this->assertEquals(0, Table4Peer::doCount(new Criteria()), 'doDeleteAll() calls doSoftDeleteAll() when soft delete is disabled');
  155. }
  156. public function testSelect()
  157. {
  158. $t = new Table4();
  159. $t->setDeletedAt(123);
  160. $t->save();
  161. Table4Peer::enableSoftDelete();
  162. $this->assertEquals(0, Table4Peer::doCount(new Criteria), 'rows with a deleted_at date are hidden for select queries');
  163. Table4Peer::disableSoftDelete();
  164. $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'rows with a deleted_at date are visible for select queries once the static soft_delete is enabled');
  165. $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'Executing a select query enables the static soft delete again');
  166. }
  167. public function testDelete()
  168. {
  169. $t = new Table4();
  170. $t->save();
  171. $this->assertNull($t->getDeletedAt(), 'deleted_column is null by default');
  172. $t->delete();
  173. $this->assertNotNull($t->getDeletedAt(), 'deleted_column is not null after a soft delete');
  174. $this->assertEquals(0, Table4Peer::doCount(new Criteria), 'soft deleted rows are hidden for select queries');
  175. Table4Peer::disableSoftDelete();
  176. $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'soft deleted rows are still present in the database');
  177. }
  178. public function testDeleteUndeletable()
  179. {
  180. $t = new UndeletableTable4();
  181. $t->save();
  182. $t->delete();
  183. $this->assertNull($t->getDeletedAt(), 'soft_delete is not triggered for objects wit ha preDelete hook returning false');
  184. $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'soft_delete is not triggered for objects wit ha preDelete hook returning false');
  185. }
  186. public function testUnDelete()
  187. {
  188. $t = new Table4();
  189. $t->save();
  190. $t->delete();
  191. $t->undelete();
  192. $this->assertNull($t->getDeletedAt(), 'deleted_column is null again after an undelete');
  193. $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'undeleted rows are visible for select queries');
  194. }
  195. public function testForceDelete()
  196. {
  197. $t = new Table4();
  198. $t->save();
  199. $t->forceDelete();
  200. $this->assertTrue($t->isDeleted(), 'forceDelete() actually deletes a row');
  201. Table4Peer::disableSoftDelete();
  202. $this->assertEquals(0, Table4Peer::doCount(new Criteria), 'forced deleted rows are not present in the database');
  203. }
  204. public function testForceDeleteDoesNotDisableSoftDelete()
  205. {
  206. $t1 = new Table4();
  207. $t1->save();
  208. $t2 = new Table4();
  209. $t2->save();
  210. $t1->forceDelete();
  211. $t2->delete();
  212. $this->assertTrue($t1->isDeleted(), 'forceDelete() actually deletes a row');
  213. $this->assertFalse($t2->isDeleted(), 'forceDelete() does not affect further delete() calls');
  214. Table4Peer::disableSoftDelete();
  215. $this->assertEquals(1, Table4Peer::doCount(new Criteria), 'forced deleted rows are not present in the database');
  216. }
  217. public function testForceDeleteReEnablesSoftDelete()
  218. {
  219. $t = new Table4();
  220. $t->save();
  221. $t->forceDelete();
  222. $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'forceDelete() reenables soft delete');
  223. }
  224. public function testForceDeleteDoesNotReEnableSoftDeleteIfDisabled()
  225. {
  226. Table4Peer::disableSoftDelete();
  227. $t = new Table4();
  228. $t->save();
  229. $t->forceDelete();
  230. $this->assertFalse(Table4Peer::isSoftDeleteEnabled(), 'forceDelete() does not reenable soft delete if previously disabled');
  231. }
  232. public function testQueryIncludeDeleted()
  233. {
  234. $t = new Table4();
  235. $t->setDeletedAt(123);
  236. $t->save();
  237. Table4Peer::enableSoftDelete();
  238. $this->assertEquals(0, Table4Query::create()->count(), 'rows with a deleted_at date are hidden for select queries');
  239. $this->assertEquals(1, Table4Query::create()->includeDeleted()->count(), 'rows with a deleted_at date are visible for select queries using includeDeleted()');
  240. }
  241. public function testQueryForceDelete()
  242. {
  243. $t1 = new Table4();
  244. $t1->save();
  245. Table4Query::create()->filterById($t1->getId())->forceDelete();
  246. Table4Peer::disableSoftDelete();
  247. $this->assertEquals(0, Table4Query::create()->count(), 'forceDelete() actually deletes records');
  248. }
  249. public function testQuerySoftDelete()
  250. {
  251. $t1 = new Table4();
  252. $t1->save();
  253. $t2 = new Table4();
  254. $t2->save();
  255. $t3 = new Table4();
  256. $t3->save();
  257. Table4Query::create()
  258. ->filterById($t1->getId())
  259. ->softDelete();
  260. Table4Peer::disableSoftDelete();
  261. $this->assertEquals(3, Table4Query::create()->count(), 'softDelete() keeps deleted record in the database');
  262. Table4Peer::enableSoftDelete();
  263. $this->assertEquals(2, Table4Query::create()->count(), 'softDelete() marks deleted record as deleted');
  264. }
  265. public function testQueryDelete()
  266. {
  267. $t1 = new Table4();
  268. $t1->save();
  269. $t2 = new Table4();
  270. $t2->save();
  271. Table4Peer::disableSoftDelete();
  272. Table4Query::create()->filterById($t1->getId())->delete();
  273. Table4Peer::disableSoftDelete();
  274. $this->assertEquals(1, Table4Query::create()->count(), 'delete() calls forceDelete() when soft delete is disabled');
  275. Table4Peer::enableSoftDelete();
  276. Table4Query::create()->filterById($t2->getId())->delete();
  277. Table4Peer::disableSoftDelete();
  278. $this->assertEquals(1, Table4Query::create()->count(), 'delete() calls softDelete() when soft delete is enabled');
  279. Table4Peer::enableSoftDelete();
  280. $this->assertEquals(0, Table4Query::create()->count(), 'delete() calls softDelete() when soft delete is enabled');
  281. }
  282. public function testQueryForceDeleteAll()
  283. {
  284. $t1 = new Table4();
  285. $t1->save();
  286. Table4Query::create()->forceDeleteAll();
  287. Table4Peer::disableSoftDelete();
  288. $this->assertEquals(0, Table4Query::create()->count(), 'forceDeleteAll() actually deletes records');
  289. }
  290. public function testQuerySoftDeleteAll()
  291. {
  292. $t1 = new Table4();
  293. $t1->save();
  294. $t2 = new Table4();
  295. $t2->save();
  296. Table4Peer::enableSoftDelete();
  297. Table4Query::create()->softDelete();
  298. Table4Peer::disableSoftDelete();
  299. $this->assertEquals(2, Table4Query::create()->count(), 'softDelete() keeps deleted record in the database');
  300. Table4Peer::enableSoftDelete();
  301. $this->assertEquals(0, Table4Query::create()->count(), 'softDelete() marks deleted record as deleted');
  302. }
  303. public function testQueryDeleteAll()
  304. {
  305. $t1 = new Table4();
  306. $t1->save();
  307. $t2 = new Table4();
  308. $t2->save();
  309. Table4Peer::disableSoftDelete();
  310. Table4Query::create()->deleteAll();
  311. Table4Peer::disableSoftDelete();
  312. $this->assertEquals(0, Table4Query::create()->count(), 'deleteAll() calls forceDeleteAll() when soft delete is disabled');
  313. $t1 = new Table4();
  314. $t1->save();
  315. $t2 = new Table4();
  316. $t2->save();
  317. Table4Peer::enableSoftDelete();
  318. Table4Query::create()->deleteAll();
  319. Table4Peer::disableSoftDelete();
  320. $this->assertEquals(2, Table4Query::create()->count(), 'deleteAll() calls softDeleteAll() when soft delete is disabled');
  321. Table4Peer::enableSoftDelete();
  322. $this->assertEquals(0, Table4Query::create()->count(), 'deleteAll() calls softDeleteAll() when soft delete is disabled');
  323. }
  324. public function testQuerySelect()
  325. {
  326. $t = new Table4();
  327. $t->setDeletedAt(123);
  328. $t->save();
  329. Table4Peer::enableSoftDelete();
  330. $this->assertEquals(0, Table4Query::create()->count(), 'rows with a deleted_at date are hidden for select queries');
  331. Table4Peer::disableSoftDelete();
  332. $this->assertEquals(1, Table4Query::create()->count(), 'rows with a deleted_at date are visible for select queries once the static soft_delete is enabled');
  333. $this->assertTrue(Table4Peer::isSoftDeleteEnabled(), 'Executing a select query enables the static soft delete again');
  334. }
  335. public function testCustomization()
  336. {
  337. Table5Peer::disableSoftDelete();
  338. Table5Peer::doDeleteAll();
  339. Table5Peer::enableSoftDelete();
  340. $t = new Table5();
  341. $t->save();
  342. $this->assertNull($t->getDeletedOn(), 'deleted_column is null by default');
  343. $t->delete();
  344. $this->assertNotNull($t->getDeletedOn(), 'deleted_column is not null after a soft delete');
  345. $this->assertEquals(0, Table5Peer::doCount(new Criteria), 'soft deleted rows are hidden for select queries');
  346. Table5Peer::disableSoftDelete();
  347. $this->assertEquals(1, Table5Peer::doCount(new Criteria), 'soft deleted rows are still present in the database');
  348. }
  349. public function testPostDelete()
  350. {
  351. $t = new PostdeletehookedTable4();
  352. $t->setTitle('not post-deleted');
  353. $t->save();
  354. $this->assertNull($t->getDeletedAt(), 'deleted_column is null before a soft delete');
  355. $t->delete();
  356. $this->assertNotNull($t->getDeletedAt(), 'deleted_column is not null after a soft delete');
  357. $this->assertEquals('post-deleted', $t->getTitle(), 'postDelete hook did not set new title as expected');
  358. }
  359. }
  360. class UndeletableTable4 extends Table4
  361. {
  362. public function preDelete(PropelPDO $con = null)
  363. {
  364. parent::preDelete($con);
  365. $this->setTitle('foo');
  366. return false;
  367. }
  368. }
  369. class PostdeletehookedTable4 extends Table4
  370. {
  371. public function postDelete(PropelPDO $con = null)
  372. {
  373. parent::postDelete($con);
  374. $this->setTitle('post-deleted');
  375. $this->save($con);
  376. }
  377. }