Merge pull request #3796 from ntherning/windows-backend-for-MemoryMappedFile
[mono.git] / mcs / class / System.Web.DynamicData / Test / System.Web.DynamicData / DynamicDataRouteTest.cs
index 2b3e01005ad6b5aff1324aaea8d2e7ec6094ba8b..1151fb86612a273fe4d427e4c80eb0f29147ae99 100644 (file)
@@ -1,10 +1,11 @@
 //
 // DynamicDataRouteTest.cs
 //
-// Author:
+// Authors:
 //     Atsushi Enomoto <atsushi@ximian.com>
+//      Marek Habersack <mhabersack@novell.com>
 //
-// Copyright (C) 2008 Novell Inc. http://novell.com
+// Copyright (C) 2008-2009 Novell Inc. http://novell.com
 //
 
 //
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using System.ComponentModel.DataAnnotations;
+using System.Data.SqlClient;
+using System.Data.Linq;
+using System.Data.Linq.Mapping;
+using System.Globalization;
+using System.Linq;
+using System.Reflection;
+using System.Security.Permissions;
+using System.Security.Principal;
 using System.Web;
+using System.Web.UI;
 using System.Web.DynamicData;
+using System.Web.DynamicData.ModelProviders;
 using System.Web.Routing;
+
 using NUnit.Framework;
+using MonoTests.stand_alone.WebHarness;
+using MonoTests.SystemWeb.Framework;
+using MonoTests.Common;
+using MonoTests.ModelProviders;
 
