Skip to content

Commit df5332c

Browse files
author
Simonas Mikulenas
committed
Merge branch 'dev'
2 parents 537c027 + 2c9e557 commit df5332c

30 files changed

+849
-294
lines changed

BetterModules.Core.Web.Tests/BetterModules.Core.Web.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
<Compile Include="Properties\AssemblyInfo.cs" />
114114
<Compile Include="Security\DefaultWebPrincipalProviderTests.cs" />
115115
<Compile Include="Services\Caching\HttpRuntimeCacheServiceTests.cs" />
116+
<Compile Include="TestHelpers\ContextScopeProviderHelper.cs" />
116117
<Compile Include="TestHelpers\HttpContextMoq.cs" />
117118
<Compile Include="TestHelpers\RandomTestDataProvider.cs" />
118119
<Compile Include="TestBase.cs" />
Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
using System.Collections.Generic;
2-
using System.Linq;
32
using System.Web;
43
using System.Web.Routing;
54

6-
using BetterModules.Core.DataAccess.DataContext.Migrations;
7-
using BetterModules.Core.Modules;
8-
using BetterModules.Core.Modules.Registration;
5+
using BetterModules.Core.Tests.TestHelpers;
96
using BetterModules.Core.Web.Environment.Host;
107
using BetterModules.Core.Web.Modules.Registration;
118

@@ -24,58 +21,40 @@ public class DefaultWebApplicationHostTests : TestBase
2421
private bool eventFired;
2522

2623
[Test]
27-
public void ShouldExecute_OnApplicationStart_Correctly()
24+
public void ShouldExecute_Init_Correctly()
2825
{
2926
eventFired = false;
3027
var routesRegistered = false;
31-
var databaseMigrated = false;
32-
33-
var registration = new Mock<IWebModulesRegistration>();
34-
registration
35-
.Setup(r => r.RegisterKnownModuleRoutes(It.IsAny<RouteCollection>()))
36-
.Callback<RouteCollection>(rc => routesRegistered = true);
37-
38-
var moduleDescriptor1 = new ModuleRegistrationContext(new Mock<ModuleDescriptor>().Object);
39-
var moduleDescriptor2 = new ModuleRegistrationContext(new Mock<ModuleDescriptor>().Object);
40-
41-
registration
42-
.Setup(r => r.GetModules())
43-
.Returns(() => new[] { moduleDescriptor1, moduleDescriptor2 });
44-
45-
var migrationRunner = new Mock<IMigrationRunner>();
46-
migrationRunner
47-
.Setup(r => r.MigrateStructure(It.IsAny<IList<ModuleDescriptor>>()))
48-
.Callback<IList<ModuleDescriptor>>(
49-
descriptors =>
50-
{
51-
Assert.AreEqual(descriptors.Count, 2);
52-
Assert.IsTrue(descriptors.Any(d => d == moduleDescriptor1.ModuleDescriptor));
53-
Assert.IsTrue(descriptors.Any(d => d == moduleDescriptor2.ModuleDescriptor));
54-
55-
databaseMigrated = true;
56-
});
57-
58-
var host = new DefaultWebApplicationHost(registration.Object, migrationRunner.Object);
59-
CreateApplication();
6028

61-
WebCoreEvents.Instance.HostStart += Instance_Fired;
62-
host.OnApplicationStart(application);
63-
WebCoreEvents.Instance.HostStart -= Instance_Fired;
29+
using (var fakeProvider = new ContextScopeProviderHelper())
30+
{
31+
32+
var registration = new Mock<IWebModulesRegistration>();
33+
registration
34+
.Setup(r => r.RegisterKnownModuleRoutes(It.IsAny<RouteCollection>()))
35+
.Callback<RouteCollection>(rc => routesRegistered = true);
36+
fakeProvider.RegisterFakeServiceInstance(registration.Object, typeof (IWebModulesRegistration));
37+
38+
var host = new UtilityHost();
39+
CreateApplication();
6440

41+
WebCoreEvents.Instance.HostStart += Instance_Fired;
42+
host.Init(application);
43+
WebCoreEvents.Instance.HostStart -= Instance_Fired;
44+
}
6545
Assert.IsTrue(eventFired);
6646
Assert.IsTrue(routesRegistered);
67-
Assert.IsTrue(databaseMigrated);
6847
}
6948

