using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Threading; using System.Xml; using NUnit.Framework; using SqlCE4Umbraco; using Umbraco.Core; using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Media.ThumbnailProviders; using Umbraco.Web.Routing; using umbraco.BusinessLogic; using umbraco.DataLayer; using umbraco.IO; using umbraco.cms.businesslogic.cache; using umbraco.cms.businesslogic.language; using umbraco.cms.businesslogic.template; using umbraco.cms.businesslogic.web; using GlobalSettings = umbraco.GlobalSettings; namespace Umbraco.Tests { [TestFixture, RequiresSTA] public class UmbracoModuleTests { private UmbracoModule _module; [SetUp] public void Initialize() { TestHelper.SetupLog4NetForTests(); ApplicationContext.Current = new ApplicationContext() { IsReady = true }; _module = new UmbracoModule(); ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", Umbraco.Core.Configuration.GlobalSettings.CurrentVersion); ConfigurationManager.AppSettings.Set("umbracoReservedPaths", "~/umbraco,~/install/"); ConfigurationManager.AppSettings.Set("umbracoReservedUrls", "~/config/splashes/booting.aspx,~/install/default.aspx,~/config/splashes/noNodes.aspx,~/VSEnterpriseHelper.axd"); Cache.ClearAllCache(); InitializeDatabase(); //create the not found handlers config using(var sw = File.CreateText(IOHelper.MapPath(SystemFiles.NotFoundhandlersConfig, false))) { sw.Write(@" "); } } [TearDown] public void TearDown() { _module.Dispose(); //reset the context on global settings Umbraco.Core.Configuration.GlobalSettings.HttpContext = null; //reset the app context ApplicationContext.Current = null; //reset the app config ConfigurationManager.AppSettings.Set("umbracoConfigurationStatus", ""); ConfigurationManager.AppSettings.Set("umbracoReservedPaths", ""); ConfigurationManager.AppSettings.Set("umbracoReservedUrls", ""); ClearDatabase(); Cache.ClearAllCache(); } private void ClearDatabase() { var dataHelper = DataLayerHelper.CreateSqlHelper(GlobalSettings.DbDSN) as SqlCEHelper; if (dataHelper == null) throw new InvalidOperationException("The sql helper for unit tests must be of type SqlCEHelper, check the ensure the connection string used for this test is set to use SQLCE"); dataHelper.ClearDatabase(); } private void InitializeDatabase() { ConfigurationManager.AppSettings.Set("umbracoDbDSN", @"datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;data source=|DataDirectory|\Umbraco.sdf"); ClearDatabase(); var dataHelper = DataLayerHelper.CreateSqlHelper(GlobalSettings.DbDSN); var installer = dataHelper.Utility.CreateInstaller(); if (installer.CanConnect) { installer.Install(); } } /// /// Initlializes the UmbracoContext with specific XML /// /// /// private void SetupUmbracoContextForTest(UmbracoContext umbracoContext, Template template) { umbracoContext.GetXmlDelegate = () => { var xDoc = new XmlDocument(); //create a custom xml structure to return xDoc.LoadXml(@" ]> "); //return the custom x doc return xDoc; }; } [TestCase("/umbraco_client/Tree/treeIcons.css", false)] [TestCase("/umbraco_client/Tree/Themes/umbraco/style.css?cdv=37", false)] [TestCase("/umbraco_client/scrollingmenu/style.css?cdv=37", false)] [TestCase("/umbraco/umbraco.aspx", false)] [TestCase("/umbraco/editContent.aspx", false)] [TestCase("/install/default.aspx", false)] [TestCase("/install/test.aspx", false)] [TestCase("/base/somebasehandler", false)] [TestCase("/", true)] [TestCase("/home.aspx", true)] public void Ensure_Request_Routable(string url, bool assert) { var httpContextFactory = new FakeHttpContextFactory(url); var httpContext = httpContextFactory.HttpContext; //set the context on global settings Umbraco.Core.Configuration.GlobalSettings.HttpContext = httpContext; var uri = httpContext.Request.Url; var lpath = uri.AbsolutePath.ToLower(); var result = _module.EnsureUmbracoRoutablePage(uri, lpath, httpContext); Assert.AreEqual(assert, result); } [TestCase("/favicon.ico", true)] [TestCase("/umbraco_client/Tree/treeIcons.css", true)] [TestCase("/umbraco_client/Tree/Themes/umbraco/style.css?cdv=37", true)] [TestCase("/umbraco_client/scrollingmenu/style.css?cdv=37", true)] [TestCase("/base/somebasehandler", false)] [TestCase("/", false)] [TestCase("/home.aspx", false)] public void Is_Client_Side_Request(string url, bool assert) { var uri = new Uri("http://test.com" + url); var result = _module.IsClientSideRequest(uri); Assert.AreEqual(assert, result); } //NOTE: This test shows how we can test most of the HttpModule, it however is testing too much, // we need to write unit tests for each of the components: NiceUrlProvider, all of the Lookup classes, etc... // to ensure that each one is individually tested. [TestCase("/", 1046)] [TestCase("/home.aspx", 1046)] [TestCase("/home/sub1.aspx", 1173)] [TestCase("/home.aspx?altTemplate=blah", 1046)] public void Process_Front_End_Document_Request_Match_Node(string url, int nodeId) { var httpContextFactory = new FakeHttpContextFactory(url); var httpContext = httpContextFactory.HttpContext; var umbracoContext = new UmbracoContext(httpContext, ApplicationContext.Current, new NullRoutesCache()); var contentStore = new ContentStore(umbracoContext); var niceUrls = new NiceUrlProvider(contentStore, umbracoContext); umbracoContext.RoutingContext = new RoutingContext( new IDocumentLookup[] {new LookupByNiceUrl()}, new DefaultLastChanceLookup(), contentStore, niceUrls); StateHelper.HttpContext = httpContext; //because of so much dependency on the db, we need to create som stuff here, i originally abstracted out stuff but //was turning out to be quite a deep hole because ultimately we'd have to abstract the old 'Domain' and 'Language' classes Domain.MakeNew("Test.com", 1000, Language.GetByCultureCode("en-US").id); //need to create a template with id 1045 var template = Template.MakeNew("test", new User(0)); SetupUmbracoContextForTest(umbracoContext, template); _module.AssignDocumentRequest(httpContext, umbracoContext, httpContext.Request.Url); Assert.IsNotNull(umbracoContext.DocumentRequest); Assert.IsNotNull(umbracoContext.DocumentRequest.Node); Assert.IsFalse(umbracoContext.DocumentRequest.IsRedirect); Assert.IsFalse(umbracoContext.DocumentRequest.Is404); Assert.AreEqual(umbracoContext.DocumentRequest.Culture, Thread.CurrentThread.CurrentCulture); Assert.AreEqual(umbracoContext.DocumentRequest.Culture, Thread.CurrentThread.CurrentUICulture); Assert.AreEqual(nodeId, umbracoContext.DocumentRequest.NodeId); } /// /// Used for testing, does not cache anything /// private class NullRoutesCache : IRoutesCache { public void Store(int nodeId, string route) { } public string GetRoute(int nodeId) { return null; //default; } public int GetNodeId(string route) { return 0; //default; } public void ClearNode(int nodeId) { } public void Clear() { } } } }