a tiny mvc framework for php using php-activerecord
at v1 220 lines 5.6 kB view raw
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?>