7049
[Test]
71-
public void ShouldExecute_OnApplicationEnd_Correctly()
50+
public void ShouldExecute_Dispose_Correctly()
7251
{
73-
var host = CreateHost();
52+
var host = new UtilityHost();
7453
CreateApplication();
7554
eventFired = false;
76-
55+
host.Init(application);
7756
WebCoreEvents.Instance.HostStop += Instance_Fired;
78-
host.OnApplicationEnd(application);
57+
host.Dispose();
7958
WebCoreEvents.Instance.HostStop -= Instance_Fired;
8059

8160
Assert.IsTrue(eventFired);
@@ -119,17 +98,38 @@ void Instance_Fired(SingleItemEventArgs<HttpApplication> args)
11998

12099
private IWebApplicationHost CreateHost()
121100
{
122-
var registration = new Mock<IWebModulesRegistration>();
123-
var migrationRunner = new Mock<IMigrationRunner>();
124-
125-
var host = new DefaultWebApplicationHost(registration.Object, migrationRunner.Object);
126-
101+
var host = new UtilityHost();
127102
return host;
128103
}
129104

130105
private void CreateApplication()
131106
{
132107
application = new Mock<HttpApplication>().Object;
133108
}
109+
110+
private class EventTestApplicationAutoHost : DefaultWebApplicationAutoHost
111+
{
112+
public List<string> Results = new List<string>();
113+
114+
public override void OnAuthenticateRequest(HttpApplication application)
115+
{
116+
Results.Add("OnAuthenticateRequest");
117+
}
118+
119+
public override void OnBeginRequest(HttpApplication application)
120+
{
121+
Results.Add("OnBeginRequest");
122+
}
123+
124+
public override void OnEndRequest(HttpApplication application)
125+
{
126+
Results.Add("OnEndRequest");
127+
}
128+
129+
public override void OnApplicationError(HttpApplication application)
130+
{
131+
Results.Add("OnApplicationError");
132+
}
133+
}
134134
}
135135
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Autofac;
5+
using BetterModules.Core.Dependencies;
6+
7+
namespace BetterModules.Core.Tests.TestHelpers
8+
{
9+
public class ContextScopeProviderHelper : IDisposable
10+
{
11+
private IDictionary<Type, Type> originalObjects = new Dictionary<Type, Type>();
12+
13+
public void RegisterFakeService(Type type, Type interfaceType)
14+
{
15+
using (var container = ContextScopeProvider.CreateChildContainer())
16+
{
17+
var service = container.Resolve(interfaceType);
18+
if (!originalObjects.ContainsKey(interfaceType))
19+
{
20+
originalObjects.Add(interfaceType, service.GetType());
21+
}
22+
}
23+
24+
var builder = new ContainerBuilder();
25+
builder.RegisterType(type).As(interfaceType).InstancePerLifetimeScope();
26+
27+
ContextScopeProvider.RegisterTypes(builder);
28+
}
29+
30+
public void RegisterFakeServiceInstance(Object type, Type interfaceType)
31+
{
32+
using (var container = ContextScopeProvider.CreateChildContainer())
33+
{
34+
var service = container.Resolve(interfaceType);
35+
if (!originalObjects.ContainsKey(interfaceType))
36+
{
37+
originalObjects.Add(interfaceType, service.GetType());
38+
}
39+
}
40+
41+
var builder = new ContainerBuilder();
42+
builder.RegisterInstance(type).As(interfaceType).SingleInstance();
43+
44+
ContextScopeProvider.RegisterTypes(builder);
45+
}
46+
47+
public void Dispose()
48+
{
49+
if (!originalObjects.Any())
50+
{
51+
return;
52+
}
53+
54+
var builder = new ContainerBuilder();
55+
foreach (var keyValue in originalObjects)
56+
{
57+
builder.RegisterType(keyValue.Value).As(keyValue.Key).InstancePerLifetimeScope();
58+
}
59+
60+
ContextScopeProvider.RegisterTypes(builder);
61+
}
62+
}
63+
}

