a tiny mvc framework for php using php-activerecord
1<?php
2
3require(__DIR__ . "/../lib/halfmoon.php");
4
5class RouterTest extends PHPUnit_Framework_TestCase {
6 public function testSetupRoutes() {
7 HalfMoon\Router::clearRoutes();
8
9 $this->assertEquals(0, count(HalfMoon\Router::getRoutes()));
10 $this->assertEquals(0, count(HalfMoon\Router::getRootRoutes()));
11
12 $added_routes = 0;
13 $added_root_routes = 0;
14
15 HalfMoon\Router::addRoute(array(
16 "url" => "logout",
17 "controller" => "login",
18 "action" => "logout2",
19 "conditions" => array(
20 "hostname" => "/^www(\d+)\.example\.(com|net)$/i"),
21 ));
22 $added_routes++;
23
24 HalfMoon\Router::addRoute(array(
25 "url" => "logout",
26 "controller" => "login",
27 "action" => "logout",
28 ));
29 $added_routes++;
30
31 HalfMoon\Router::addRoute(array(
32 "url" => "*globby",
33 "controller" => "login",
34 "action" => "globtest",
35 "conditions" => array(
36 "globby" => "/^globte.t$/"
37 ),
38 ));
39 $added_routes++;
40
41 HalfMoon\Router::addRoute(array(
42 "url" => "stub/:controller/:action/:id",
43 "action" => "stub_:action",
44 ));
45 $added_routes++;
46
47 HalfMoon\Router::addRoute(array(
48 "url" => "zero_test/:id",
49 "controller" => "zero_test",
50 "action" => "show",
51 "conditions" => array("id" => "/^[0-9]+$/"),
52 ));
53 $added_routes++;
54
55 HalfMoon\Router::addRoute(array(
56 "url" => ":tag/:message",
57 "controller" => "messages",
58 "action" => "show_tagged",
59 "conditions" => array("tag" => "/^[A-Za-z0-9_\-]+$/",
60 "message" => "/^\d+$/")
61 ));
62 $added_routes++;
63
64 HalfMoon\Router::addRoute(array(
65 "url" => ":controller/:action/*globbed",
66 "conditions" => array("controller" => "someglob",
67 "action" => "/^[a-z]+$/"),
68 ));
69 $added_routes++;
70
71
72 HalfMoon\Router::addRootRoute(array(
73 "controller" => "root2",
74 "conditions" => array("hostname" => "www.example2.com"),
75 ));
76 $added_root_routes++;
77
78 HalfMoon\Router::addRootRoute(array(
79 "controller" => "root",
80 ));
81 $added_root_routes++;
82
83
84 $this->assertEquals($added_routes,
85 count(HalfMoon\Router::getRoutes()));
86 $this->assertEquals($added_root_routes,
87 count(HalfMoon\Router::getRootRoutes()));
88 }
89
90 /**
91 * @depends testSetupRoutes
92 */
93 public function testBasicRouteParsing() {
94 $route = HalfMoon\Router::routeRequest(
95 $this->request_for("/logout"));
96
97 $this->assertEquals("login", $route["controller"]);
98 $this->assertEquals("logout", $route["action"]);
99 $this->assertEmpty($route["id"]);
100 }
101
102 /**
103 * @depends testSetupRoutes
104 */
105 public function testWildcardRouting() {
106 $route = HalfMoon\Router::routeRequest(
107 $this->request_for("/stub/something/blah"));
108
109 $this->assertEquals("something", $route["controller"]);
110 $this->assertEquals("stub_blah", $route["action"]);
111 $this->assertEmpty($route["id"]);
112
113 $route = HalfMoon\Router::routeRequest(
114 $this->request_for("/stub/something"));
115
116 $this->assertEquals("something", $route["controller"]);
117 $this->assertEquals("stub_index", $route["action"]);
118 $this->assertEmpty($route["id"]);
119 }
120
121 /**
122 * @depends testSetupRoutes
123 */
124 public function testConditionsMatching() {
125 $route = HalfMoon\Router::routeRequest(
126 $this->request_for("/matchingtag/50"));
127
128 $this->assertEquals("messages", $route["controller"]);
129 $this->assertEquals("show_tagged", $route["action"]);
130 $this->assertEmpty($route["id"]);
131 }
132
133 /**
134 * @depends testSetupRoutes
135 * @expectedException HalfMoon\RoutingException
136 */
137 public function testConditionsFail() {
138 $route = HalfMoon\Router::routeRequest(
139 $this->request_for("/matchingtag/50asdf"));
140 }
141
142 /**
143 * @depends testSetupRoutes
144 */
145 public function testGlobRouting() {
146 $route = HalfMoon\Router::routeRequest(
147 $this->request_for("/someglob/blah/this/is/a/test"));
148
149 $this->assertEquals("someglob", $route["controller"]);
150 $this->assertEquals("blah", $route["action"]);
151 $this->assertEquals("this/is/a/test", $route["globbed"]);
152
153 $route = HalfMoon\Router::routeRequest(
154 $this->request_for("/globtest/"));
155
156 $this->assertEquals("globtest", $route["globby"]);
157 $this->assertEquals("login", $route["controller"]);
158 $this->assertEquals("globtest", $route["action"]);
159 }
160
161 /**
162 * @depends testSetupRoutes
163 */
164 public function testRoutingWithHostname() {
165 $route = HalfMoon\Router::routeRequest(
166 $this->request_for("http://www5.example.com/logout"));
167
168 $this->assertEquals("login", $route["controller"]);
169 $this->assertEquals("logout2", $route["action"]);
170 $this->assertEmpty($route["id"]);
171 }
172
173 /**
174 * @depends testSetupRoutes
175 */
176 public function testRootRouting() {
177 $route = HalfMoon\Router::routeRequest(
178 $this->request_for("/"));
179
180 $this->assertEquals("root", $route["controller"]);
181 $this->assertEquals("index", $route["action"]);
182 $this->assertEmpty($route["id"]);
183 }
184
185 /**
186 * @depends testSetupRoutes
187 */
188 public function testRootRoutingWithHostname() {
189 $route = HalfMoon\Router::routeRequest(
190 $this->request_for("http://www.example2.com/"));
191
192 $this->assertEquals("root2", $route["controller"]);
193 $this->assertEquals("index", $route["action"]);
194 $this->assertEmpty($route["id"]);
195 }
196
197 /**
198 * @depends testSetupRoutes
199 */
200 public function testZeroRouting() {
201 $route = HalfMoon\Router::routeRequest(
202 $this->request_for("http://www.example2.com/zero_test/0"));
203
204 $this->assertEquals("zero_test", $route["controller"]);
205 $this->assertEquals("show", $route["action"]);
206 $this->assertEquals("0", $route["id"]);
207 }
208
209
210 private function request_for($url) {
211 if (preg_match("/^\//", $url))
212 $url = "http://www.example.com" . $url;
213
214 $req = new HalfMoon\Request($url, array(), array(), array(),
215 microtime(true));
216 return $req;
217 }
218}
219
220?>