+using MetaModel = System.Web.DynamicData.MetaModel;
+using MetaTable = System.Web.DynamicData.MetaTable;
 namespace MonoTests.System.Web.DynamicData
 {
        [TestFixture]
        public class DynamicDataRouteTest
        {
+               [TestFixtureSetUp]
+               public void SetUp ()
+               {
+                       var dynamicModelProvider = new DynamicDataContainerModelProvider <TestDataContext> ();
+                       Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
+                       Utils.RegisterContext (typeof (MyDataContext3));
+               }
+
                [Test]
                public void ConstructorNull ()
                {
@@ -60,13 +91,16 @@ namespace MonoTests.System.Web.DynamicData
                        Assert.IsNull (r.Table, "#3");
                        Assert.IsNull (r.ViewName, "#4");
                        Assert.IsNotNull (r.RouteHandler, "#5");
-                       Assert.IsNull (r.RouteHandler.Model, "#6");
+                       Assert.IsNotNull (r.Model, "#6");
                        Assert.IsNull (r.RouteHandler.Model, "#7"); // irrelevant to route's MetaModel
                }
 
                [Test]
                [ExpectedException (typeof (ArgumentNullException))]
                [Category ("NotDotNet")] // .NET throws NRE. yuck.
+#if TARGET_DOTNET
+               [Ignore ("Throws a NREX on .NET...")]
+#endif
                public void GetActionFromRouteDataNullArg ()
                {
                        new DynamicDataRoute ("x").GetActionFromRouteData (null);
@@ -87,7 +121,7 @@ namespace MonoTests.System.Web.DynamicData
                {
                        var r = new DynamicDataRoute ("x");
                        var rd = new RouteData ();
-                       rd.Values ["Action"] = "y";
+                       rd.Values["Action"] = "y";
                        var a = r.GetActionFromRouteData (rd);
                        Assert.AreEqual ("y", a);
                }
@@ -95,6 +129,9 @@ namespace MonoTests.System.Web.DynamicData
                [Test]
                [ExpectedException (typeof (ArgumentNullException))]
                [Category ("NotDotNet")] // .NET throws NRE. yuck.
+#if TARGET_DOTNET
+               [Ignore ("Throws a NREX on .NET...")]
+#endif
                public void GetTableFromRouteDataNullArg ()
                {
                        new DynamicDataRoute ("x").GetTableFromRouteData (null);
@@ -117,29 +154,377 @@ namespace MonoTests.System.Web.DynamicData
                        var r = new DynamicDataRoute ("x");
                        r.Model = new MetaModel ();
                        var rd = new RouteData ();
-                       rd.Values ["Table"] = "y";
+                       rd.Values["Table"] = "y";
                        r.GetTableFromRouteData (rd); // no such table
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void GetTableFromRouteData3 ()
                {
                        var r = new DynamicDataRoute ("x");
-                       r.Model.RegisterContext (typeof (MyDataContext3));
                        var rd = new RouteData ();
-                       rd.Values ["Table"] = "FooTable";
+                       rd.Values["Table"] = "FooTable";
                        var t = r.GetTableFromRouteData (rd);
                }
 
                [Test]
-               [Ignore ("it requires working HttpContext, and it's somehow not working on both mono and .net")]
                public void GetRouteData ()
                {
                        var r = new DynamicDataRoute ("{table}/{action}.aspx");
-                       HttpContext.Current = new HttpContext (new MyHttpWorkerRequest ());
-                       RouteData rd = r.GetRouteData (new HttpContextStub ("~/FooTable/List.aspx", String.Empty));
-                       Assert.IsNotNull (rd.RouteHandler, "#1");
+
+                       // We need one which overloads CreateHandler
+                       r.RouteHandler = new MyDynamicDataRouteHandler ();
+
+                       var wrapper = new MyHttpContextWrapper ();
+                       var request = wrapper.Request as MyHttpRequestWrapper;
+                       request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/NoSuchTable/List.aspx");
+                       request.SetProperty ("PathInfo", String.Empty);
+
+                       // This must be non-null because DynamicData doesn't care to check whether the returned
+                       // value is null or not...
+                       request.SetProperty ("QueryString", new NameValueCollection ());
+
+                       // It appears .NET checks whether the indicated table exists - if not, GetRouteData will return
+                       // null (even though the Route class will find a match)
+                       RouteData rd = r.GetRouteData (wrapper);
+                       Assert.IsNull (rd, "#A1");
+
+                       request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/BazTable/List.aspx");
+                       rd = r.GetRouteData (wrapper);
+                       Assert.IsNotNull (rd, "#B1");
+               }
+
+               [Test]
+               public void RouteHandler ()
+               {
+                       var r = new DynamicDataRoute ("{table}/{action}.aspx");
+
+                       Assert.IsNotNull (r.RouteHandler, "#A1");
+                       Assert.AreEqual (typeof (DynamicDataRouteHandler), r.RouteHandler.GetType (), "#A1-1");
+
+                       r.RouteHandler = null;
+                       Assert.IsNull (r.RouteHandler, "#A2");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_1 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Action = PageAction.Details,
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#B1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
+                       Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
+
+                       ddr.Action = "MyAction";
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#C1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
+                       Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_2 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Table = "BazTable",
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#B1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
+                       Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#B1-2");
+
+                       ddr.Table = "AnotherTable";
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#C1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
+                       Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#C1-2");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_3 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Table = "MyTable",
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+                       routes.Add (ddr);
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+                       
+                       AssertExtensions.Throws <ArgumentException> (() => {
+                               ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       }, "#A1");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_4 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+                       routes.Add (ddr);
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       Assert.IsNull (ddr.Defaults, "#A1");
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNull (ddr.Defaults, "#A2");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_5 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Action = null,
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNull (ddr.Defaults, "#B1");
+                       
+                       ddr.Action = "MyAction";
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNull (ddr.Defaults, "#C1");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_6 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Action = String.Empty,
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#B1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
+                       Assert.AreEqual (String.Empty, ddr.Defaults["Action"], "#B1-2");
+
+                       ddr.Action = "MyAction";
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#C1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
+                       Assert.AreEqual (String.Empty, ddr.Defaults["Action"], "#B1-2");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_7 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Table = null,
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNull (ddr.Defaults, "#B1");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_8 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Table = String.Empty,
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       AssertExtensions.Throws<ArgumentException> (() => {
+                               ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       }, "#A1");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_9 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Defaults = new RouteValueDictionary () {
+                                       {"Action", "InitialAction"}
+                               },
+                               Action = PageAction.Details,
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNotNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#B1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
+                       Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
+
+                       ddr.Action = "MyAction";
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#C1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
+                       Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2");
+               }
+
+               [Test]
+               public void BaseDefaultsModification_10 ()
+               {
+                       MetaModel m = MetaModel.Default;
+                       var req = new FakeHttpWorkerRequest ();
+                       var ctx = new HttpContext (req);
+                       HttpContext.Current = ctx;
+
+                       RouteCollection routes = RouteTable.Routes;
+                       routes.Clear ();
+
+                       var ddr = new DynamicDataRoute ("{table}/{action}.aspx") {
+                               Defaults = new RouteValueDictionary () {
+                                       {"Table", "FooWithDefaultsTable"}
+                               },
+                               Table = "BazTable",
+                               Model = m,
+                               RouteHandler = new MyDynamicDataRouteHandler ()
+                       };
+
+                       routes.Add (ddr);
+
+                       Assert.IsNotNull (ddr, "#A1");
+                       Assert.IsNotNull (ddr.Defaults, "#A1-1");
+                       var rd = new RouteData ();
+                       var hc = new HttpContextWrapper (HttpContext.Current);
+
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#B1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1");
+                       Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#B1-2");
+
+                       ddr.Table = "AnotherTable";
+                       ddr.GetVirtualPath (new RequestContext (hc, rd), null);
+                       Assert.IsNotNull (ddr.Defaults, "#C1");
+                       Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1");
+                       Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#C1-2");
                }
        }
 }