BetterModules.Core.Web/BetterModules.Core.Web.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,20 @@
9090
<Compile Include="Configuration\IWebConfiguration.cs" />
9191
<Compile Include="Dependencies\PerWebRequestContainerProvider.cs" />
9292
<Compile Include="Dependencies\PerWebRequestLifetimeModule.cs" />
93+
<Compile Include="Environment\Application\BaseActivationMethodAttribute.cs" />
94+
<Compile Include="Environment\Application\BaseAttribute.cs" />
95+
<Compile Include="Environment\Application\WebApplicationHostAttribute.cs" />
96+
<Compile Include="Environment\Host\IWebApplicationAutoHost.cs" />
97+
<Compile Include="Environment\Host\DefaultWebApplicationAutoHost.cs" />
9398
<Compile Include="Environment\Application\WebApplicationEntryPoint.cs" />
9499
<Compile Include="Environment\Application\WebApplicationPreStartAttribute.cs" />
95100
<Compile Include="Environment\Application\WebApplicationPreStartManager.cs" />
96101
<Compile Include="Environment\Host\DefaultWebApplicationHost.cs" />
97102
<Compile Include="Environment\Host\IWebApplicationHost.cs" />
103+
<Compile Include="Environment\Host\UtilityHost.cs" />
98104
<Compile Include="Events\WebCoreEvents.cs" />
99105
<Compile Include="Exceptions\Host\RestartApplicationException.cs" />
106+
<Compile Include="Extensions\AssemblyExtensions.cs" />
100107
<Compile Include="Models\ComboWireJson.cs" />
101108
<Compile Include="Models\UserMessages.cs" />
102109
<Compile Include="Models\WireJson.cs" />
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Reflection;
3+
4+
namespace BetterModules.Core.Web.Environment.Application
5+
{
6+
/// <summary>
7+
/// Base class of all the activation attributes
8+
/// Based on: https://github.com/davidebbo/WebActivator
9+
/// </summary>
10+
11+
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
12+
public abstract class BaseActivationMethodAttribute : BaseAttribute
13+
{
14+
private string _methodName;
15+
16+
public BaseActivationMethodAttribute(Type type, string methodName) : base(type)
17+
{
18+
_methodName = methodName;
19+
}
20+
21+
public string MethodName
22+
{
23+
get
24+
{
25+
return _methodName;
26+
}
27+
}
28+
29+
public void InvokeMethod()
30+
{
31+
// Get the method
32+
MethodInfo method = Type.GetMethod(
33+
MethodName,
34+
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
35+
36+
if (method == null)
37+
{
38+
throw new ArgumentException(
39+
String.Format("The type {0} doesn't have a static method named {1}",
40+
Type, MethodName));
41+
}
42+
43+
// Invoke it
44+
method.Invoke(null, null);
45+
}
46+
47+
public virtual bool ShouldRunInDesignerMode()
48+
{
49+
return false;
50+
}
51+
}
52+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
3+
namespace BetterModules.Core.Web.Environment.Application
4+
{
5+
[AttributeUsage(AttributeTargets.Assembly)]
6+
public abstract class BaseAttribute : Attribute
7+
{
8+
private Type _type;
9+
public Type Type
10+
{
11+
get
12+
{
13+
return _type;
14+
}
15+
}
16+
17+
public int Order { get; set; }
18+
public BaseAttribute(Type type)
19+
{
20+
_type = type;
21+
}
22+
}
23+
}

BetterModules.Core.Web/Environment/Application/WebApplicationEntryPoint.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,19 @@ public static void PreStartWebApplication()
9393
throw new CoreException(message, ex);
9494
}
9595

96+
try
97+
{
98+
logger.Info("Migrating database...");
99+
ApplicationContext.RunDatabaseMigrations();
100+
}
101+
catch (Exception ex)
102+
{
103+
string message = "Failed to run database migrations.";
104+
logger.Fatal(message, ex);
105+
106+
throw new CoreException(message, ex);
107+
}
108+
96109
isStarted = true;
97110
}
98111
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace BetterModules.Core.Web.Environment.Application
4+
{
5+
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
6+
public class WebApplicationHostAttribute : BaseAttribute
7+
{
8+
public WebApplicationHostAttribute(Type type) : base(type)
9+
{
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)