2 // DynamicDataRouteTest.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
6 // Marek Habersack <mhabersack@novell.com>
8 // Copyright (C) 2008-2009 Novell Inc. http://novell.com
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.Collections.Generic;
34 using System.Collections.ObjectModel;
35 using System.Collections.Specialized;
36 using System.ComponentModel.DataAnnotations;
37 using System.Data.SqlClient;
38 using System.Data.Linq;
39 using System.Data.Linq.Mapping;
40 using System.Globalization;
42 using System.Reflection;
43 using System.Security.Permissions;
44 using System.Security.Principal;
47 using System.Web.DynamicData;
48 using System.Web.DynamicData.ModelProviders;
49 using System.Web.Routing;
51 using NUnit.Framework;
53 using MonoTests.stand_alone.WebHarness;
54 using MonoTests.SystemWeb.Framework;
55 using MonoTests.Common;
56 using MonoTests.ModelProviders;
58 using MetaModel = System.Web.DynamicData.MetaModel;
59 using MetaTable = System.Web.DynamicData.MetaTable;
60 namespace MonoTests.System.Web.DynamicData
63 public class DynamicDataRouteTest
68 var dynamicModelProvider = new DynamicDataContainerModelProvider <TestDataContext> ();
69 Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
70 Utils.RegisterContext (typeof (MyDataContext3));
74 public void ConstructorNull ()
76 new DynamicDataRoute (null);
80 public void Constructor ()
82 // other tests create MetaModel and set Default and this test does not always run first, so it does not make sense anymore.
83 //Assert.IsNull (MetaModel.Default, "#1");
84 bool isFirst = (MetaModel.Default == null);
85 var m = new MetaModel (); // it automatically fills Default
87 Assert.AreEqual (m, MetaModel.Default, "#2");
89 var r = new DynamicDataRoute ("Dynamic1");
90 Assert.AreEqual (MetaModel.Default, r.Model, "#1");
91 Assert.IsNull (r.Action, "#2");
92 Assert.IsNull (r.Table, "#3");
93 Assert.IsNull (r.ViewName, "#4");
94 Assert.IsNotNull (r.RouteHandler, "#5");
95 Assert.IsNotNull (r.Model, "#6");
96 Assert.IsNull (r.RouteHandler.Model, "#7"); // irrelevant to route's MetaModel
100 [ExpectedException (typeof (ArgumentNullException))]
101 [Category ("NotDotNet")] // .NET throws NRE. yuck.
103 [Ignore ("Throws a NREX on .NET...")]
105 public void GetActionFromRouteDataNullArg ()
107 new DynamicDataRoute ("x").GetActionFromRouteData (null);
111 [ExpectedException (typeof (InvalidOperationException))]
112 public void GetActionFromRouteData ()
114 var r = new DynamicDataRoute ("x2");
115 var rd = new RouteData ();
116 // rd must have "Action" value
117 r.GetActionFromRouteData (rd);
121 public void GetActionFromRouteData2 ()
123 var r = new DynamicDataRoute ("x");
124 var rd = new RouteData ();
125 rd.Values["Action"] = "y";
126 var a = r.GetActionFromRouteData (rd);
127 Assert.AreEqual ("y", a);
131 [ExpectedException (typeof (ArgumentNullException))]
132 [Category ("NotDotNet")] // .NET throws NRE. yuck.
134 [Ignore ("Throws a NREX on .NET...")]
136 public void GetTableFromRouteDataNullArg ()
138 new DynamicDataRoute ("x").GetTableFromRouteData (null);
142 [ExpectedException (typeof (InvalidOperationException))]
143 public void GetTableFromRouteData ()
145 var r = new DynamicDataRoute ("x");
146 var rd = new RouteData ();
147 // rd must have "Table" value
148 r.GetTableFromRouteData (rd);
152 [ExpectedException (typeof (ArgumentException))]
153 public void GetTableFromRouteData2 ()
155 var r = new DynamicDataRoute ("x");
156 r.Model = new MetaModel ();
157 var rd = new RouteData ();
158 rd.Values["Table"] = "y";
159 r.GetTableFromRouteData (rd); // no such table
163 public void GetTableFromRouteData3 ()
165 var r = new DynamicDataRoute ("x");
166 var rd = new RouteData ();
167 rd.Values["Table"] = "FooTable";
168 var t = r.GetTableFromRouteData (rd);
172 public void GetRouteData ()
174 var r = new DynamicDataRoute ("{table}/{action}.aspx");
176 // We need one which overloads CreateHandler
177 r.RouteHandler = new MyDynamicDataRouteHandler ();
179 var wrapper = new MyHttpContextWrapper ();
180 var request = wrapper.Request as MyHttpRequestWrapper;
181 request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/NoSuchTable/List.aspx");
182 request.SetProperty ("PathInfo", String.Empty);
184 // This must be non-null because DynamicData doesn't care to check whether the returned
185 // value is null or not...
186 request.SetProperty ("QueryString", new NameValueCollection ());
188 // It appears .NET checks whether the indicated table exists - if not, GetRouteData will return
189 // null (even though the Route class will find a match)
190 RouteData rd = r.GetRouteData (wrapper);
191 Assert.IsNull (rd, "#A1");
193 request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/BazTable/List.aspx");
194 rd = r.GetRouteData (wrapper);
195 Assert.IsNotNull (rd, "#B1");
199 public void RouteHandler ()
201 var r = new DynamicDataRoute ("{table}/{action}.aspx");
203 Assert.IsNotNull (r.RouteHandler, "#A1");
204 Assert.AreEqual (typeof (DynamicDataRouteHandler), r.RouteHandler.GetType (), "#A1-1");
206 r.RouteHandler = null;
207 Assert.IsNull (r.RouteHandler, "#A2");
211 public void BaseDefaultsModification_1 ()
213 MetaModel m = MetaModel.Default;
214 var req = new FakeHttpWorkerRequest ();
215 var ctx = new HttpContext (req);
216 HttpContext.Current = ctx;
218 RouteCollection routes = RouteTable.Routes;
221 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
222 Action = PageAction.Details,
224 RouteHandler = new MyDynamicDataRouteHandler ()
229 Assert.IsNotNull (ddr, "#A1");
230 Assert.IsNull (ddr.Defaults, "#A1-1");
231 var rd = new RouteData ();
232 var hc = new HttpContextWrapper (HttpContext.Current);
234 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
235 Assert.IsNotNull (ddr.Defaults, "#B1");
236 Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
237 Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
239 ddr.Action = "MyAction";
240 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
241 Assert.IsNotNull (ddr.Defaults, "#C1");
242 Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
243 Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
247 public void BaseDefaultsModification_2 ()
249 MetaModel m = MetaModel.Default;
250 var req = new FakeHttpWorkerRequest ();
251 var ctx = new HttpContext (req);
252 HttpContext.Current = ctx;
254 RouteCollection routes = RouteTable.Routes;
257 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
260 RouteHandler = new MyDynamicDataRouteHandler ()
265 Assert.IsNotNull (ddr, "#A1");
266 Assert.IsNull (ddr.Defaults, "#A1-1");
267 var rd = new RouteData ();
268 var hc = new HttpContextWrapper (HttpContext.Current);
270 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
271 Assert.IsNotNull (ddr.Defaults, "#B1");
272 Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
273 Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#B1-2");
275 ddr.Table = "AnotherTable";
276 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
277 Assert.IsNotNull (ddr.Defaults, "#C1");
278 Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
279 Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#C1-2");
283 public void BaseDefaultsModification_3 ()
285 MetaModel m = MetaModel.Default;
286 var req = new FakeHttpWorkerRequest ();
287 var ctx = new HttpContext (req);
288 HttpContext.Current = ctx;
290 RouteCollection routes = RouteTable.Routes;
293 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
296 RouteHandler = new MyDynamicDataRouteHandler ()
299 var rd = new RouteData ();
300 var hc = new HttpContextWrapper (HttpContext.Current);
302 AssertExtensions.Throws <ArgumentException> (() => {
303 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
308 public void BaseDefaultsModification_4 ()
310 MetaModel m = MetaModel.Default;
311 var req = new FakeHttpWorkerRequest ();
312 var ctx = new HttpContext (req);
313 HttpContext.Current = ctx;
315 RouteCollection routes = RouteTable.Routes;
318 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
320 RouteHandler = new MyDynamicDataRouteHandler ()
323 var rd = new RouteData ();
324 var hc = new HttpContextWrapper (HttpContext.Current);
326 Assert.IsNull (ddr.Defaults, "#A1");
327 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
328 Assert.IsNull (ddr.Defaults, "#A2");
332 public void BaseDefaultsModification_5 ()
334 MetaModel m = MetaModel.Default;
335 var req = new FakeHttpWorkerRequest ();
336 var ctx = new HttpContext (req);
337 HttpContext.Current = ctx;
339 RouteCollection routes = RouteTable.Routes;
342 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
345 RouteHandler = new MyDynamicDataRouteHandler ()
350 Assert.IsNotNull (ddr, "#A1");
351 Assert.IsNull (ddr.Defaults, "#A1-1");
352 var rd = new RouteData ();
353 var hc = new HttpContextWrapper (HttpContext.Current);
355 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
356 Assert.IsNull (ddr.Defaults, "#B1");
358 ddr.Action = "MyAction";
359 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
360 Assert.IsNull (ddr.Defaults, "#C1");
364 public void BaseDefaultsModification_6 ()
366 MetaModel m = MetaModel.Default;
367 var req = new FakeHttpWorkerRequest ();
368 var ctx = new HttpContext (req);
369 HttpContext.Current = ctx;
371 RouteCollection routes = RouteTable.Routes;
374 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
375 Action = String.Empty,
377 RouteHandler = new MyDynamicDataRouteHandler ()
382 Assert.IsNotNull (ddr, "#A1");
383 Assert.IsNull (ddr.Defaults, "#A1-1");
384 var rd = new RouteData ();
385 var hc = new HttpContextWrapper (HttpContext.Current);
387 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
388 Assert.IsNotNull (ddr.Defaults, "#B1");
389 Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
390 Assert.AreEqual (String.Empty, ddr.Defaults["Action"], "#B1-2");
392 ddr.Action = "MyAction";
393 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
394 Assert.IsNotNull (ddr.Defaults, "#C1");
395 Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
396 Assert.AreEqual (String.Empty, ddr.Defaults["Action"], "#B1-2");
400 public void BaseDefaultsModification_7 ()
402 MetaModel m = MetaModel.Default;
403 var req = new FakeHttpWorkerRequest ();
404 var ctx = new HttpContext (req);
405 HttpContext.Current = ctx;
407 RouteCollection routes = RouteTable.Routes;
410 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
413 RouteHandler = new MyDynamicDataRouteHandler ()
418 Assert.IsNotNull (ddr, "#A1");
419 Assert.IsNull (ddr.Defaults, "#A1-1");
420 var rd = new RouteData ();
421 var hc = new HttpContextWrapper (HttpContext.Current);
423 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
424 Assert.IsNull (ddr.Defaults, "#B1");
428 public void BaseDefaultsModification_8 ()
430 MetaModel m = MetaModel.Default;
431 var req = new FakeHttpWorkerRequest ();
432 var ctx = new HttpContext (req);
433 HttpContext.Current = ctx;
435 RouteCollection routes = RouteTable.Routes;
438 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
439 Table = String.Empty,
441 RouteHandler = new MyDynamicDataRouteHandler ()
445 var rd = new RouteData ();
446 var hc = new HttpContextWrapper (HttpContext.Current);
448 AssertExtensions.Throws<ArgumentException> (() => {
449 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
454 public void BaseDefaultsModification_9 ()
456 MetaModel m = MetaModel.Default;
457 var req = new FakeHttpWorkerRequest ();
458 var ctx = new HttpContext (req);
459 HttpContext.Current = ctx;
461 RouteCollection routes = RouteTable.Routes;
464 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
465 Defaults = new RouteValueDictionary () {
466 {"Action", "InitialAction"}
468 Action = PageAction.Details,
470 RouteHandler = new MyDynamicDataRouteHandler ()
475 Assert.IsNotNull (ddr, "#A1");
476 Assert.IsNotNull (ddr.Defaults, "#A1-1");
477 var rd = new RouteData ();
478 var hc = new HttpContextWrapper (HttpContext.Current);
480 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
481 Assert.IsNotNull (ddr.Defaults, "#B1");
482 Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
483 Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
485 ddr.Action = "MyAction";
486 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
487 Assert.IsNotNull (ddr.Defaults, "#C1");
488 Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
489 Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
493 public void BaseDefaultsModification_10 ()
495 MetaModel m = MetaModel.Default;
496 var req = new FakeHttpWorkerRequest ();
497 var ctx = new HttpContext (req);
498 HttpContext.Current = ctx;
500 RouteCollection routes = RouteTable.Routes;
503 var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
504 Defaults = new RouteValueDictionary () {
505 {"Table", "FooWithDefaultsTable"}
509 RouteHandler = new MyDynamicDataRouteHandler ()
514 Assert.IsNotNull (ddr, "#A1");
515 Assert.IsNotNull (ddr.Defaults, "#A1-1");
516 var rd = new RouteData ();
517 var hc = new HttpContextWrapper (HttpContext.Current);
519 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
520 Assert.IsNotNull (ddr.Defaults, "#B1");
521 Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
522 Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#B1-2");
524 ddr.Table = "AnotherTable";
525 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
526 Assert.IsNotNull (ddr.Defaults, "#C1");
527 Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
528 Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#C1-2");