Merge pull request #268 from pcc/menudeactivate
[mono.git] / mcs / class / System.Web.DynamicData / Test / System.Web.DynamicData / DynamicDataRouteTest.cs
1 //
2 // DynamicDataRouteTest.cs
3 //
4 // Authors:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //      Marek Habersack <mhabersack@novell.com>
7 //
8 // Copyright (C) 2008-2009 Novell Inc. http://novell.com
9 //
10
11 //
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:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
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.
30 //
31 using System;
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;
41 using System.Linq;
42 using System.Reflection;
43 using System.Security.Permissions;
44 using System.Security.Principal;
45 using System.Web;
46 using System.Web.UI;
47 using System.Web.DynamicData;
48 using System.Web.DynamicData.ModelProviders;
49 using System.Web.Routing;
50
51 using NUnit.Framework;
52 using NUnit.Mocks;
53 using MonoTests.stand_alone.WebHarness;
54 using MonoTests.SystemWeb.Framework;
55 using MonoTests.Common;
56 using MonoTests.ModelProviders;
57
58 using MetaModel = System.Web.DynamicData.MetaModel;
59 using MetaTable = System.Web.DynamicData.MetaTable;
60 namespace MonoTests.System.Web.DynamicData
61 {
62         [TestFixture]
63         public class DynamicDataRouteTest
64         {
65                 [TestFixtureSetUp]
66                 public void SetUp ()
67                 {
68                         var dynamicModelProvider = new DynamicDataContainerModelProvider <TestDataContext> ();
69                         Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
70                         Utils.RegisterContext (typeof (MyDataContext3));
71                 }
72
73                 [Test]
74                 public void ConstructorNull ()
75                 {
76                         new DynamicDataRoute (null);
77                 }
78
79                 [Test]
80                 public void Constructor ()
81                 {
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
86                         if (isFirst)
87                                 Assert.AreEqual (m, MetaModel.Default, "#2");
88
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
97                 }
98
99                 [Test]
100                 [ExpectedException (typeof (ArgumentNullException))]
101                 [Category ("NotDotNet")] // .NET throws NRE. yuck.
102 #if TARGET_DOTNET
103                 [Ignore ("Throws a NREX on .NET...")]
104 #endif
105                 public void GetActionFromRouteDataNullArg ()
106                 {
107                         new DynamicDataRoute ("x").GetActionFromRouteData (null);
108                 }
109
110                 [Test]
111                 [ExpectedException (typeof (InvalidOperationException))]
112                 public void GetActionFromRouteData ()
113                 {
114                         var r = new DynamicDataRoute ("x2");
115                         var rd = new RouteData ();
116                         // rd must have "Action" value
117                         r.GetActionFromRouteData (rd);
118                 }
119
120                 [Test]
121                 public void GetActionFromRouteData2 ()
122                 {
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);
128                 }
129
130                 [Test]
131                 [ExpectedException (typeof (ArgumentNullException))]
132                 [Category ("NotDotNet")] // .NET throws NRE. yuck.
133 #if TARGET_DOTNET
134                 [Ignore ("Throws a NREX on .NET...")]
135 #endif
136                 public void GetTableFromRouteDataNullArg ()
137                 {
138                         new DynamicDataRoute ("x").GetTableFromRouteData (null);
139                 }
140
141                 [Test]
142                 [ExpectedException (typeof (InvalidOperationException))]
143                 public void GetTableFromRouteData ()
144                 {
145                         var r = new DynamicDataRoute ("x");
146                         var rd = new RouteData ();
147                         // rd must have "Table" value
148                         r.GetTableFromRouteData (rd);
149                 }
150
151                 [Test]
152                 [ExpectedException (typeof (ArgumentException))]
153                 public void GetTableFromRouteData2 ()
154                 {
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
160                 }
161
162                 [Test]
163                 public void GetTableFromRouteData3 ()
164                 {
165                         var r = new DynamicDataRoute ("x");
166                         var rd = new RouteData ();
167                         rd.Values["Table"] = "FooTable";
168                         var t = r.GetTableFromRouteData (rd);
169                 }
170
171                 [Test]
172                 public void GetRouteData ()
173                 {
174                         var r = new DynamicDataRoute ("{table}/{action}.aspx");
175
176                         // We need one which overloads CreateHandler
177                         r.RouteHandler = new MyDynamicDataRouteHandler ();
178
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);
183
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 ());
187
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");
192
193                         request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/BazTable/List.aspx");
194                         rd = r.GetRouteData (wrapper);
195                         Assert.IsNotNull (rd, "#B1");
196                 }
197
198                 [Test]
199                 public void RouteHandler ()
200                 {
201                         var r = new DynamicDataRoute ("{table}/{action}.aspx");
202
203                         Assert.IsNotNull (r.RouteHandler, "#A1");
204                         Assert.AreEqual (typeof (DynamicDataRouteHandler), r.RouteHandler.GetType (), "#A1-1");
205
206                         r.RouteHandler = null;
207                         Assert.IsNull (r.RouteHandler, "#A2");
208                 }
209
210                 [Test]
211                 public void BaseDefaultsModification_1 ()
212                 {
213                         MetaModel m = MetaModel.Default;
214                         var req = new FakeHttpWorkerRequest ();
215                         var ctx = new HttpContext (req);
216                         HttpContext.Current = ctx;
217
218                         RouteCollection routes = RouteTable.Routes;
219                         routes.Clear ();
220
221                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
222                                 Action = PageAction.Details,
223                                 Model = m,
224                                 RouteHandler = new MyDynamicDataRouteHandler ()
225                         };
226
227                         routes.Add (ddr);
228
229                         Assert.IsNotNull (ddr, "#A1");
230                         Assert.IsNull (ddr.Defaults, "#A1-1");
231                         var rd = new RouteData ();
232                         var hc = new HttpContextWrapper (HttpContext.Current);
233
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");
238
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");
244                 }
245
246                 [Test]
247                 public void BaseDefaultsModification_2 ()
248                 {
249                         MetaModel m = MetaModel.Default;
250                         var req = new FakeHttpWorkerRequest ();
251                         var ctx = new HttpContext (req);
252                         HttpContext.Current = ctx;
253
254                         RouteCollection routes = RouteTable.Routes;
255                         routes.Clear ();
256
257                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
258                                 Table = "BazTable",
259                                 Model = m,
260                                 RouteHandler = new MyDynamicDataRouteHandler ()
261                         };
262
263                         routes.Add (ddr);
264
265                         Assert.IsNotNull (ddr, "#A1");
266                         Assert.IsNull (ddr.Defaults, "#A1-1");
267                         var rd = new RouteData ();
268                         var hc = new HttpContextWrapper (HttpContext.Current);
269
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");
274
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");
280                 }
281
282                 [Test]
283                 public void BaseDefaultsModification_3 ()
284                 {
285                         MetaModel m = MetaModel.Default;
286                         var req = new FakeHttpWorkerRequest ();
287                         var ctx = new HttpContext (req);
288                         HttpContext.Current = ctx;
289
290                         RouteCollection routes = RouteTable.Routes;
291                         routes.Clear ();
292
293                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
294                                 Table = "MyTable",
295                                 Model = m,
296                                 RouteHandler = new MyDynamicDataRouteHandler ()
297                         };
298                         routes.Add (ddr);
299                         var rd = new RouteData ();
300                         var hc = new HttpContextWrapper (HttpContext.Current);
301                         
302                         AssertExtensions.Throws <ArgumentException> (() => {
303                                 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
304                         }, "#A1");
305                 }
306
307                 [Test]
308                 public void BaseDefaultsModification_4 ()
309                 {
310                         MetaModel m = MetaModel.Default;
311                         var req = new FakeHttpWorkerRequest ();
312                         var ctx = new HttpContext (req);
313                         HttpContext.Current = ctx;
314
315                         RouteCollection routes = RouteTable.Routes;
316                         routes.Clear ();
317
318                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
319                                 Model = m,
320                                 RouteHandler = new MyDynamicDataRouteHandler ()
321                         };
322                         routes.Add (ddr);
323                         var rd = new RouteData ();
324                         var hc = new HttpContextWrapper (HttpContext.Current);
325
326                         Assert.IsNull (ddr.Defaults, "#A1");
327                         ddr.GetVirtualPath (new RequestContext (hc, rd), null);
328                         Assert.IsNull (ddr.Defaults, "#A2");
329                 }
330
331                 [Test]
332                 public void BaseDefaultsModification_5 ()
333                 {
334                         MetaModel m = MetaModel.Default;
335                         var req = new FakeHttpWorkerRequest ();
336                         var ctx = new HttpContext (req);
337                         HttpContext.Current = ctx;
338
339                         RouteCollection routes = RouteTable.Routes;
340                         routes.Clear ();
341
342                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
343                                 Action = null,
344                                 Model = m,
345                                 RouteHandler = new MyDynamicDataRouteHandler ()
346                         };
347
348                         routes.Add (ddr);
349
350                         Assert.IsNotNull (ddr, "#A1");
351                         Assert.IsNull (ddr.Defaults, "#A1-1");
352                         var rd = new RouteData ();
353                         var hc = new HttpContextWrapper (HttpContext.Current);
354
355                         ddr.GetVirtualPath (new RequestContext (hc, rd), null);
356                         Assert.IsNull (ddr.Defaults, "#B1");
357                         
358                         ddr.Action = "MyAction";
359                         ddr.GetVirtualPath (new RequestContext (hc, rd), null);
360                         Assert.IsNull (ddr.Defaults, "#C1");
361                 }
362
363                 [Test]
364                 public void BaseDefaultsModification_6 ()
365                 {
366                         MetaModel m = MetaModel.Default;
367                         var req = new FakeHttpWorkerRequest ();
368                         var ctx = new HttpContext (req);
369                         HttpContext.Current = ctx;
370
371                         RouteCollection routes = RouteTable.Routes;
372                         routes.Clear ();
373
374                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
375                                 Action = String.Empty,
376                                 Model = m,
377                                 RouteHandler = new MyDynamicDataRouteHandler ()
378                         };
379
380                         routes.Add (ddr);
381
382                         Assert.IsNotNull (ddr, "#A1");
383                         Assert.IsNull (ddr.Defaults, "#A1-1");
384                         var rd = new RouteData ();
385                         var hc = new HttpContextWrapper (HttpContext.Current);
386
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");
391
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");
397                 }
398
399                 [Test]
400                 public void BaseDefaultsModification_7 ()
401                 {
402                         MetaModel m = MetaModel.Default;
403                         var req = new FakeHttpWorkerRequest ();
404                         var ctx = new HttpContext (req);
405                         HttpContext.Current = ctx;
406
407                         RouteCollection routes = RouteTable.Routes;
408                         routes.Clear ();
409
410                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
411                                 Table = null,
412                                 Model = m,
413                                 RouteHandler = new MyDynamicDataRouteHandler ()
414                         };
415
416                         routes.Add (ddr);
417
418                         Assert.IsNotNull (ddr, "#A1");
419                         Assert.IsNull (ddr.Defaults, "#A1-1");
420                         var rd = new RouteData ();
421                         var hc = new HttpContextWrapper (HttpContext.Current);
422
423                         ddr.GetVirtualPath (new RequestContext (hc, rd), null);
424                         Assert.IsNull (ddr.Defaults, "#B1");
425                 }
426
427                 [Test]
428                 public void BaseDefaultsModification_8 ()
429                 {
430                         MetaModel m = MetaModel.Default;
431                         var req = new FakeHttpWorkerRequest ();
432                         var ctx = new HttpContext (req);
433                         HttpContext.Current = ctx;
434
435                         RouteCollection routes = RouteTable.Routes;
436                         routes.Clear ();
437
438                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
439                                 Table = String.Empty,
440                                 Model = m,
441                                 RouteHandler = new MyDynamicDataRouteHandler ()
442                         };
443
444                         routes.Add (ddr);
445                         var rd = new RouteData ();
446                         var hc = new HttpContextWrapper (HttpContext.Current);
447
448                         AssertExtensions.Throws<ArgumentException> (() => {
449                                 ddr.GetVirtualPath (new RequestContext (hc, rd), null);
450                         }, "#A1");
451                 }
452
453                 [Test]
454                 public void BaseDefaultsModification_9 ()
455                 {
456                         MetaModel m = MetaModel.Default;
457                         var req = new FakeHttpWorkerRequest ();
458                         var ctx = new HttpContext (req);
459                         HttpContext.Current = ctx;
460
461                         RouteCollection routes = RouteTable.Routes;
462                         routes.Clear ();
463
464                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
465                                 Defaults = new RouteValueDictionary () {
466                                         {"Action", "InitialAction"}
467                                 },
468                                 Action = PageAction.Details,
469                                 Model = m,
470                                 RouteHandler = new MyDynamicDataRouteHandler ()
471                         };
472
473                         routes.Add (ddr);
474
475                         Assert.IsNotNull (ddr, "#A1");
476                         Assert.IsNotNull (ddr.Defaults, "#A1-1");
477                         var rd = new RouteData ();
478                         var hc = new HttpContextWrapper (HttpContext.Current);
479
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");
484
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");
490                 }
491
492                 [Test]
493                 public void BaseDefaultsModification_10 ()
494                 {
495                         MetaModel m = MetaModel.Default;
496                         var req = new FakeHttpWorkerRequest ();
497                         var ctx = new HttpContext (req);
498                         HttpContext.Current = ctx;
499
500                         RouteCollection routes = RouteTable.Routes;
501                         routes.Clear ();
502
503                         var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
504                                 Defaults = new RouteValueDictionary () {
505                                         {"Table", "FooWithDefaultsTable"}
506                                 },
507                                 Table = "BazTable",
508                                 Model = m,
509                                 RouteHandler = new MyDynamicDataRouteHandler ()
510                         };
511
512                         routes.Add (ddr);
513
514                         Assert.IsNotNull (ddr, "#A1");
515                         Assert.IsNotNull (ddr.Defaults, "#A1-1");
516                         var rd = new RouteData ();
517                         var hc = new HttpContextWrapper (HttpContext.Current);
518
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");
523
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");
529                 }
530         }
531 }