/test/System.Web.Mvc.Test/Test/RouteCollectionExtensionsTest.cs

https://bitbucket.org/mdavid/aspnetwebstack · C# · 388 lines · 285 code · 56 blank · 47 comment · 0 complexity · 16a385f2aa5064c2a14c32b3544d8244 MD5 · raw file

  1. using System.Linq;
  2. using System.Web.Routing;
  3. using Moq;
  4. using Xunit;
  5. using Assert = Microsoft.TestCommon.AssertEx;
  6. namespace System.Web.Mvc.Test
  7. {
  8. public class RouteCollectionExtensionsTest
  9. {
  10. private static string[] _nameSpaces = new string[] { "nsA.nsB.nsC", "ns1.ns2.ns3" };
  11. [Fact]
  12. public void GetVirtualPathForAreaDoesNotStripAreaTokenIfAreasNotInUse()
  13. {
  14. // Arrange
  15. RouteCollection routes = new RouteCollection();
  16. routes.MapRoute(
  17. "Default",
  18. "no-area/{controller}/{action}/{id}",
  19. new { controller = "Home", action = "Index", id = "" }
  20. );
  21. RequestContext requestContext = GetRequestContext(null);
  22. RouteValueDictionary values = new RouteValueDictionary()
  23. {
  24. { "controller", "home" },
  25. { "action", "about" },
  26. { "area", "some-area" }
  27. };
  28. // Act
  29. VirtualPathData vpd = routes.GetVirtualPathForArea(requestContext, values);
  30. // Assert
  31. Assert.NotNull(vpd);
  32. Assert.Equal(routes["Default"], vpd.Route);
  33. // note presence of 'area' query string parameter; RVD should not be modified if areas not in use
  34. Assert.Equal("/app/no-area/home/about?area=some-area", vpd.VirtualPath);
  35. }
  36. [Fact]
  37. public void GetVirtualPathForAreaForwardsCallIfRouteNameSpecified()
  38. {
  39. // Arrange
  40. RouteCollection routes = GetRouteCollection();
  41. RequestContext requestContext = GetRequestContext(null);
  42. RouteValueDictionary values = new RouteValueDictionary()
  43. {
  44. { "controller", "home" },
  45. { "action", "index" },
  46. { "area", "some-area" }
  47. };
  48. // Act
  49. VirtualPathData vpd = routes.GetVirtualPathForArea(requestContext, "admin_default", values);
  50. // Assert
  51. Assert.NotNull(vpd);
  52. Assert.Equal(routes["admin_default"], vpd.Route);
  53. // note presence of 'area' query string parameter; RVD should not be modified if route name was provided
  54. Assert.Equal("/app/admin-area?area=some-area", vpd.VirtualPath);
  55. }
  56. [Fact]
  57. public void GetVirtualPathForAreaThrowsIfRoutesIsNull()
  58. {
  59. // Act & assert
  60. Assert.ThrowsArgumentNull(
  61. delegate { RouteCollectionExtensions.GetVirtualPathForArea(null, null, null); }, "routes");
  62. }
  63. [Fact]
  64. public void GetVirtualPathForAreaWillJumpBetweenAreasExplicitly()
  65. {
  66. // Arrange
  67. RouteCollection routes = GetRouteCollection();
  68. RequestContext requestContext = GetRequestContext(null);
  69. RouteValueDictionary values = new RouteValueDictionary()
  70. {
  71. { "controller", "home" },
  72. { "action", "tenmostrecent" },
  73. { "tag", "some-tag" },
  74. { "area", "blog" }
  75. };
  76. // Act
  77. VirtualPathData vpd = routes.GetVirtualPathForArea(requestContext, values);
  78. // Assert
  79. Assert.NotNull(vpd);
  80. Assert.Equal(routes["blog_whatsnew"], vpd.Route);
  81. Assert.Equal("/app/whats-new/some-tag", vpd.VirtualPath);
  82. }
  83. [Fact]
  84. public void GetVirtualPathForAreaWillNotJumpBetweenAreasImplicitly()
  85. {
  86. // Arrange
  87. RouteCollection routes = GetRouteCollection();
  88. RequestContext requestContext = GetRequestContext("admin");
  89. RouteValueDictionary values = new RouteValueDictionary()
  90. {
  91. { "controller", "home" },
  92. { "action", "tenmostrecent" },
  93. { "tag", "some-tag" }
  94. };
  95. // Act
  96. VirtualPathData vpd = routes.GetVirtualPathForArea(requestContext, values);
  97. // Assert
  98. Assert.NotNull(vpd);
  99. Assert.Equal(routes["admin_default"], vpd.Route);
  100. Assert.Equal("/app/admin-area/home/tenmostrecent?tag=some-tag", vpd.VirtualPath);
  101. }
  102. [Fact]
  103. public void MapRoute3()
  104. {
  105. // Arrange
  106. RouteCollection routes = new RouteCollection();
  107. // Act
  108. routes.MapRoute("RouteName", "SomeUrl");
  109. // Assert
  110. Route route = Assert.Single(routes.Cast<Route>());
  111. Assert.NotNull(route);
  112. Assert.Same(route, routes["RouteName"]);
  113. Assert.Equal("SomeUrl", route.Url);
  114. Assert.IsType<MvcRouteHandler>(route.RouteHandler);
  115. Assert.Empty(route.Defaults);
  116. Assert.Empty(route.Constraints);
  117. Assert.Empty(route.DataTokens);
  118. }
  119. [Fact]
  120. public void MapRoute3WithNameSpaces()
  121. {
  122. // Arrange
  123. RouteCollection routes = new RouteCollection();
  124. //string[] namespaces = new string[] { "nsA.nsB.nsC", "ns1.ns2.ns3" };
  125. // Act
  126. routes.MapRoute("RouteName", "SomeUrl", _nameSpaces);
  127. // Assert
  128. Route route = Assert.Single(routes.Cast<Route>());
  129. Assert.NotNull(route);
  130. Assert.NotNull(route.DataTokens);
  131. Assert.NotNull(route.DataTokens["Namespaces"]);
  132. string[] routeNameSpaces = route.DataTokens["Namespaces"] as string[];
  133. Assert.Equal(routeNameSpaces.Length, 2);
  134. Assert.Same(route, routes["RouteName"]);
  135. Assert.Same(routeNameSpaces, _nameSpaces);
  136. Assert.Equal("SomeUrl", route.Url);
  137. Assert.IsType<MvcRouteHandler>(route.RouteHandler);
  138. Assert.Empty(route.Defaults);
  139. Assert.Empty(route.Constraints);
  140. }
  141. [Fact]
  142. public void MapRoute3WithEmptyNameSpaces()
  143. {
  144. // Arrange
  145. RouteCollection routes = new RouteCollection();
  146. // Act
  147. routes.MapRoute("RouteName", "SomeUrl", new string[] { });
  148. // Assert
  149. Route route = Assert.Single(routes.Cast<Route>());
  150. Assert.NotNull(route);
  151. Assert.Same(route, routes["RouteName"]);
  152. Assert.Equal("SomeUrl", route.Url);
  153. Assert.IsType<MvcRouteHandler>(route.RouteHandler);
  154. Assert.Empty(route.Defaults);
  155. Assert.Empty(route.Constraints);
  156. Assert.Empty(route.DataTokens);
  157. }
  158. [Fact]
  159. public void MapRoute4()
  160. {
  161. // Arrange
  162. RouteCollection routes = new RouteCollection();
  163. var defaults = new { Foo = "DefaultFoo" };
  164. // Act
  165. routes.MapRoute("RouteName", "SomeUrl", defaults);
  166. // Assert
  167. Route route = Assert.Single(routes.Cast<Route>());
  168. Assert.NotNull(route);
  169. Assert.Same(route, routes["RouteName"]);
  170. Assert.Equal("SomeUrl", route.Url);
  171. Assert.IsType<MvcRouteHandler>(route.RouteHandler);
  172. Assert.Equal("DefaultFoo", route.Defaults["Foo"]);
  173. Assert.Empty(route.Constraints);
  174. Assert.Empty(route.DataTokens);
  175. }
  176. [Fact]
  177. public void MapRoute4WithNameSpaces()
  178. {
  179. // Arrange
  180. RouteCollection routes = new RouteCollection();
  181. var defaults = new { Foo = "DefaultFoo" };
  182. // Act
  183. routes.MapRoute("RouteName", "SomeUrl", defaults, _nameSpaces);
  184. // Assert
  185. Route route = Assert.Single(routes.Cast<Route>());
  186. Assert.NotNull(route);
  187. Assert.NotNull(route.DataTokens);
  188. Assert.NotNull(route.DataTokens["Namespaces"]);
  189. string[] routeNameSpaces = route.DataTokens["Namespaces"] as string[];
  190. Assert.Equal(routeNameSpaces.Length, 2);
  191. Assert.Same(route, routes["RouteName"]);
  192. Assert.Same(routeNameSpaces, _nameSpaces);
  193. Assert.Equal("SomeUrl", route.Url);
  194. Assert.IsType<MvcRouteHandler>(route.RouteHandler);
  195. Assert.Equal("DefaultFoo", route.Defaults["Foo"]);
  196. Assert.Empty(route.Constraints);
  197. }
  198. [Fact]
  199. public void MapRoute5()
  200. {
  201. // Arrange
  202. RouteCollection routes = new RouteCollection();
  203. var defaults = new { Foo = "DefaultFoo" };
  204. var constraints = new { Foo = "ConstraintFoo" };
  205. // Act
  206. routes.MapRoute("RouteName", "SomeUrl", defaults, constraints);
  207. // Assert
  208. Route route = Assert.Single(routes.Cast<Route>());
  209. Assert.NotNull(route);
  210. Assert.Same(route, routes["RouteName"]);
  211. Assert.Equal("SomeUrl", route.Url);
  212. Assert.IsType<MvcRouteHandler>(route.RouteHandler);
  213. Assert.Equal("DefaultFoo", route.Defaults["Foo"]);
  214. Assert.Equal("ConstraintFoo", route.Constraints["Foo"]);
  215. Assert.Empty(route.DataTokens);
  216. }
  217. [Fact]
  218. public void MapRoute5WithNullRouteCollectionThrows()
  219. {
  220. Assert.ThrowsArgumentNull(
  221. delegate { RouteCollectionExtensions.MapRoute(null, null, null, null, null); },
  222. "routes");
  223. }
  224. [Fact]
  225. public void MapRoute5WithNullUrlThrows()
  226. {
  227. // Arrange
  228. RouteCollection routes = new RouteCollection();
  229. // Act & Assert
  230. Assert.ThrowsArgumentNull(
  231. delegate { routes.MapRoute(null, null /* url */, null, null); },
  232. "url");
  233. }
  234. [Fact]
  235. public void IgnoreRoute1WithNullRouteCollectionThrows()
  236. {
  237. Assert.ThrowsArgumentNull(
  238. delegate { RouteCollectionExtensions.IgnoreRoute(null, "foo"); },
  239. "routes");
  240. }
  241. [Fact]
  242. public void IgnoreRoute1WithNullUrlThrows()
  243. {
  244. // Arrange
  245. RouteCollection routes = new RouteCollection();
  246. // Act & Assert
  247. Assert.ThrowsArgumentNull(
  248. delegate { routes.IgnoreRoute(null); },
  249. "url");
  250. }
  251. [Fact]
  252. public void IgnoreRoute3()
  253. {
  254. // Arrange
  255. RouteCollection routes = new RouteCollection();
  256. // Act
  257. routes.IgnoreRoute("SomeUrl");
  258. // Assert
  259. Route route = Assert.Single(routes.Cast<Route>());
  260. Assert.NotNull(route);
  261. Assert.Equal("SomeUrl", route.Url);
  262. Assert.IsType<StopRoutingHandler>(route.RouteHandler);
  263. Assert.Null(route.Defaults);
  264. Assert.Empty(route.Constraints);
  265. }
  266. [Fact]
  267. public void IgnoreRoute4()
  268. {
  269. // Arrange
  270. RouteCollection routes = new RouteCollection();
  271. var constraints = new { Foo = "DefaultFoo" };
  272. // Act
  273. routes.IgnoreRoute("SomeUrl", constraints);
  274. // Assert
  275. Route route = Assert.Single(routes.Cast<Route>());
  276. Assert.NotNull(route);
  277. Assert.Equal("SomeUrl", route.Url);
  278. Assert.IsType<StopRoutingHandler>(route.RouteHandler);
  279. Assert.Null(route.Defaults);
  280. Assert.Single(route.Constraints);
  281. Assert.Equal("DefaultFoo", route.Constraints["Foo"]);
  282. }
  283. [Fact]
  284. public void IgnoreRouteInternalNeverMatchesUrlGeneration()
  285. {
  286. // Arrange
  287. RouteCollection routes = new RouteCollection();
  288. routes.IgnoreRoute("SomeUrl");
  289. Route route = routes[0] as Route;
  290. // Act
  291. VirtualPathData vpd = route.GetVirtualPath(new RequestContext(new Mock<HttpContextBase>().Object, new RouteData()), null);
  292. // Assert
  293. Assert.Null(vpd);
  294. }
  295. private static RequestContext GetRequestContext(string currentAreaName)
  296. {
  297. Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
  298. mockHttpContext.Setup(c => c.Request.ApplicationPath).Returns("/app");
  299. mockHttpContext.Setup(c => c.Response.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(virtualPath => virtualPath);
  300. RouteData routeData = new RouteData();
  301. routeData.DataTokens["area"] = currentAreaName;
  302. return new RequestContext(mockHttpContext.Object, routeData);
  303. }
  304. private static RouteCollection GetRouteCollection()
  305. {
  306. RouteCollection routes = new RouteCollection();
  307. routes.MapRoute(
  308. "Default",
  309. "no-area/{controller}/{action}/{id}",
  310. new { controller = "Home", action = "Index", id = "" }
  311. );
  312. AreaRegistrationContext blogContext = new AreaRegistrationContext("blog", routes);
  313. blogContext.MapRoute(
  314. "Blog_WhatsNew",
  315. "whats-new/{tag}",
  316. new { controller = "Home", action = "TenMostRecent", tag = "" }
  317. );
  318. blogContext.MapRoute(
  319. "Blog_Default",
  320. "blog-area/{controller}/{action}/{id}",
  321. new { controller = "Home", action = "Index", id = "" }
  322. );
  323. AreaRegistrationContext adminContext = new AreaRegistrationContext("admin", routes);
  324. adminContext.MapRoute(
  325. "Admin_Default",
  326. "admin-area/{controller}/{action}/{id}",
  327. new { controller = "Home", action = "Index", id = "" }
  328. );
  329. return routes;
  330. }
  331. }
  332. }