a tiny mvc framework for php using php-activerecord
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?>