3 * Ethna_UrlHandler_Test.php
7 * Ethna_UrlHandlerクラスのテストケース
11 class Ethna_UrlHandler_Test extends Ethna_UnitTestBase
17 $this->url_handler =& new Ethna_UrlHandler_TestClass($this);
21 var $_simple_map = array(
22 'entrypoint' => array(
23 'test_foo_bar' => array(
25 'path_regexp' => false,
33 var $_complex_map = array(
34 'entrypoint' => array(
35 'test_foo_bar' => array(
37 'path_regexp' => array(
38 'dummy_index1' => '|foo/bar/([^/]*)$|',
39 'dummy_index2' => '|foo/bar/([^/]*)/([^/]*)$|',
42 'dummy_index1' => array(
45 'dummy_index2' => array(
55 // {{{ $_prefix_suffix_map
56 var $_prefix_suffix_map = array(
57 'entrypoint' => array(
58 'test_foo_bar' => array(
60 'path_regexp' => '|foo/bar/(.*)$|',
63 'url_prefix' => 'URL-',
64 'url_suffix' => '-URL',
65 'form_prefix' => 'FORM-',
66 'form_suffix' => '-FORM',
74 // {{{ test_requestToAction_simple
75 function test_requestToAction_simple()
77 // pathinfo から action 取得
79 '__url_handler__' => 'entrypoint', // not empty
80 '__url_info__' => '/foo/bar', // null or not empty
84 $this->url_handler->action_map = $this->_simple_map;
85 $injected = $this->url_handler->requestToAction($http_vars);
88 $diff = array_diff($injected, $http_vars);
89 $this->assertEqual(count($diff), 1);
90 $this->assertEqual($diff['action_test_foo_bar'], true);
92 // action を受け取る以外の変化がないことを確認
93 $diff = array_diff($http_vars, $injected);
94 $this->assertEqual(count($diff), 0);
98 $this->url_handler->action_map = $this->_complex_map;
99 $injected = $this->url_handler->requestToAction($http_vars);
101 $diff = array_diff($injected, $http_vars);
102 $this->assertEqual(count($diff), 1);
103 $this->assertEqual($diff['action_test_foo_bar'], true);
108 // {{{ test_requestToAction_nopathinfo
109 function test_requestToAction_nopathinfo()
113 '__url_handler__' => 'entrypoint',
114 '__url_info__' => null,
117 $this->url_handler->action_map = $this->_complex_map;
118 $injected = $this->url_handler->requestToAction($http_vars);
121 $diff = array_diff($injected, $http_vars);
122 $this->assertEqual(count($diff), 0);
126 // {{{ test_requestToAction_withparams1
127 function test_requestToAction_withparams1()
129 // pathinfo から action とパラメータを受け取る
131 '__url_handler__' => 'entrypoint',
132 '__url_info__' => '/foo/bar/aaa',
135 // 一致する action_map がない: エラーとして array() を返す
136 $this->url_handler->action_map = $this->_simple_map;
137 $injected = $this->url_handler->requestToAction($http_vars);
138 $this->assertEqual(count($injected), 0);
141 // action とパラメータ param1 を受け取る
142 $this->url_handler->action_map = $this->_complex_map;
143 $injected = $this->url_handler->requestToAction($http_vars);
145 $diff = array_diff($injected, $http_vars);
146 $this->assertEqual(count($diff), 2);
147 $this->assertEqual($diff['action_test_foo_bar'], true);
148 $this->assertEqual($diff['param1'], 'aaa');
152 // {{{ test_requestToAction_withparams2
153 function test_requestToAction_withparams2()
155 // pathinfo から action と複数のパラメータを受け取る
157 '__url_handler__' => 'entrypoint',
158 '__url_info__' => '/foo/bar/aaa/bbb',
161 $this->url_handler->action_map = $this->_complex_map;
162 $injected = $this->url_handler->requestToAction($http_vars);
164 $diff = array_diff($injected, $http_vars);
165 $this->assertEqual(count($diff), 3);
166 $this->assertEqual($diff['action_test_foo_bar'], true);
167 $this->assertEqual($diff['param1'], 'aaa');
168 $this->assertEqual($diff['param2'], 'bbb');
172 // {{{ test_requestToAction_withparams3
173 function test_requestToAction_withparams3()
175 // 定義された以上のパラメータがある場合
177 '__url_handler__' => 'entrypoint',
178 '__url_info__' => '/foo/bar/aaa/bbb/ccc',
181 $this->url_handler->action_map = $this->_complex_map;
182 $injected = $this->url_handler->requestToAction($http_vars);
183 $this->assertEqual(count($injected), 0);
187 // {{{ test_requestToAction_misc
188 function test_requestToAction_misc()
190 // 微妙な pathinfo のチェック
192 '__url_handler__' => 'entrypoint',
194 $this->url_handler->action_map = $this->_complex_map;
196 // 余分な slash が前後についている
197 $http_vars['__url_info__'] = '///foo///bar///value1///';
198 $injected = $this->url_handler->requestToAction($http_vars);
199 $diff = array_diff($injected, $http_vars);
200 $this->assertEqual($diff['action_test_foo_bar'], true);
201 $this->assertEqual($diff['param1'], 'value1');
202 $this->assertFalse(isset($diff['param2']));
205 $http_vars['__url_info__'] = '/foo/bar/./value1';
206 $injected = $this->url_handler->requestToAction($http_vars);
207 $diff = array_diff($injected, $http_vars);
208 $this->assertEqual($diff['action_test_foo_bar'], true);
209 $this->assertEqual($diff['param1'], '.');
210 $this->assertEqual($diff['param2'], 'value1');
213 $http_vars['__url_info__'] = '/foo/bar/../baz';
214 $injected = $this->url_handler->requestToAction($http_vars);
215 $diff = array_diff($injected, $http_vars);
216 $this->assertEqual($diff['action_test_foo_bar'], true);
217 $this->assertEqual($diff['param1'], '..');
218 $this->assertEqual($diff['param2'], 'baz');
221 $http_vars['__url_info__'] = '/foo/bar/' . str_repeat('a', 10000);
222 $injected = $this->url_handler->requestToAction($http_vars);
223 $diff = array_diff($injected, $http_vars);
224 $this->assertEqual($diff['action_test_foo_bar'], true);
225 $this->assertTrue(isset($diff['param1']));
226 $this->assertFalse(isset($diff['param2']));
230 // {{{ test_requestToAction_prefix_suffix
231 function test_requestToAction_prefix_suffix()
234 '__url_handler__' => 'entrypoint',
235 '__url_info__' => '/foo/bar/URL-value1-URL',
236 'param3' => 'value3',
239 $this->url_handler->action_map = $this->_prefix_suffix_map;
240 $injected = $this->url_handler->requestToAction($http_vars);
241 $diff = array_diff($injected, $http_vars);
242 $this->assertEqual($diff['action_test_foo_bar'], true);
243 $this->assertEqual($diff['param1'], 'FORM-value1-FORM');
247 // {{{ test_actionToRequest_simple
248 function test_actionToRequest_simple()
250 $action = 'test_foo_bar';
255 $this->url_handler->action_map = $this->_simple_map;
256 $ret = $this->url_handler->actionToRequest($action, $param);
257 $this->assertFalse(is_null($ret));
258 list($path, $path_key) = $ret;
260 // action "test_foo_bar" に対応するのは "entrypoint" の "/foo/bar"
261 $this->assertEqual($path, 'entrypoint/foo/bar');
262 $this->assertTrue($path_key == array());
266 // {{{ test_actionToRequest_unknownaction
267 function test_actionToRequest_unknownaction()
269 $action = 'test_unknown_action';
274 $this->url_handler->action_map = $this->_simple_map;
275 $ret = $this->url_handler->actionToRequest($action, $param);
276 $this->assertTrue(is_null($ret));
280 // {{{ test_actionToRequest_param1
281 function test_actionToRequest_param1()
283 $action = 'test_foo_bar';
286 'param1' => 'value1',
289 $this->url_handler->action_map = $this->_complex_map;
290 list($path, $path_key) = $this->url_handler->actionToRequest($action, $param);
291 $this->assertEqual($path, 'entrypoint/foo/bar/value1');
292 $this->assertTrue($path_key == array('param1'));
296 // {{{ test_actionToRequest_param2
297 function test_actionToRequest_param2()
299 $action = 'test_foo_bar';
302 'param1' => 'value1',
303 'param2' => 'value2',
306 $this->url_handler->action_map = $this->_complex_map;
307 list($path, $path_key) = $this->url_handler->actionToRequest($action, $param);
308 $this->assertEqual($path, 'entrypoint/foo/bar/value1/value2');
309 $this->assertEqual($path_key, array('param1', 'param2'));
314 class Ethna_UrlHandler_TestClass extends Ethna_UrlHandler
316 function _getPath_Entrypoint($action, $params)
318 return array('/entrypoint', array());
321 function _normalizerequest_Test($http_vars)
326 function _input_filter_Test($input)
328 return strtolower($input);
331 function _output_filter_Test($output)
333 return strtoupper($output);