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