diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs index 9855cf38ed..eb20a92e74 100644 --- a/src/Umbraco.Core/Configuration/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs @@ -498,9 +498,14 @@ namespace Umbraco.Core.Configuration { get { - if (HttpContext != null) - return bool.Parse(ConfigurationManager.AppSettings["umbracoHideTopLevelNodeFromPath"]); - return false; + try + { + return bool.Parse(ConfigurationManager.AppSettings["umbracoHideTopLevelNodeFromPath"]); + } + catch + { + return false; + } } } diff --git a/src/Umbraco.Tests/DynamicDocument/DynamicDocumentTests.cs b/src/Umbraco.Tests/DynamicDocument/DynamicDocumentTests.cs index 666b98b5dc..40aec8da96 100644 --- a/src/Umbraco.Tests/DynamicDocument/DynamicDocumentTests.cs +++ b/src/Umbraco.Tests/DynamicDocument/DynamicDocumentTests.cs @@ -53,7 +53,7 @@ namespace Umbraco.Tests.DynamicDocument protected override dynamic GetDynamicNode(int id) { var template = Template.MakeNew("test", new User(0)); - var ctx = GetUmbracoContext("/test", template); + var ctx = GetUmbracoContext("/test", template.Id); var contentStore = new XmlPublishedContentStore(); var doc = contentStore.GetDocumentById(ctx, id); Assert.IsNotNull(doc); diff --git a/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs b/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs index d21e3ad34d..020451936a 100644 --- a/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs +++ b/src/Umbraco.Tests/DynamicDocument/DynamicNodeTests.cs @@ -34,7 +34,7 @@ namespace Umbraco.Tests.DynamicDocument protected override dynamic GetDynamicNode(int id) { var template = Template.MakeNew("test", new User(0)); - var ctx = GetUmbracoContext("/test", template); + var ctx = GetUmbracoContext("/test", template.Id); var contentStore = new XmlPublishedContentStore(); var node = new DynamicNode( new DynamicBackingItem( diff --git a/src/Umbraco.Tests/Routing/BaseRoutingTest.cs b/src/Umbraco.Tests/Routing/BaseRoutingTest.cs index ea99d55bad..eb489b01d0 100644 --- a/src/Umbraco.Tests/Routing/BaseRoutingTest.cs +++ b/src/Umbraco.Tests/Routing/BaseRoutingTest.cs @@ -23,11 +23,21 @@ namespace Umbraco.Tests.Routing base.TearDown(); ConfigurationManager.AppSettings.Set("umbracoHideTopLevelNodeFromPath", ""); - } + } - protected RoutingContext GetRoutingContext(string url, Template template, RouteData routeData = null) + /// + /// Return a new RoutingContext + /// + /// + /// + /// The template Id to insert into the Xml cache file for each node, this is helpful for unit testing with templates but you + /// should normally create the template in the database with this id + /// + /// + /// + protected RoutingContext GetRoutingContext(string url, int templateId, RouteData routeData = null) { - var umbracoContext = GetUmbracoContext(url, template, routeData); + var umbracoContext = GetUmbracoContext(url, templateId, routeData); var contentStore = new XmlPublishedContentStore(); var niceUrls = new NiceUrlProvider(contentStore, umbracoContext); var routingRequest = new RoutingContext( @@ -39,6 +49,29 @@ namespace Umbraco.Tests.Routing return routingRequest; } + /// + /// Return a new RoutingContext + /// + /// + /// + /// + /// + protected RoutingContext GetRoutingContext(string url, Template template, RouteData routeData = null) + { + return GetRoutingContext(url, template.Id, routeData); + } + + /// + /// Return a new RoutingContext that doesn't require testing based on template + /// + /// + /// + /// + protected RoutingContext GetRoutingContext(string url, RouteData routeData = null) + { + return GetRoutingContext(url, 1234, routeData); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Routing/LookupByAliasTests.cs b/src/Umbraco.Tests/Routing/LookupByAliasTests.cs index 0f71362b78..4b524f5a76 100644 --- a/src/Umbraco.Tests/Routing/LookupByAliasTests.cs +++ b/src/Umbraco.Tests/Routing/LookupByAliasTests.cs @@ -8,6 +8,15 @@ namespace Umbraco.Tests.Routing [TestFixture] public class LookupByAliasTests : BaseRoutingTest { + + /// + /// We don't need a db for this test, will run faster without one + /// + protected override bool RequiresDbSetup + { + get { return false; } + } + [TestCase("/this/is/my/alias", 1046)] [TestCase("/anotheralias", 1046)] [TestCase("/page2/alias", 1173)] @@ -16,8 +25,7 @@ namespace Umbraco.Tests.Routing [TestCase("/ONLY/one/Alias", 1174)] public void Lookup_By_Url_Alias(string urlAsString, int nodeMatch) { - var template = Template.MakeNew("test", new User(0)); - var routingContext = GetRoutingContext(urlAsString, template); + var routingContext = GetRoutingContext(urlAsString); var url = routingContext.UmbracoContext.UmbracoUrl; //very important to use the cleaned up umbraco url var docRequest = new DocumentRequest(url, routingContext); var lookup = new LookupByAlias(); diff --git a/src/Umbraco.Tests/Routing/LookupByIdTests.cs b/src/Umbraco.Tests/Routing/LookupByIdTests.cs index cee11afc1e..e592a37ca7 100644 --- a/src/Umbraco.Tests/Routing/LookupByIdTests.cs +++ b/src/Umbraco.Tests/Routing/LookupByIdTests.cs @@ -8,12 +8,19 @@ namespace Umbraco.Tests.Routing [TestFixture] public class LookupByIdTests : BaseRoutingTest { + /// + /// We don't need a db for this test, will run faster without one + /// + protected override bool RequiresDbSetup + { + get { return false; } + } + [TestCase("/1046", 1046)] [TestCase("/1046.aspx", 1046)] public void Lookup_By_Id(string urlAsString, int nodeMatch) { - var template = Template.MakeNew("test", new User(0)); - var routingContext = GetRoutingContext(urlAsString, template); + var routingContext = GetRoutingContext(urlAsString); var url = routingContext.UmbracoContext.UmbracoUrl; //very important to use the cleaned up umbraco url var docRequest = new DocumentRequest(url, routingContext); var lookup = new LookupByIdPath(); diff --git a/src/Umbraco.Tests/Routing/LookupByNiceUrlTests.cs b/src/Umbraco.Tests/Routing/LookupByNiceUrlTests.cs index e3c05e14b1..0af2460b88 100644 --- a/src/Umbraco.Tests/Routing/LookupByNiceUrlTests.cs +++ b/src/Umbraco.Tests/Routing/LookupByNiceUrlTests.cs @@ -10,6 +10,14 @@ namespace Umbraco.Tests.Routing public class LookupByNiceUrlTests : BaseRoutingTest { + /// + /// We don't need a db for this test, will run faster without one + /// + protected override bool RequiresDbSetup + { + get { return false; } + } + [TestCase("/")] [TestCase("/default.aspx")] //this one is actually rather important since this is the path that comes through when we are running in pre-IIS 7 for the root document '/' ! [TestCase("/Sub1")] @@ -17,8 +25,7 @@ namespace Umbraco.Tests.Routing [TestCase("/sub1.aspx")] public void Match_Document_By_Url_Hide_Top_Level(string urlAsString) { - var template = Template.MakeNew("test", new User(0)); - var routingContext = GetRoutingContext(urlAsString, template); + var routingContext = GetRoutingContext(urlAsString); var url = routingContext.UmbracoContext.UmbracoUrl; //very important to use the cleaned up umbraco url var docRequest = new DocumentRequest(url, routingContext); var lookup = new LookupByNiceUrl(); @@ -37,8 +44,7 @@ namespace Umbraco.Tests.Routing [TestCase("/home/Sub1.aspx")] public void Match_Document_By_Url(string urlAsString) { - var template = Template.MakeNew("test", new User(0)); - var routingContext = GetRoutingContext(urlAsString, template); + var routingContext = GetRoutingContext(urlAsString); var url = routingContext.UmbracoContext.UmbracoUrl; //very important to use the cleaned up umbraco url var docRequest = new DocumentRequest(url, routingContext); var lookup = new LookupByNiceUrl(); diff --git a/src/Umbraco.Tests/Routing/LookupByPageIdQueryTests.cs b/src/Umbraco.Tests/Routing/LookupByPageIdQueryTests.cs index 53cbf3ec10..d68ac45d8c 100644 --- a/src/Umbraco.Tests/Routing/LookupByPageIdQueryTests.cs +++ b/src/Umbraco.Tests/Routing/LookupByPageIdQueryTests.cs @@ -9,18 +9,22 @@ namespace Umbraco.Tests.Routing [TestFixture] public class LookupByPageIdQueryTests : BaseRoutingTest { + /// + /// We don't need a db for this test, will run faster without one + /// + protected override bool RequiresDbSetup + { + get { return false; } + } + [TestCase("/?umbPageId=1046", 1046)] [TestCase("/?UMBPAGEID=1046", 1046)] [TestCase("/default.aspx?umbPageId=1046", 1046)] //TODO: Should this match?? [TestCase("/some/other/page?umbPageId=1046", 1046)] //TODO: Should this match?? [TestCase("/some/other/page.aspx?umbPageId=1046", 1046)] //TODO: Should this match?? public void Lookup_By_Page_Id(string urlAsString, int nodeMatch) - { - - - - var template = Template.MakeNew("test", new User(0)); - var routingContext = GetRoutingContext(urlAsString, template); + { + var routingContext = GetRoutingContext(urlAsString); var url = routingContext.UmbracoContext.UmbracoUrl; //very important to use the cleaned up umbraco url var docRequest = new DocumentRequest(url, routingContext); var lookup = new LookupByPageIdQuery(); diff --git a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs new file mode 100644 index 0000000000..b5737d1d30 --- /dev/null +++ b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs @@ -0,0 +1,85 @@ +using System.Configuration; +using NUnit.Framework; + +namespace Umbraco.Tests.Routing +{ + [TestFixture] + public class NiceUrlProviderTests : BaseRoutingTest + { + + [TestCase(1046, "/home.aspx")] + [TestCase(1173, "/home/sub1.aspx")] + [TestCase(1174, "/home/sub1/sub2.aspx")] + [TestCase(1176, "/home/sub1/sub-3.aspx")] + [TestCase(1177, "/home/sub1/custom-sub-1.aspx")] + [TestCase(1178, "/home/sub1/custom-sub-2.aspx")] + [TestCase(1175, "/home/sub-2.aspx")] + [TestCase(1172, "/test-page.aspx")] + public void Get_Nice_Url_Not_Hiding_Top_Level_No_Directory_Urls(int nodeId, string niceUrlMatch) + { + var routingContext = GetRoutingContext("/test", 1111); + + var result = routingContext.NiceUrlProvider.GetNiceUrl(nodeId); + + Assert.AreEqual(niceUrlMatch, result); + } + + [TestCase(1046, "/home")] + [TestCase(1173, "/home/sub1")] + [TestCase(1174, "/home/sub1/sub2")] + [TestCase(1176, "/home/sub1/sub-3")] + [TestCase(1177, "/home/sub1/custom-sub-1")] + [TestCase(1178, "/home/sub1/custom-sub-2")] + [TestCase(1175, "/home/sub-2")] + [TestCase(1172, "/test-page")] + public void Get_Nice_Url_Not_Hiding_Top_Level_With_Directory_Urls(int nodeId, string niceUrlMatch) + { + var routingContext = GetRoutingContext("/test", 1111); + + ConfigurationManager.AppSettings.Set("umbracoUseDirectoryUrls", "true"); + + var result = routingContext.NiceUrlProvider.GetNiceUrl(nodeId); + + Assert.AreEqual(niceUrlMatch, result); + } + + [TestCase(1046, "/")] + [TestCase(1173, "/sub1.aspx")] + [TestCase(1174, "/sub1/sub2.aspx")] + [TestCase(1176, "/sub1/sub-3.aspx")] + [TestCase(1177, "/sub1/custom-sub-1.aspx")] + [TestCase(1178, "/sub1/custom-sub-2.aspx")] + [TestCase(1175, "/sub-2.aspx")] + [TestCase(1172, "/test-page.aspx")] + public void Get_Nice_Url_Hiding_Top_Level_No_Directory_Urls(int nodeId, string niceUrlMatch) + { + var routingContext = GetRoutingContext("/test", 1111); + + ConfigurationManager.AppSettings.Set("umbracoHideTopLevelNodeFromPath", "true"); + + var result = routingContext.NiceUrlProvider.GetNiceUrl(nodeId); + + Assert.AreEqual(niceUrlMatch, result); + } + + [TestCase(1046, "/")] + [TestCase(1173, "/sub1")] + [TestCase(1174, "/sub1/sub2")] + [TestCase(1176, "/sub1/sub-3")] + [TestCase(1177, "/sub1/custom-sub-1")] + [TestCase(1178, "/sub1/custom-sub-2")] + [TestCase(1175, "/sub-2")] + [TestCase(1172, "/test-page")] + public void Get_Nice_Url_Hiding_Top_Level_With_Directory_Urls(int nodeId, string niceUrlMatch) + { + var routingContext = GetRoutingContext("/test", 1111); + + ConfigurationManager.AppSettings.Set("umbracoHideTopLevelNodeFromPath", "true"); + ConfigurationManager.AppSettings.Set("umbracoUseDirectoryUrls", "true"); + + var result = routingContext.NiceUrlProvider.GetNiceUrl(nodeId); + + Assert.AreEqual(niceUrlMatch, result); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs index 7211e81441..cfd41d6631 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -19,7 +19,8 @@ namespace Umbraco.Tests.TestHelpers public virtual void Initialize() { TestHelper.SetupLog4NetForTests(); - TestHelper.InitializeDatabase(); + if (RequiresDbSetup) + TestHelper.InitializeDatabase(); Resolution.Freeze(); ApplicationContext = new ApplicationContext() { IsReady = true }; } @@ -32,10 +33,19 @@ namespace Umbraco.Tests.TestHelpers //reset the context on global settings Umbraco.Core.Configuration.GlobalSettings.HttpContext = null; Resolution.IsFrozen = false; - TestHelper.ClearDatabase(); + if (RequiresDbSetup) + TestHelper.ClearDatabase(); Cache.ClearAllCache(); } + /// + /// By default this unit test will create and initialize an umbraco database + /// + protected virtual bool RequiresDbSetup + { + get { return true; } + } + protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) { var factory = routeData != null @@ -51,17 +61,17 @@ namespace Umbraco.Tests.TestHelpers protected ApplicationContext ApplicationContext { get; private set; } - protected UmbracoContext GetUmbracoContext(string url, Template template, RouteData routeData = null) + protected UmbracoContext GetUmbracoContext(string url, int templateId, RouteData routeData = null) { var ctx = new UmbracoContext( GetHttpContextFactory(url, routeData).HttpContext, ApplicationContext, new FakeRoutesCache()); - SetupUmbracoContextForTest(ctx, template); + SetupUmbracoContextForTest(ctx, templateId); return ctx; } - protected virtual string GetXmlContent(Template template) + protected virtual string GetXmlContent(int templateId) { return @" ]> - + 1 - + This is some content]]> - + - + - - + + - + - + "; } @@ -100,8 +110,8 @@ namespace Umbraco.Tests.TestHelpers /// Initlializes the UmbracoContext with specific XML /// /// - /// - protected void SetupUmbracoContextForTest(UmbracoContext umbracoContext, Template template) + /// + protected void SetupUmbracoContextForTest(UmbracoContext umbracoContext, int templateId) { umbracoContext.GetXmlDelegate = () => { @@ -109,7 +119,7 @@ namespace Umbraco.Tests.TestHelpers //create a custom xml structure to return - xDoc.LoadXml(GetXmlContent(template)); + xDoc.LoadXml(GetXmlContent(templateId)); //return the custom x doc return xDoc; }; diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index a38a046910..30300c8f4c 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -70,6 +70,7 @@ + diff --git a/src/Umbraco.Web/Routing/NiceUrlProvider.cs b/src/Umbraco.Web/Routing/NiceUrlProvider.cs index 355609022c..5938bd921e 100644 --- a/src/Umbraco.Web/Routing/NiceUrlProvider.cs +++ b/src/Umbraco.Web/Routing/NiceUrlProvider.cs @@ -97,7 +97,14 @@ namespace Umbraco.Web.Routing { pathParts.Add(_publishedContentStore.GetDocumentProperty(_umbracoContext, node, UrlNameProperty)); node = node.Parent; // set to parent node - id = int.Parse(_publishedContentStore.GetDocumentProperty(_umbracoContext, node, "@id")); // will be -1 or 1234 + if (node == null) + { + id = -1; + } + else + { + id = int.Parse(_publishedContentStore.GetDocumentProperty(_umbracoContext, node, "@id")); // will be -1 or 1234 + } domainUri = id > 0 ? DomainUriAtNode(id, current) : null; } diff --git a/src/umbraco.sln b/src/umbraco.sln index 7464b07fd9..661245f906 100644 --- a/src/umbraco.sln +++ b/src/umbraco.sln @@ -25,17 +25,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{FD962632-1 ..\docs\ReleaseNotes.txt = ..\docs\ReleaseNotes.txt EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Nant", "Nant", "{17E547B1-D89B-4C76-AB9C-F05888397FA4}" - ProjectSection(SolutionItems) = preProject - ..\build\Nant\aspnet35.build = ..\build\Nant\aspnet35.build - ..\build\Nant\aspnet35.config = ..\build\Nant\aspnet35.config - ..\build\Nant\build.xml = ..\build\Nant\build.xml - ..\build\Nant\default.build = ..\build\Nant\default.build - ..\build\Nant\nuget.build = ..\build\Nant\nuget.build - ..\build\Nant\umbraco weekly.build = ..\build\Nant\umbraco weekly.build - ..\build\Nant\umbraco.build = ..\build\Nant\umbraco.build - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Web", "Umbraco.Web\Umbraco.Web.csproj", "{651E1350-91B6-44B7-BD60-7207006D7003}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "umbraco.businesslogic", "umbraco.businesslogic\umbraco.businesslogic.csproj", "{E469A9CE-1BEC-423F-AC44-713CD72457EA}" @@ -154,7 +143,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {17E547B1-D89B-4C76-AB9C-F05888397FA4} = {2849E9D4-3B4E-40A3-A309-F3CB4F0E125F} {6277C9FB-3A9A-4537-AA86-82DA9B2527FD} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} {5D3B8245-ADA6-453F-A008-50ED04BFE770} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} EndGlobalSection