/application/libraries/php-activerecord/test/CallbackTest.php

https://github.com/ricardocasares/Cobros · PHP · 282 lines · 223 code · 46 blank · 13 comment · 1 complexity · 1455d82caa45f33104a40fef6e4be9db MD5 · raw file

  1. <?php
  2. include 'helpers/config.php';
  3. class CallBackTest extends DatabaseTest
  4. {
  5. public function set_up($connection_name=null)
  6. {
  7. parent::set_up($connection_name);
  8. // ensure VenueCB model has been loaded
  9. VenueCB::find(1);
  10. $this->callback = new ActiveRecord\CallBack('VenueCB');
  11. }
  12. public function assert_has_callback($callback_name, $method_name=null)
  13. {
  14. if (!$method_name)
  15. $method_name = $callback_name;
  16. $this->assert_true(in_array($method_name,$this->callback->get_callbacks($callback_name)));
  17. }
  18. public function assert_implicit_save($first_method, $second_method)
  19. {
  20. $i_ran = array();
  21. $this->callback->register($first_method,function($model) use (&$i_ran, $first_method) { $i_ran[] = $first_method; });
  22. $this->callback->register($second_method,function($model) use (&$i_ran, $second_method) { $i_ran[] = $second_method; });
  23. $this->callback->invoke(null,$second_method);
  24. $this->assert_equals(array($first_method,$second_method),$i_ran);
  25. }
  26. public function test_generic_callback_was_auto_registered()
  27. {
  28. $this->assert_has_callback('after_construct');
  29. }
  30. public function test_register()
  31. {
  32. $this->callback->register('after_construct');
  33. $this->assert_has_callback('after_construct');
  34. }
  35. public function test_register_non_generic()
  36. {
  37. $this->callback->register('after_construct','non_generic_after_construct');
  38. $this->assert_has_callback('after_construct','non_generic_after_construct');
  39. }
  40. /**
  41. * @expectedException ActiveRecord\ActiveRecordException
  42. */
  43. public function test_register_invalid_callback()
  44. {
  45. $this->callback->register('invalid_callback');
  46. }
  47. /**
  48. * @expectedException ActiveRecord\ActiveRecordException
  49. */
  50. public function test_register_callback_with_undefined_method()
  51. {
  52. $this->callback->register('after_construct','do_not_define_me');
  53. }
  54. public function test_register_with_string_definition()
  55. {
  56. $this->callback->register('after_construct','after_construct');
  57. $this->assert_has_callback('after_construct');
  58. }
  59. public function test_register_with_closure()
  60. {
  61. $this->callback->register('after_construct',function($mode) { });
  62. }
  63. public function test_register_with_null_definition()
  64. {
  65. $this->callback->register('after_construct',null);
  66. $this->assert_has_callback('after_construct');
  67. }
  68. public function test_register_with_no_definition()
  69. {
  70. $this->callback->register('after_construct');
  71. $this->assert_has_callback('after_construct');
  72. }
  73. public function test_register_appends_to_registry()
  74. {
  75. $this->callback->register('after_construct');
  76. $this->callback->register('after_construct','non_generic_after_construct');
  77. $this->assert_equals(array('after_construct','after_construct','non_generic_after_construct'),$this->callback->get_callbacks('after_construct'));
  78. }
  79. public function test_register_prepends_to_registry()
  80. {
  81. $this->callback->register('after_construct');
  82. $this->callback->register('after_construct','non_generic_after_construct',array('prepend' => true));
  83. $this->assert_equals(array('non_generic_after_construct','after_construct','after_construct'),$this->callback->get_callbacks('after_construct'));
  84. }
  85. public function test_registers_via_static_array_definition()
  86. {
  87. $this->assert_has_callback('after_destroy','after_destroy_one');
  88. $this->assert_has_callback('after_destroy','after_destroy_two');
  89. }
  90. public function test_registers_via_static_string_definition()
  91. {
  92. $this->assert_has_callback('before_destroy','before_destroy_using_string');
  93. }
  94. /**
  95. * @expectedException ActiveRecord\ActiveRecordException
  96. */
  97. public function test_register_via_static_with_invalid_definition()
  98. {
  99. $class_name = "Venues_" . md5(uniqid());
  100. eval("class $class_name extends ActiveRecord\\Model { static \$table_name = 'venues'; static \$after_save = 'method_that_does_not_exist'; };");
  101. new $class_name();
  102. new ActiveRecord\CallBack($class_name);
  103. }
  104. public function test_can_register_same_multiple_times()
  105. {
  106. $this->callback->register('after_construct');
  107. $this->callback->register('after_construct');
  108. $this->assert_equals(array('after_construct','after_construct','after_construct'),$this->callback->get_callbacks('after_construct'));
  109. }
  110. public function test_register_closure_callback()
  111. {
  112. $closure = function($model) {};
  113. $this->callback->register('after_save',$closure);
  114. $this->assert_equals(array($closure),$this->callback->get_callbacks('after_save'));
  115. }
  116. public function test_get_callbacks_returns_array()
  117. {
  118. $this->callback->register('after_construct');
  119. $this->assert_true(is_array($this->callback->get_callbacks('after_construct')));
  120. }
  121. public function test_get_callbacks_returns_null()
  122. {
  123. $this->assert_null($this->callback->get_callbacks('this_callback_name_should_never_exist'));
  124. }
  125. public function test_invoke_runs_all_callbacks()
  126. {
  127. $mock = $this->get_mock('VenueCB',array('after_destroy_one','after_destroy_two'));
  128. $mock->expects($this->once())->method('after_destroy_one');
  129. $mock->expects($this->once())->method('after_destroy_two');
  130. $this->callback->invoke($mock,'after_destroy');
  131. }
  132. public function test_invoke_closure()
  133. {
  134. $i_ran = false;
  135. $this->callback->register('after_validation',function($model) use (&$i_ran) { $i_ran = true; });
  136. $this->callback->invoke(null,'after_validation');
  137. $this->assert_true($i_ran);
  138. }
  139. public function test_invoke_implicitly_calls_save_first()
  140. {
  141. $this->assert_implicit_save('before_save','before_create');
  142. $this->assert_implicit_save('before_save','before_update');
  143. $this->assert_implicit_save('after_save','after_create');
  144. $this->assert_implicit_save('after_save','after_update');
  145. }
  146. /**
  147. * @expectedException ActiveRecord\ActiveRecordException
  148. */
  149. public function test_invoke_unregistered_callback()
  150. {
  151. $mock = $this->get_mock('VenueCB',array());
  152. $this->callback->invoke($mock,'before_validation_on_create');
  153. }
  154. public function test_before_callbacks_pass_on_false_return_callback_returned_false()
  155. {
  156. $this->callback->register('before_validation',function($model) { return false; });
  157. $this->assert_false($this->callback->invoke(null,'before_validation'));
  158. }
  159. public function test_before_callbacks_does_not_pass_on_false_for_after_callbacks()
  160. {
  161. $this->callback->register('after_validation',function($model) { return false; });
  162. $this->assert_true($this->callback->invoke(null,'after_validation'));
  163. }
  164. public function test_gh_28_after_create_should_be_invoked_after_auto_incrementing_pk_is_set()
  165. {
  166. $that = $this;
  167. VenueCB::$after_create = function($model) use ($that) { $that->assert_not_null($model->id); };
  168. ActiveRecord\Table::clear_cache('VenueCB');
  169. $venue = VenueCB::find(1);
  170. $venue = new VenueCB($venue->attributes());
  171. $venue->id = null;
  172. $venue->name = 'alksdjfs';
  173. $venue->save();
  174. }
  175. public function test_before_create_returned_false_halts_execution()
  176. {
  177. VenueCB::$before_create = array('before_create_halt_execution');
  178. ActiveRecord\Table::clear_cache('VenueCB');
  179. $table = ActiveRecord\Table::load('VenueCB');
  180. $i_ran = false;
  181. $i_should_have_ran = false;
  182. $table->callback->register('before_save', function($model) use (&$i_should_have_ran) { $i_should_have_ran = true; });
  183. $table->callback->register('before_create',function($model) use (&$i_ran) { $i_ran = true; });
  184. $table->callback->register('after_create',function($model) use (&$i_ran) { $i_ran = true; });
  185. $v = VenueCB::find(1);
  186. $v->id = null;
  187. VenueCB::create($v->attributes());
  188. $this->assert_true($i_should_have_ran);
  189. $this->assert_false($i_ran);
  190. $this->assert_true(strpos(ActiveRecord\Table::load('VenueCB')->last_sql, 'INSERT') === false);
  191. }
  192. public function test_before_save_returned_false_halts_execution()
  193. {
  194. VenueCB::$before_update = array('before_update_halt_execution');
  195. ActiveRecord\Table::clear_cache('VenueCB');
  196. $table = ActiveRecord\Table::load('VenueCB');
  197. $i_ran = false;
  198. $i_should_have_ran = false;
  199. $table->callback->register('before_save', function($model) use (&$i_should_have_ran) { $i_should_have_ran = true; });
  200. $table->callback->register('before_update',function($model) use (&$i_ran) { $i_ran = true; });
  201. $table->callback->register('after_save',function($model) use (&$i_ran) { $i_ran = true; });
  202. $v = VenueCB::find(1);
  203. $v->name .= 'test';
  204. $ret = $v->save();
  205. $this->assert_true($i_should_have_ran);
  206. $this->assert_false($i_ran);
  207. $this->assert_false($ret);
  208. $this->assert_true(strpos(ActiveRecord\Table::load('VenueCB')->last_sql, 'UPDATE') === false);
  209. }
  210. public function test_before_destroy_returned_false_halts_execution()
  211. {
  212. VenueCB::$before_destroy = array('before_destroy_halt_execution');
  213. ActiveRecord\Table::clear_cache('VenueCB');
  214. $table = ActiveRecord\Table::load('VenueCB');
  215. $i_ran = false;
  216. $table->callback->register('before_destroy',function($model) use (&$i_ran) { $i_ran = true; });
  217. $table->callback->register('after_destroy',function($model) use (&$i_ran) { $i_ran = true; });
  218. $v = VenueCB::find(1);
  219. $ret = $v->delete();
  220. $this->assert_false($i_ran);
  221. $this->assert_false($ret);
  222. $this->assert_true(strpos(ActiveRecord\Table::load('VenueCB')->last_sql, 'DELETE') === false);
  223. }
  224. public function test_before_validation_returned_false_halts_execution()
  225. {
  226. VenueCB::$before_validation = array('before_validation_halt_execution');
  227. ActiveRecord\Table::clear_cache('VenueCB');
  228. $table = ActiveRecord\Table::load('VenueCB');
  229. $v = VenueCB::find(1);
  230. $v->name .= 'test';
  231. $ret = $v->save();
  232. $this->assert_false($ret);
  233. $this->assert_true(strpos(ActiveRecord\Table::load('VenueCB')->last_sql, 'UPDATE') === false);
  234. }
  235. };
  236. ?>