ModelCallbackTest.php 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. include 'helpers/config.php';
  3. class ModelCallbackTest extends DatabaseTest
  4. {
  5. public function set_up($connection_name=null)
  6. {
  7. parent::set_up($connection_name);
  8. $this->venue = new Venue();
  9. $this->callback = Venue::table()->callback;
  10. }
  11. public function register_and_invoke_callbacks($callbacks, $return, $closure)
  12. {
  13. if (!is_array($callbacks))
  14. $callbacks = array($callbacks);
  15. $fired = array();
  16. foreach ($callbacks as $name)
  17. $this->callback->register($name,function($model) use (&$fired, $name, $return) { $fired[] = $name; return $return; });
  18. $closure($this->venue);
  19. return array_intersect($callbacks,$fired);
  20. }
  21. public function assert_fires($callbacks, $closure)
  22. {
  23. $executed = $this->register_and_invoke_callbacks($callbacks,true,$closure);
  24. $this->assert_equals(count($callbacks),count($executed));
  25. }
  26. public function assert_does_not_fire($callbacks, $closure)
  27. {
  28. $executed = $this->register_and_invoke_callbacks($callbacks,true,$closure);
  29. $this->assert_equals(0,count($executed));
  30. }
  31. public function assert_fires_returns_false($callbacks, $only_fire, $closure)
  32. {
  33. if (!is_array($only_fire))
  34. $only_fire = array($only_fire);
  35. $executed = $this->register_and_invoke_callbacks($callbacks,false,$closure);
  36. sort($only_fire);
  37. $intersect = array_intersect($only_fire,$executed);
  38. sort($intersect);
  39. $this->assert_equals($only_fire,$intersect);
  40. }
  41. public function test_after_construct_fires_by_default()
  42. {
  43. $this->assert_fires('after_construct',function($model) { new Venue(); });
  44. }
  45. public function test_fire_validation_callbacks_on_insert()
  46. {
  47. $this->assert_fires(array('before_validation','after_validation','before_validation_on_create','after_validation_on_create'),
  48. function($model) { $model = new Venue(); $model->save(); });
  49. }
  50. public function test_fire_validation_callbacks_on_update()
  51. {
  52. $this->assert_fires(array('before_validation','after_validation','before_validation_on_update','after_validation_on_update'),
  53. function($model) { $model = Venue::first(); $model->save(); });
  54. }
  55. public function test_validation_call_backs_not_fired_due_to_bypassing_validations()
  56. {
  57. $this->assert_does_not_fire('before_validation',function($model) { $model->save(false); });
  58. }
  59. public function test_before_validation_returning_false_cancels_callbacks()
  60. {
  61. $this->assert_fires_returns_false(array('before_validation','after_validation'),'before_validation',
  62. function($model) { $model->save(); });
  63. }
  64. public function test_fires_before_save_and_before_update_when_updating()
  65. {
  66. $this->assert_fires(array('before_save','before_update'),
  67. function($model) { $model = Venue::first(); $model->name = "something new"; $model->save(); });
  68. }
  69. public function test_before_save_returning_false_cancels_callbacks()
  70. {
  71. $this->assert_fires_returns_false(array('before_save','before_create'),'before_save',
  72. function($model) { $model = new Venue(); $model->save(); });
  73. }
  74. public function test_destroy()
  75. {
  76. $this->assert_fires(array('before_destroy','after_destroy'),
  77. function($model) { $model->delete(); });
  78. }
  79. }
  80. ?>