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()
{
}
}
}
}