blob: 3280f5bd82c00b7d15c8cac2377727346a08ed5f [file] [log] [blame]
David Woodsf3ac71e2015-03-16 20:00:21 -07001<?php
2
3class Form_validation_test extends CI_TestCase {
David Woods64af3bb2015-03-18 10:09:26 -07004
5 public function set_up()
6 {
7 $_SERVER['REQUEST_METHOD'] = 'POST';
8
9 // Create a mock loader since load->helper() looks in the wrong directories for unit tests,
10 // We'll use CI_TestCase->helper() instead
Andrey Andreev878e23f2016-08-10 15:15:49 +030011 $loader = $this->getMockBuilder('CI_Loader')->setMethods(array('helper'))->getMock();
Andrey Andreev3e2045b2015-03-26 12:34:38 +020012
David Woods64af3bb2015-03-18 10:09:26 -070013 // Same applies for lang
Andrey Andreev878e23f2016-08-10 15:15:49 +030014 $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load'))->getMock();
David Woodsdc1ae6b2015-03-16 23:36:54 -070015
David Woods64af3bb2015-03-18 10:09:26 -070016 $this->ci_set_config('charset', 'UTF-8');
17 $utf8 = new Mock_Core_Utf8();
18 $security = new Mock_Core_Security();
19 $input = new Mock_Core_Input($security, $utf8);
David Woodsdc1ae6b2015-03-16 23:36:54 -070020
David Woods64af3bb2015-03-18 10:09:26 -070021 $this->ci_instance_var('lang', $lang);
22 $this->ci_instance_var('load', $loader);
23 $this->ci_instance_var('input', $input);
David Woodsdc1ae6b2015-03-16 23:36:54 -070024
David Woods64af3bb2015-03-18 10:09:26 -070025 $this->lang('form_validation');
26 $this->helper('form');
27
28 $this->form_validation = new CI_Form_validation();
29 }
30
Andrey Andreev7243d0b2016-03-12 11:40:34 +020031 public function test_empty_array_input()
32 {
33 $this->assertFalse(
34 $this->run_rules(
35 array(array('field' => 'foo', 'label' => 'Foo Label', 'rules' => 'required')),
36 array('foo' => array())
37 )
38 );
39 }
40
David Woods64af3bb2015-03-18 10:09:26 -070041 public function test_rule_required()
42 {
Andrey Andreev9e78be02016-05-25 10:54:36 +030043 $rules = array(array('field' => 'foo', 'label' => 'Foo', 'rules' => 'is_numeric'));
David Woods64af3bb2015-03-18 10:09:26 -070044
Andrey Andreev9e78be02016-05-25 10:54:36 +030045 // Empty, not required
46 $this->assertTrue($this->run_rules($rules, array('foo' => '')));
47
48
49 // Not required, but also not empty
50 $this->assertTrue($this->run_rules($rules, array('foo' => '123')));
51 $this->assertFalse($this->run_rules($rules, array('foo' => 'bar')));
52
53 // Required variations
54 $rules[0]['rules'] .= '|required';
55 $this->assertTrue($this->run_rules($rules, array('foo' => '123')));
David Woodscf776712015-03-22 15:55:16 -070056 $this->assertFalse($this->run_rules($rules, array('foo' => '')));
57 $this->assertFalse($this->run_rules($rules, array('foo' => ' ')));
Andrey Andreev9e78be02016-05-25 10:54:36 +030058 $this->assertFalse($this->run_rules($rules, array('foo' => 'bar')));
David Woods64af3bb2015-03-18 10:09:26 -070059 }
60
61 public function test_rule_matches()
Andrey Andreev3e2045b2015-03-26 12:34:38 +020062 {
David Woodscf776712015-03-22 15:55:16 -070063 $rules = array(
64 array('field' => 'foo', 'label' => 'label', 'rules' => 'required'),
Andrey Andreev3e2045b2015-03-26 12:34:38 +020065 array('field' => 'bar', 'label' => 'label2', 'rules' => 'matches[foo]')
66 );
David Woodscf776712015-03-22 15:55:16 -070067 $values_base = array('foo' => 'sample');
David Woods64af3bb2015-03-18 10:09:26 -070068
Andrey Andreev3e2045b2015-03-26 12:34:38 +020069 $this->assertTrue($this->run_rules($rules, array_merge($values_base, array('bar' => 'sample'))));
70
Andrey Andreev0fae6252016-05-17 13:46:55 +030071 $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => ''))));
Andrey Andreev3e2045b2015-03-26 12:34:38 +020072 $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => 'Sample'))));
73 $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => ' sample'))));
David Woods64af3bb2015-03-18 10:09:26 -070074 }
75
76 public function test_rule_differs()
Andrey Andreev3e2045b2015-03-26 12:34:38 +020077 {
David Woodscf776712015-03-22 15:55:16 -070078 $rules = array(
79 array('field' => 'foo', 'label' => 'label', 'rules' => 'required'),
Andrey Andreev3e2045b2015-03-26 12:34:38 +020080 array('field' => 'bar', 'label' => 'label2', 'rules' => 'differs[foo]')
81 );
David Woodscf776712015-03-22 15:55:16 -070082 $values_base = array('foo' => 'sample');
David Woods64af3bb2015-03-18 10:09:26 -070083
Andrey Andreev3e2045b2015-03-26 12:34:38 +020084 $this->assertTrue($this->run_rules($rules, array_merge($values_base, array('bar' => 'does_not_match'))));
85 $this->assertTrue($this->run_rules($rules, array_merge($values_base, array('bar' => 'Sample'))));
86 $this->assertTrue($this->run_rules($rules, array_merge($values_base, array('bar' => ' sample'))));
87
88 $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => 'sample'))));
David Woods64af3bb2015-03-18 10:09:26 -070089 }
90
91 public function test_rule_min_length()
Andrey Andreev3e2045b2015-03-26 12:34:38 +020092 {
David Woods317cad92015-03-20 22:32:24 -070093 $this->assertTrue($this->form_validation->min_length('12345', '5'));
Andrey Andreev3e2045b2015-03-26 12:34:38 +020094 $this->assertTrue($this->form_validation->min_length('test', '0'));
David Woods64af3bb2015-03-18 10:09:26 -070095
David Woods317cad92015-03-20 22:32:24 -070096 $this->assertFalse($this->form_validation->min_length('123', '4'));
97 $this->assertFalse($this->form_validation->min_length('should_fail', 'A'));
98 $this->assertFalse($this->form_validation->min_length('', '4'));
David Woods64af3bb2015-03-18 10:09:26 -070099 }
100
101 public function test_rule_max_length()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200102 {
David Woods317cad92015-03-20 22:32:24 -0700103 $this->assertTrue($this->form_validation->max_length('', '4'));
104 $this->assertTrue($this->form_validation->max_length('1234', '4'));
David Woods64af3bb2015-03-18 10:09:26 -0700105
David Woods317cad92015-03-20 22:32:24 -0700106 $this->assertFalse($this->form_validation->max_length('12345', '4'));
107 $this->assertFalse($this->form_validation->max_length('should_fail', 'A'));
David Woods64af3bb2015-03-18 10:09:26 -0700108 }
109
110 public function test_rule_exact_length()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200111 {
112 $this->assertTrue($this->form_validation->exact_length('1234', '4'));
David Woods64af3bb2015-03-18 10:09:26 -0700113
David Woods317cad92015-03-20 22:32:24 -0700114 $this->assertFalse($this->form_validation->exact_length('', '3'));
115 $this->assertFalse($this->form_validation->exact_length('12345', '4'));
116 $this->assertFalse($this->form_validation->exact_length('123', '4'));
117 $this->assertFalse($this->form_validation->exact_length('should_fail', 'A'));
David Woods64af3bb2015-03-18 10:09:26 -0700118 }
119
120 public function test_rule_greater_than()
121 {
David Woods317cad92015-03-20 22:32:24 -0700122 $this->assertTrue($this->form_validation->greater_than('-10', '-11'));
123 $this->assertTrue($this->form_validation->greater_than('10', '9'));
David Woods64af3bb2015-03-18 10:09:26 -0700124
David Woods317cad92015-03-20 22:32:24 -0700125 $this->assertFalse($this->form_validation->greater_than('10', '10'));
126 $this->assertFalse($this->form_validation->greater_than('10', 'a'));
127 $this->assertFalse($this->form_validation->greater_than('10a', '10'));
David Woods64af3bb2015-03-18 10:09:26 -0700128 }
129
130 public function test_rule_greater_than_equal_to()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200131 {
132 $this->assertTrue($this->form_validation->greater_than_equal_to('0', '0'));
David Woods317cad92015-03-20 22:32:24 -0700133 $this->assertTrue($this->form_validation->greater_than_equal_to('1', '0'));
David Woods64af3bb2015-03-18 10:09:26 -0700134
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200135 $this->assertFalse($this->form_validation->greater_than_equal_to('-1', '0'));
David Woods317cad92015-03-20 22:32:24 -0700136 $this->assertFalse($this->form_validation->greater_than_equal_to('10a', '0'));
David Woods64af3bb2015-03-18 10:09:26 -0700137 }
138
139 public function test_rule_less_than()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200140 {
David Woods317cad92015-03-20 22:32:24 -0700141 $this->assertTrue($this->form_validation->less_than('4', '5'));
142 $this->assertTrue($this->form_validation->less_than('-1', '0'));
David Woods64af3bb2015-03-18 10:09:26 -0700143
David Woods317cad92015-03-20 22:32:24 -0700144 $this->assertFalse($this->form_validation->less_than('4', '4'));
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200145 $this->assertFalse($this->form_validation->less_than('10a', '5'));
David Woods64af3bb2015-03-18 10:09:26 -0700146 }
147
148 public function test_rule_less_than_equal_to()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200149 {
David Woods317cad92015-03-20 22:32:24 -0700150 $this->assertTrue($this->form_validation->less_than_equal_to('-1', '0'));
151 $this->assertTrue($this->form_validation->less_than_equal_to('-1', '-1'));
152 $this->assertTrue($this->form_validation->less_than_equal_to('4', '4'));
David Woods64af3bb2015-03-18 10:09:26 -0700153
David Woods317cad92015-03-20 22:32:24 -0700154 $this->assertFalse($this->form_validation->less_than_equal_to('0', '-1'));
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200155 $this->assertFalse($this->form_validation->less_than_equal_to('10a', '0'));
David Woods64af3bb2015-03-18 10:09:26 -0700156 }
157
158 public function test_rule_in_list()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200159 {
David Woods317cad92015-03-20 22:32:24 -0700160 $this->assertTrue($this->form_validation->in_list('red', 'red,Blue,123'));
161 $this->assertTrue($this->form_validation->in_list('Blue', 'red,Blue,123'));
162 $this->assertTrue($this->form_validation->in_list('123', 'red,Blue,123'));
David Woods64af3bb2015-03-18 10:09:26 -0700163
David Woods317cad92015-03-20 22:32:24 -0700164 $this->assertFalse($this->form_validation->in_list('Red', 'red,Blue,123'));
165 $this->assertFalse($this->form_validation->in_list(' red', 'red,Blue,123'));
166 $this->assertFalse($this->form_validation->in_list('1234', 'red,Blue,123'));
David Woods64af3bb2015-03-18 10:09:26 -0700167 }
168
169 public function test_rule_alpha()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200170 {
David Woods317cad92015-03-20 22:32:24 -0700171 $this->assertTrue($this->form_validation->alpha('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ'));
David Woods64af3bb2015-03-18 10:09:26 -0700172
David Woods317cad92015-03-20 22:32:24 -0700173 $this->assertFalse($this->form_validation->alpha('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ '));
174 $this->assertFalse($this->form_validation->alpha('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ1'));
175 $this->assertFalse($this->form_validation->alpha('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ*'));
David Woods64af3bb2015-03-18 10:09:26 -0700176 }
177
178 public function test_rule_alpha_numeric()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200179 {
David Woods317cad92015-03-20 22:32:24 -0700180 $this->assertTrue($this->form_validation->alpha_numeric('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789'));
David Woods64af3bb2015-03-18 10:09:26 -0700181
David Woods317cad92015-03-20 22:32:24 -0700182 $this->assertFalse($this->form_validation->alpha_numeric('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789\ '));
183 $this->assertFalse($this->form_validation->alpha_numeric('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789_'));
David Woods64af3bb2015-03-18 10:09:26 -0700184 }
185
186 public function test_rule_alpha_numeric_spaces()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200187 {
David Woods317cad92015-03-20 22:32:24 -0700188 $this->assertTrue($this->form_validation->alpha_numeric_spaces(' abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789'));
David Woods64af3bb2015-03-18 10:09:26 -0700189
David Woods317cad92015-03-20 22:32:24 -0700190 $this->assertFalse($this->form_validation->alpha_numeric_spaces(' abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789_'));
David Woods64af3bb2015-03-18 10:09:26 -0700191 }
192
193 public function test_rule_alpha_dash()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200194 {
David Woods317cad92015-03-20 22:32:24 -0700195 $this->assertTrue($this->form_validation->alpha_dash('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789-_'));
David Woods64af3bb2015-03-18 10:09:26 -0700196
David Woods317cad92015-03-20 22:32:24 -0700197 $this->assertFalse($this->form_validation->alpha_dash('abcdefghijklmnopqrstuvwxyzABCDEFGHLIJKLMNOPQRSTUVWXYZ0123456789-_\ '));
David Woods64af3bb2015-03-18 10:09:26 -0700198 }
199
200 public function test_rule_numeric()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200201 {
David Woods317cad92015-03-20 22:32:24 -0700202 $this->assertTrue($this->form_validation->numeric('0'));
203 $this->assertTrue($this->form_validation->numeric('12314'));
204 $this->assertTrue($this->form_validation->numeric('-42'));
David Woods64af3bb2015-03-18 10:09:26 -0700205
David Woods317cad92015-03-20 22:32:24 -0700206 $this->assertFalse($this->form_validation->numeric('123a'));
207 $this->assertFalse($this->form_validation->numeric('--1'));
David Woods64af3bb2015-03-18 10:09:26 -0700208 }
209
210 public function test_rule_integer()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200211 {
David Woods317cad92015-03-20 22:32:24 -0700212 $this->assertTrue($this->form_validation->integer('0'));
213 $this->assertTrue($this->form_validation->integer('42'));
214 $this->assertTrue($this->form_validation->integer('-1'));
David Woods64af3bb2015-03-18 10:09:26 -0700215
David Woods317cad92015-03-20 22:32:24 -0700216 $this->assertFalse($this->form_validation->integer('124a'));
217 $this->assertFalse($this->form_validation->integer('1.9'));
218 $this->assertFalse($this->form_validation->integer('--1'));
David Woods64af3bb2015-03-18 10:09:26 -0700219 }
220
221 public function test_rule_decimal()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200222 {
David Woods317cad92015-03-20 22:32:24 -0700223 $this->assertTrue($this->form_validation->decimal('1.0'));
224 $this->assertTrue($this->form_validation->decimal('-0.98'));
David Woods64af3bb2015-03-18 10:09:26 -0700225
David Woods317cad92015-03-20 22:32:24 -0700226 $this->assertFalse($this->form_validation->decimal('0'));
227 $this->assertFalse($this->form_validation->decimal('1.0a'));
228 $this->assertFalse($this->form_validation->decimal('-i'));
229 $this->assertFalse($this->form_validation->decimal('--1'));
David Woods64af3bb2015-03-18 10:09:26 -0700230 }
231
232 public function test_rule_is_natural()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200233 {
David Woods317cad92015-03-20 22:32:24 -0700234 $this->assertTrue($this->form_validation->is_natural('0'));
235 $this->assertTrue($this->form_validation->is_natural('12'));
David Woods64af3bb2015-03-18 10:09:26 -0700236
David Woods317cad92015-03-20 22:32:24 -0700237 $this->assertFalse($this->form_validation->is_natural('42a'));
238 $this->assertFalse($this->form_validation->is_natural('-1'));
David Woods64af3bb2015-03-18 10:09:26 -0700239 }
240
241 public function test_rule_is_natural_no_zero()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200242 {
David Woods317cad92015-03-20 22:32:24 -0700243 $this->assertTrue($this->form_validation->is_natural_no_zero('42'));
David Woods64af3bb2015-03-18 10:09:26 -0700244
David Woods317cad92015-03-20 22:32:24 -0700245 $this->assertFalse($this->form_validation->is_natural_no_zero('0'));
246 $this->assertFalse($this->form_validation->is_natural_no_zero('42a'));
247 $this->assertFalse($this->form_validation->is_natural_no_zero('-1'));
David Woods64af3bb2015-03-18 10:09:26 -0700248 }
249
250 public function test_rule_valid_url()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200251 {
David Woods317cad92015-03-20 22:32:24 -0700252 $this->assertTrue($this->form_validation->valid_url('www.codeigniter.com'));
Andrey Andreev700dbad2016-01-11 12:51:46 +0200253 $this->assertTrue($this->form_validation->valid_url('http://codeigniter.com'));
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200254
Andrey Andreev391d3392016-01-30 22:43:41 +0200255 // https://bugs.php.net/bug.php?id=51192
256 $this->assertTrue($this->form_validation->valid_url('http://accept-dashes.tld'));
257 $this->assertFalse($this->form_validation->valid_url('http://reject_underscores.tld'));
258
259 // https://github.com/bcit-ci/CodeIgniter/issues/4415
260 $this->assertTrue($this->form_validation->valid_url('http://[::1]/ipv6'));
261
Andrey Andreev9180a122016-08-10 15:23:42 +0300262 // URI scheme case-sensitivity: https://github.com/bcit-ci/CodeIgniter/pull/4758
263 $this->assertTrue($this->form_validation->valid_url('HtTp://127.0.0.1/'));
264
David Woods317cad92015-03-20 22:32:24 -0700265 $this->assertFalse($this->form_validation->valid_url('htt://www.codeIgniter.com'));
266 $this->assertFalse($this->form_validation->valid_url(''));
267 $this->assertFalse($this->form_validation->valid_url('code igniter'));
David Woods64af3bb2015-03-18 10:09:26 -0700268 }
269
270 public function test_rule_valid_email()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200271 {
David Woods317cad92015-03-20 22:32:24 -0700272 $this->assertTrue($this->form_validation->valid_email('email@sample.com'));
Andrey Andreeved1a0452017-06-19 08:25:23 +0300273 $this->assertFalse($this->form_validation->valid_email('email@sample.com foo bar'));
David Woods317cad92015-03-20 22:32:24 -0700274 $this->assertFalse($this->form_validation->valid_email('valid_email', '@sample.com'));
David Woods64af3bb2015-03-18 10:09:26 -0700275 }
276
277 public function test_rule_valid_emails()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200278 {
David Woods317cad92015-03-20 22:32:24 -0700279 $this->assertTrue($this->form_validation->valid_emails('1@sample.com,2@sample.com'));
280 $this->assertTrue($this->form_validation->valid_emails('email@sample.com'));
David Woods64af3bb2015-03-18 10:09:26 -0700281
David Woods5bc1dc52015-03-27 22:41:58 -0700282 $this->assertFalse($this->form_validation->valid_emails('valid_email', '@sample.com'));
David Woods317cad92015-03-20 22:32:24 -0700283 $this->assertFalse($this->form_validation->valid_emails('@sample.com,2@sample.com,validemail@email.ca'));
David Woods64af3bb2015-03-18 10:09:26 -0700284 }
285
286 public function test_rule_valid_ip()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200287 {
David Woods317cad92015-03-20 22:32:24 -0700288 $this->assertTrue($this->form_validation->valid_ip('127.0.0.1'));
289 $this->assertTrue($this->form_validation->valid_ip('127.0.0.1', 'ipv4'));
290 $this->assertTrue($this->form_validation->valid_ip('2001:0db8:85a3:0000:0000:8a2e:0370:7334'));
291 $this->assertTrue($this->form_validation->valid_ip('2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'ipv6'));
David Woods64af3bb2015-03-18 10:09:26 -0700292
David Woods317cad92015-03-20 22:32:24 -0700293 $this->assertFalse($this->form_validation->valid_ip('2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'ipv4'));
294 $this->assertFalse($this->form_validation->valid_ip('127.0.0.1', 'ipv6'));
295 $this->assertFalse($this->form_validation->valid_ip('H001:0db8:85a3:0000:0000:8a2e:0370:7334'));
296 $this->assertFalse($this->form_validation->valid_ip('127.0.0.259'));
David Woods64af3bb2015-03-18 10:09:26 -0700297 }
298
299 public function test_rule_valid_base64()
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200300 {
David Woods317cad92015-03-20 22:32:24 -0700301 $this->assertTrue($this->form_validation->valid_base64(base64_encode('string')));
David Woods5b884732015-03-18 10:37:35 -0700302
David Woods317cad92015-03-20 22:32:24 -0700303 $this->assertFalse($this->form_validation->valid_base64('FA08GG'));
304 }
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200305
David Woods317cad92015-03-20 22:32:24 -0700306 public function test_set_data()
307 {
David Woods317cad92015-03-20 22:32:24 -0700308 $data = array('field' => 'some_data');
309 $this->form_validation->set_data($data);
310 $this->form_validation->set_rules('field', 'label', 'required');
311 $this->assertTrue($this->form_validation->run());
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200312
David Woods317cad92015-03-20 22:32:24 -0700313 // Test with empty array
314 $_POST = array();
David Woods317cad92015-03-20 22:32:24 -0700315 $this->form_validation->reset_validation();
David Woodscf776712015-03-22 15:55:16 -0700316 $data = array('field' => 'some_data');
David Woods317cad92015-03-20 22:32:24 -0700317 $this->form_validation->set_data($data);
David Woodscf776712015-03-22 15:55:16 -0700318 // This should do nothing. Old data will still be used
319 $this->form_validation->set_data(array());
David Woods317cad92015-03-20 22:32:24 -0700320 $this->form_validation->set_rules('field', 'label', 'required');
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200321 $this->assertTrue($this->form_validation->run());
David Woods317cad92015-03-20 22:32:24 -0700322 }
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200323
David Woods317cad92015-03-20 22:32:24 -0700324 public function test_set_message()
325 {
David Woods317cad92015-03-20 22:32:24 -0700326 $err_message = 'What a terrible error!';
327 $rules = array(
328 array(
329 'field' => 'req_field',
330 'label' => 'label',
331 'rules' => 'required'
332 )
333 );
334 $errorless_data = array('req_field' => 'some text');
335 $erroneous_data = array('req_field' => '');
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200336
David Woods317cad92015-03-20 22:32:24 -0700337 $this->form_validation->set_message('required', $err_message);
338 $this->form_validation->set_data($erroneous_data);
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200339 $this->form_validation->set_rules($rules);
David Woods317cad92015-03-20 22:32:24 -0700340 $this->form_validation->run();
David Woodsc6ac5592015-03-31 20:19:39 -0700341 $this->assertEquals('<p>'.$err_message.'</p>', $this->form_validation->error('req_field'));
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200342
David Woods317cad92015-03-20 22:32:24 -0700343 $this->form_validation->reset_validation();
344 $this->form_validation->set_message('required', $err_message);
345 $this->form_validation->set_data($errorless_data);
346 $this->form_validation->set_rules($rules);
347 $this->form_validation->run();
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200348 $this->assertEquals('', $this->form_validation->error('req_field'));
David Woods64af3bb2015-03-18 10:09:26 -0700349 }
350
David Woods5bc1dc52015-03-27 22:41:58 -0700351 public function test_set_error_delimiters()
352 {
David Woods5bc1dc52015-03-27 22:41:58 -0700353 $prefix = '<div class="error">';
354 $suffix = '</div>';
355 $this->form_validation->set_error_delimiters($prefix, $suffix);
356 $this->form_validation->set_rules('foo', 'label', 'required');
357 $_POST = array('foo' => '');
358 $this->form_validation->run();
359 $error_msg = $this->form_validation->error('foo');
360
Andrey Andreev20d9b0a2017-12-20 19:57:39 +0200361 $this->assertStringStartsWith($prefix, $error_msg);
David Woods5bc1dc52015-03-27 22:41:58 -0700362 $this->assertTrue(strrpos($error_msg, $suffix, -strlen($suffix)) === (strlen($error_msg) - strlen($suffix)));
Andrey Andreevc54fd912017-10-12 12:56:09 +0300363
364 $_POST = array();
David Woods5bc1dc52015-03-27 22:41:58 -0700365 }
366
367 public function test_error_array()
368 {
David Woods5bc1dc52015-03-27 22:41:58 -0700369 $error_message = 'What a terrible error!';
370 $this->form_validation->set_message('required', $error_message);
371 $this->form_validation->set_rules('foo', 'label', 'required');
372 $_POST = array('foo' => '');
373 $this->form_validation->run();
David Woodsc6ac5592015-03-31 20:19:39 -0700374 $error_array = $this->form_validation->error_array();
375 $this->assertEquals($error_message, $error_array['foo']);
Andrey Andreevc54fd912017-10-12 12:56:09 +0300376
377 $_POST = array();
David Woods5bc1dc52015-03-27 22:41:58 -0700378 }
379
380 public function test_error_string()
381 {
David Woods5bc1dc52015-03-27 22:41:58 -0700382 $error_message = 'What a terrible error!';
383 $prefix_default = '<foo>';
384 $suffix_default = '</foo>';
385 $prefix_test = '<bar>';
386 $suffix_test = '</bar>';
387 $this->form_validation->set_error_delimiters($prefix_default, $suffix_default);
388 $this->form_validation->set_message('required', $error_message);
389 $this->form_validation->set_rules('foo', 'label', 'required');
390 $_POST = array('foo' => '');
391 $this->form_validation->run();
392
David Woodsc6ac5592015-03-31 20:19:39 -0700393 $this->assertEquals($prefix_default.$error_message.$suffix_default."\n", $this->form_validation->error_string());
394 $this->assertEquals($prefix_test.$error_message.$suffix_default."\n", $this->form_validation->error_string($prefix_test, ''));
395 $this->assertEquals($prefix_default.$error_message.$suffix_test."\n", $this->form_validation->error_string('', $suffix_test));
396 $this->assertEquals($prefix_test.$error_message.$suffix_test."\n", $this->form_validation->error_string($prefix_test, $suffix_test));
397
David Woods5bc1dc52015-03-27 22:41:58 -0700398 $this->form_validation->reset_validation();
399 $this->form_validation->set_rules('foo', 'label', 'required');
400 $_POST = array('foo' => 'bar');
401 $this->form_validation->run();
David Woodsc6ac5592015-03-31 20:19:39 -0700402 $this->assertEquals('', $this->form_validation->error_string());
Andrey Andreevc54fd912017-10-12 12:56:09 +0300403
404 $_POST = array();
David Woods5bc1dc52015-03-27 22:41:58 -0700405 }
406
407 public function test_run()
408 {
409 // form_validation->run() is tested in many of the other unit tests
410 // This test will only test run(group='') when group is not empty
411 $config = array(
412 'pass' => array(
413 array(
414 'field' => 'username',
415 'label' => 'user',
416 'rules' => 'alpha_numeric'
417 )
418 ),
419 'fail' => array(
420 array(
421 'field' => 'username',
422 'label' => 'user',
423 'rules' => 'alpha'
424 )
425 )
426 );
427 $_POST = array('username' => 'foo42');
428 $form_validation = new CI_Form_validation($config);
429 $this->assertTrue($form_validation->run('pass'));
David Woodsc6ac5592015-03-31 20:19:39 -0700430
431 $form_validation = new CI_Form_validation($config);
David Woods5bc1dc52015-03-27 22:41:58 -0700432 $this->assertFalse($form_validation->run('fail'));
Andrey Andreevc54fd912017-10-12 12:56:09 +0300433
434 $_POST = array();
David Woods5bc1dc52015-03-27 22:41:58 -0700435 }
David Woodsc6ac5592015-03-31 20:19:39 -0700436
David Woods5bc1dc52015-03-27 22:41:58 -0700437 public function test_has_rule()
438 {
David Woods5bc1dc52015-03-27 22:41:58 -0700439 $this->form_validation->set_rules('foo', 'label', 'required');
David Woodsc6ac5592015-03-31 20:19:39 -0700440
David Woods5bc1dc52015-03-27 22:41:58 -0700441 $this->assertTrue($this->form_validation->has_rule('foo'));
442 $this->assertFalse($this->form_validation->has_rule('bar'));
443 }
David Woodsc6ac5592015-03-31 20:19:39 -0700444
David Woods5bc1dc52015-03-27 22:41:58 -0700445 public function test_set_value()
446 {
David Woods5bc1dc52015-03-27 22:41:58 -0700447 $default = 'default';
448 $this->form_validation->set_rules('foo', 'label', 'required');
449 $this->form_validation->set_rules('bar[]', 'label', 'required');
David Woodsc6ac5592015-03-31 20:19:39 -0700450
David Woods5bc1dc52015-03-27 22:41:58 -0700451 // No post data yet: should return the default value provided
452 $this->assertEquals($default, $this->form_validation->set_value('foo', $default));
453 $_POST = array('foo' => 'foo', 'bar' => array('bar1', 'bar2'));
454 $this->form_validation->run();
455 $this->assertEquals('foo', $this->form_validation->set_value('foo', $default));
456 $this->assertEquals('bar1', $this->form_validation->set_value('bar[]', $default));
457 $this->assertEquals('bar2', $this->form_validation->set_value('bar[]', $default));
Andrey Andreevc54fd912017-10-12 12:56:09 +0300458
459 $_POST = array();
David Woods5bc1dc52015-03-27 22:41:58 -0700460 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300461
David Woods4b02f1d2015-03-29 22:46:14 -0700462 public function test_set_select()
463 {
464 // Test 1: No options selected
David Woods4b02f1d2015-03-29 22:46:14 -0700465 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300466
467 $this->assertEquals('', $this->form_validation->set_select('select', 'foo'));
David Woods4b02f1d2015-03-29 22:46:14 -0700468 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select', 'bar', TRUE));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300469
David Woods4b02f1d2015-03-29 22:46:14 -0700470 // Test 2: 1 option selected
471 $this->form_validation->reset_validation();
472 $this->form_validation->set_rules('select', 'label', 'alpha_numeric');
473 $_POST = array('select' => 'foo');
474 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300475
David Woods4b02f1d2015-03-29 22:46:14 -0700476 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select', 'foo'));
477 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select', 'foo', TRUE));
478 $this->assertEquals('', $this->form_validation->set_select('select', 'bar'));
479 $this->assertEquals('', $this->form_validation->set_select('select', 'bar', TRUE));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300480
David Woods4b02f1d2015-03-29 22:46:14 -0700481 // Test 3: Multiple options selected
482 $this->form_validation->reset_validation();
David Woods29704f82015-03-30 10:37:57 -0700483 $this->form_validation->set_rules('select[]', 'label', 'alpha_numeric');
David Woods4b02f1d2015-03-29 22:46:14 -0700484 $_POST = array('select' => array('foo', 'bar'));
485 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300486
David Woods29704f82015-03-30 10:37:57 -0700487 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select[]', 'foo'));
488 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select[]', 'foo', TRUE));
489 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select[]', 'bar'));
490 $this->assertEquals(' selected="selected"', $this->form_validation->set_select('select[]', 'bar', TRUE));
491 $this->assertEquals('', $this->form_validation->set_select('select[]', 'foobar'));
492 $this->assertEquals('', $this->form_validation->set_select('select[]', 'foobar', TRUE));
Andrey Andreevc54fd912017-10-12 12:56:09 +0300493
494 $_POST = array();
David Woods4b02f1d2015-03-29 22:46:14 -0700495 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300496
David Woods4b02f1d2015-03-29 22:46:14 -0700497 public function test_set_radio()
498 {
499 // Test 1: No options selected
David Woods4b02f1d2015-03-29 22:46:14 -0700500 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300501
David Woods4b02f1d2015-03-29 22:46:14 -0700502 $this->assertEquals('', $this->form_validation->set_radio('select', 'foo'));
David Woods29704f82015-03-30 10:37:57 -0700503 // Default should only work when no rules are set
David Woods4b02f1d2015-03-29 22:46:14 -0700504 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select', 'bar', TRUE));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300505
David Woods4b02f1d2015-03-29 22:46:14 -0700506 // Test 2: 1 option selected
507 $this->form_validation->reset_validation();
508 $this->form_validation->set_rules('select', 'label', 'alpha_numeric');
509 $_POST = array('select' => 'foo');
510 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300511
David Woods4b02f1d2015-03-29 22:46:14 -0700512 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select', 'foo'));
513 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select', 'foo', TRUE));
514 $this->assertEquals('', $this->form_validation->set_radio('select', 'bar'));
515 $this->assertEquals('', $this->form_validation->set_radio('select', 'bar', TRUE));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300516
David Woods4b02f1d2015-03-29 22:46:14 -0700517 // Test 3: Multiple options checked
518 $this->form_validation->reset_validation();
David Woods29704f82015-03-30 10:37:57 -0700519 $this->form_validation->set_rules('select[]', 'label', 'alpha_numeric');
David Woods4b02f1d2015-03-29 22:46:14 -0700520 $_POST = array('select' => array('foo', 'bar'));
521 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300522
David Woods29704f82015-03-30 10:37:57 -0700523 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select[]', 'foo'));
524 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select[]', 'foo', TRUE));
525 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select[]', 'bar'));
526 $this->assertEquals(' checked="checked"', $this->form_validation->set_radio('select[]', 'bar', TRUE));
527 $this->assertEquals('', $this->form_validation->set_radio('select[]', 'foobar'));
528 $this->assertEquals('', $this->form_validation->set_radio('select[]', 'foobar', TRUE));
Andrey Andreevc54fd912017-10-12 12:56:09 +0300529
530 $_POST = array();
David Woods4b02f1d2015-03-29 22:46:14 -0700531 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300532
David Woods4b02f1d2015-03-29 22:46:14 -0700533 public function test_set_checkbox()
534 {
535 // Test 1: No options selected
David Woods4b02f1d2015-03-29 22:46:14 -0700536 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300537
538 $this->assertEquals('', $this->form_validation->set_checkbox('select', 'foo'));
David Woods4b02f1d2015-03-29 22:46:14 -0700539 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select', 'bar', TRUE));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300540
David Woods4b02f1d2015-03-29 22:46:14 -0700541 // Test 2: 1 option selected
542 $this->form_validation->reset_validation();
543 $this->form_validation->set_rules('select', 'label', 'alpha_numeric');
544 $_POST = array('select' => 'foo');
545 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300546
David Woods4b02f1d2015-03-29 22:46:14 -0700547 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select', 'foo'));
548 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select', 'foo', TRUE));
549 $this->assertEquals('', $this->form_validation->set_checkbox('select', 'bar'));
550 $this->assertEquals('', $this->form_validation->set_checkbox('select', 'bar', TRUE));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300551
David Woods4b02f1d2015-03-29 22:46:14 -0700552 // Test 3: Multiple options selected
553 $this->form_validation->reset_validation();
David Woods29704f82015-03-30 10:37:57 -0700554 $this->form_validation->set_rules('select[]', 'label', 'alpha_numeric');
David Woods4b02f1d2015-03-29 22:46:14 -0700555 $_POST = array('select' => array('foo', 'bar'));
556 $this->form_validation->run();
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300557
David Woods29704f82015-03-30 10:37:57 -0700558 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select[]', 'foo'));
559 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select[]', 'foo', TRUE));
560 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select[]', 'bar'));
561 $this->assertEquals(' checked="checked"', $this->form_validation->set_checkbox('select[]', 'bar', TRUE));
562 $this->assertEquals('', $this->form_validation->set_checkbox('select[]', 'foobar'));
563 $this->assertEquals('', $this->form_validation->set_checkbox('select[]', 'foobar', TRUE));
Andrey Andreevc54fd912017-10-12 12:56:09 +0300564
565 $_POST = array();
David Woods4b02f1d2015-03-29 22:46:14 -0700566 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300567
David Woods4b02f1d2015-03-29 22:46:14 -0700568 public function test_regex_match()
569 {
570 $regex = '/f[a-zA-Z]+/';
571 $this->assertTrue($this->form_validation->regex_match('foo', $regex));
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300572 $this->assertFalse($this->form_validation->regex_match('bar', $regex));
David Woods4b02f1d2015-03-29 22:46:14 -0700573 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300574
David Woods4b02f1d2015-03-29 22:46:14 -0700575 public function test_prep_for_form()
576 {
577 $this->form_validation->reset_validation();
David Woodsc6ac5592015-03-31 20:19:39 -0700578 $error_msg_unprepped = '<error =\'foobar\'">';
579 $error_msg_prepped = '&lt;error =&#39;foobar&#39;&quot;&gt;';
580 $this->form_validation->set_rules('foo', 'label', 'required', array('required' => $error_msg_unprepped));
David Woods4b02f1d2015-03-29 22:46:14 -0700581 $_POST = array('foo' => '');
582 $this->form_validation->run();
David Woodsc6ac5592015-03-31 20:19:39 -0700583 $error_arr = $this->form_validation->error_array();
584
David Woods4b02f1d2015-03-29 22:46:14 -0700585 $this->assertEquals('', $this->form_validation->prep_for_form(''));
David Woodsc6ac5592015-03-31 20:19:39 -0700586 $this->assertEquals(array('foo' => $error_msg_prepped), $this->form_validation->prep_for_form($error_arr));
David Woods4b02f1d2015-03-29 22:46:14 -0700587 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300588
David Woods4b02f1d2015-03-29 22:46:14 -0700589 public function test_prep_url()
590 {
591 $this->assertEquals('', $this->form_validation->prep_url(''));
592 $this->assertEquals('http://codeigniter.com', $this->form_validation->prep_url('codeigniter.com'));
593 $this->assertEquals('https://codeigniter.com', $this->form_validation->prep_url('https://codeigniter.com'));
594 $this->assertEquals('http://codeigniter.com', $this->form_validation->prep_url('http://codeigniter.com'));
595 $this->assertEquals('http://www.codeigniter.com', $this->form_validation->prep_url('www.codeigniter.com'));
596 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300597
David Woods4b02f1d2015-03-29 22:46:14 -0700598 public function test_encode_php_tags()
599 {
600 $this->assertEquals("&lt;?php", $this->form_validation->encode_php_tags('<?php'));
601 $this->assertEquals('?&gt;', $this->form_validation->encode_php_tags('?>'));
602 }
Andrey Andreev2e9ae002015-04-01 14:45:16 +0300603
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200604 /**
605 * Run rules
606 *
607 * Helper method to set rules and run them at once, not
608 * an actual test case.
609 */
David Woodscf776712015-03-22 15:55:16 -0700610 public function run_rules($rules, $values)
David Woods64af3bb2015-03-18 10:09:26 -0700611 {
David Woods64af3bb2015-03-18 10:09:26 -0700612 $this->form_validation->reset_validation();
David Woodscf776712015-03-22 15:55:16 -0700613 $_POST = array();
David Woodscf776712015-03-22 15:55:16 -0700614 $this->form_validation->set_rules($rules);
Andrey Andreevc54fd912017-10-12 12:56:09 +0300615
David Woodscf776712015-03-22 15:55:16 -0700616 foreach ($values as $field => $value)
617 {
618 $_POST[$field] = $value;
619 }
Andrey Andreev3e2045b2015-03-26 12:34:38 +0200620
Andrey Andreevc54fd912017-10-12 12:56:09 +0300621 $valid = $this->form_validation->run();
622 $_POST = array();
623
624 return $valid;
David Woods64af3bb2015-03-18 10:09:26 -0700625 }
David Woodsf3ac71e2015-03-16 20:00:21 -0700626}