Skip to content

Commit ad5e821

Browse files
committed
Unit tests for mvc action events call added and stylecop warnings fixed
1 parent 6522267 commit ad5e821

File tree

4 files changed

+188
-3
lines changed

4 files changed

+188
-3
lines changed

src/JQDT.MVC/JQDataTableAttribute.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public JQDataTableAttribute()
3131
/// This constructor is provided for testing purposes.
3232
/// </summary>
3333
/// <param name="serviceLocator">The service locator.</param>
34+
/// <param name="executeFunctionProvider">The execute function provider.</param>
3435
internal JQDataTableAttribute(IServiceLocator serviceLocator, IExecuteFunctionProvider<ActionExecutedContext> executeFunctionProvider)
3536
{
3637
this.serviceLocator = serviceLocator;

src/JQDT.WebAPI/JQDataTableAttribute.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public JQDataTableAttribute()
3333
/// This constructor is provided for testing purposes.
3434
/// </summary>
3535
/// <param name="serviceLocator">The service locator.</param>
36+
/// <param name="executeFunctionProvider">The execute function provider.</param>
3637
internal JQDataTableAttribute(IServiceLocator serviceLocator, IExecuteFunctionProvider<HttpActionExecutedContext> executeFunctionProvider)
3738
{
3839
this.serviceLocator = serviceLocator;

src/JQDT/Application/IExecuteFunctionProvider.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,18 @@
33
using System;
44
using JQDT.ModelBinders;
55

6+
/// <summary>
7+
/// A provider for the application initialization function
8+
/// </summary>
9+
/// <typeparam name="TContext">The type of the context.</typeparam>
610
public interface IExecuteFunctionProvider<TContext>
711
{
12+
/// <summary>
13+
/// Gets the application initialization function.
14+
/// </summary>
15+
/// <param name="dataCollectionType">Type of the data collection.</param>
16+
/// <param name="appType">Type of the application.</param>
17+
/// <returns>Application initialization function</returns>
818
Func<TContext, DI.IServiceLocator, IFormModelBinder, IApplicationBase> GetAppInicializationFunc(Type dataCollectionType, Type appType);
919
}
1020
}

src/Tests/UnitTests/Tests.UnitTests/JQDataTableAttributeMvcUnitTests.cs

Lines changed: 176 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
{
33
using System;
44
using System.Collections.Generic;
5+
using System.Collections.Specialized;
56
using System.Linq;
67
using System.Net;
78
using System.Web;
89
using System.Web.Mvc;
10+
using JQDT.Application;
911
using JQDT.DI;
12+
using JQDT.ModelBinders;
13+
using JQDT.Models;
14+
using JQDT.MVC;
1015
using Moq;
1116
using NUnit.Framework;
1217
using Tests.UnitTests.Mocks;
@@ -15,7 +20,64 @@
1520
public class JQDataTableAttributeMvcUnitTests
1621
{
1722
[Test]
18-
public void OnDataProcessingEventShouldBeRaized()
23+
[TestCase(nameof(JQDataTableAttribute.OnDataProcessing))]
24+
[TestCase(nameof(JQDataTableAttribute.OnSearchDataProcessing))]
25+
[TestCase(nameof(JQDataTableAttribute.OnSearchDataProcessed))]
26+
[TestCase(nameof(JQDataTableAttribute.OnCustomFiltersDataProcessing))]
27+
[TestCase(nameof(JQDataTableAttribute.OnCustomFiltersDataProcessed))]
28+
[TestCase(nameof(JQDataTableAttribute.OnColumnsFilterDataProcessing))]
29+
[TestCase(nameof(JQDataTableAttribute.OnColumnsFilterDataProcessed))]
30+
[TestCase(nameof(JQDataTableAttribute.OnSortDataProcessing))]
31+
[TestCase(nameof(JQDataTableAttribute.OnSortDataProcessed))]
32+
[TestCase(nameof(JQDataTableAttribute.OnPagingDataProcessing))]
33+
[TestCase(nameof(JQDataTableAttribute.OnPagingDataProcessed))]
34+
[TestCase(nameof(JQDataTableAttribute.OnDataProcessed))]
35+
public void AllEventsInsideMvcJQDTAttributeShouldBeRaized(string eventName)
36+
{
37+
var serviceLocatorMock = this.GetServiceLocatorMock();
38+
var executeFunctionMock = this.GetExecuteFunctionProviderMock(serviceLocatorMock);
39+
var contextMock = this.GetHttpContextMock();
40+
41+
var calledEvents = new List<string>();
42+
var testAttr = new JQDataTableTestAttribute(serviceLocatorMock.Object, executeFunctionMock.Object, ref calledEvents);
43+
44+
testAttr.OnActionExecuted(contextMock.Object);
45+
46+
Assert.IsTrue(calledEvents.Contains(eventName));
47+
}
48+
49+
[Test]
50+
public void AllEventsInsideMvcJQDTAttributeShouldBeCalledInCorrectOrder()
51+
{
52+
var serviceLocatorMock = this.GetServiceLocatorMock();
53+
var executeFunctionMock = this.GetExecuteFunctionProviderMock(serviceLocatorMock);
54+
var contextMock = this.GetHttpContextMock();
55+
56+
var calledEvents = new List<string>();
57+
var testAttr = new JQDataTableTestAttribute(serviceLocatorMock.Object, executeFunctionMock.Object, ref calledEvents);
58+
59+
testAttr.OnActionExecuted(contextMock.Object);
60+
61+
var expectedEventsCalls = new List<string>
62+
{
63+
nameof(JQDataTableAttribute.OnDataProcessing),
64+
nameof(JQDataTableAttribute.OnSearchDataProcessing),
65+
nameof(JQDataTableAttribute.OnSearchDataProcessed),
66+
nameof(JQDataTableAttribute.OnCustomFiltersDataProcessing),
67+
nameof(JQDataTableAttribute.OnCustomFiltersDataProcessed),
68+
nameof(JQDataTableAttribute.OnColumnsFilterDataProcessing),
69+
nameof(JQDataTableAttribute.OnColumnsFilterDataProcessed),
70+
nameof(JQDataTableAttribute.OnSortDataProcessing),
71+
nameof(JQDataTableAttribute.OnSortDataProcessed),
72+
nameof(JQDataTableAttribute.OnPagingDataProcessing),
73+
nameof(JQDataTableAttribute.OnPagingDataProcessed),
74+
nameof(JQDataTableAttribute.OnDataProcessed),
75+
};
76+
77+
Assert.IsTrue(expectedEventsCalls.SequenceEqual(calledEvents));
78+
}
79+
80+
private Mock<IServiceLocator> GetServiceLocatorMock()
1981
{
2082
var serviceLocatorMock = new Mock<IServiceLocator>();
2183
serviceLocatorMock.Setup(x => x.GetSearchDataProcessor<IntModel>()).Returns(new DataProcessorFilterFake<IntModel>());
@@ -24,7 +86,29 @@ public void OnDataProcessingEventShouldBeRaized()
2486
serviceLocatorMock.Setup(x => x.GetPagingDataProcessor<IntModel>()).Returns(new DataProcessorNotFilterFake<IntModel>());
2587
serviceLocatorMock.Setup(x => x.GetSortDataProcessor<IntModel>()).Returns(new DataProcessorNotFilterFake<IntModel>());
2688

27-
var attribute = new JQDT.MVC.JQDataTableAttribute(serviceLocatorMock.Object);
89+
return serviceLocatorMock;
90+
}
91+
92+
private Mock<IExecuteFunctionProvider<ActionExecutedContext>> GetExecuteFunctionProviderMock(Mock<IServiceLocator> serviceLocatorMock)
93+
{
94+
var modelBinderMock = new Mock<IFormModelBinder>();
95+
modelBinderMock.Setup(x => x.BindModel<IQueryable<IntModel>>(It.IsAny<NameValueCollection>(), It.IsAny<IQueryable<IntModel>>())).Returns(new RequestInfoModel() { TableParameters = new DataTableAjaxPostModel { Draw = 0 } });
96+
97+
var executeFunctionProviderMock = new Mock<IExecuteFunctionProvider<ActionExecutedContext>>();
98+
executeFunctionProviderMock.Setup(x => x.GetAppInicializationFunc(It.IsAny<Type>(), It.IsAny<Type>())).Returns(new Func<ActionExecutedContext, IServiceLocator, IFormModelBinder, IApplicationBase>((ac, sl, fmb) => { return new TestApplication<IntModel>(serviceLocatorMock.Object, modelBinderMock.Object); }));
99+
100+
return executeFunctionProviderMock;
101+
}
102+
103+
private JQDataTableAttribute HttpGetAttribute(Mock<IServiceLocator> serviceLocatorMock, Mock<IExecuteFunctionProvider<ActionExecutedContext>> executeFunctionProviderMock)
104+
{
105+
var attribute = new JQDT.MVC.JQDataTableAttribute(serviceLocatorMock.Object, executeFunctionProviderMock.Object);
106+
107+
return attribute;
108+
}
109+
110+
private Mock<ActionExecutedContext> GetHttpContextMock()
111+
{
28112
var request = new Mock<HttpRequestBase>();
29113

30114
request.SetupGet(r => r.HttpMethod).Returns("GET");
@@ -43,7 +127,7 @@ public void OnDataProcessingEventShouldBeRaized()
43127
actionExecutedContextMock.SetupGet(c => c.Controller).Returns(new TestControllerFake());
44128
actionExecutedContextMock.SetupGet(c => c.HttpContext).Returns(httpContext.Object);
45129

46-
attribute.OnActionExecuted(actionExecutedContextMock.Object);
130+
return actionExecutedContextMock;
47131
}
48132
}
49133

@@ -59,4 +143,93 @@ protected override void ExecuteCore()
59143
throw new NotImplementedException();
60144
}
61145
}
146+
147+
public class TestApplication<T> : ApplicationBase<T>
148+
{
149+
public TestApplication(IServiceLocator serviceLocator, IFormModelBinder modelBinder)
150+
: base(serviceLocator, modelBinder)
151+
{
152+
}
153+
154+
protected override NameValueCollection GetAjaxForm()
155+
{
156+
return new NameValueCollection();
157+
}
158+
159+
protected override IQueryable<T> GetData()
160+
{
161+
return new List<T>().AsQueryable();
162+
}
163+
}
164+
165+
public class JQDataTableTestAttribute : JQDataTableAttribute
166+
{
167+
private readonly List<string> calledEvents;
168+
169+
internal JQDataTableTestAttribute(IServiceLocator serviceLocator, IExecuteFunctionProvider<ActionExecutedContext> executeFunctionProvider, ref List<string> calledEvents)
170+
: base(serviceLocator, executeFunctionProvider)
171+
{
172+
this.calledEvents = calledEvents;
173+
}
174+
175+
public override void OnDataProcessing(ref object data, RequestInfoModel requestInfoModel)
176+
{
177+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnDataProcessing));
178+
}
179+
180+
public override void OnDataProcessed(ref object data, RequestInfoModel requestInfoModel)
181+
{
182+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnDataProcessed));
183+
}
184+
185+
public override void OnSearchDataProcessing(ref object data, RequestInfoModel requestInfoModel)
186+
{
187+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnSearchDataProcessing));
188+
}
189+
190+
public override void OnSearchDataProcessed(ref object data, RequestInfoModel requestInfoModel)
191+
{
192+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnSearchDataProcessed));
193+
}
194+
195+
public override void OnCustomFiltersDataProcessing(ref object data, RequestInfoModel requestInfoModel)
196+
{
197+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnCustomFiltersDataProcessing));
198+
}
199+
200+
public override void OnCustomFiltersDataProcessed(ref object data, RequestInfoModel requestInfoModel)
201+
{
202+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnCustomFiltersDataProcessed));
203+
}
204+
205+
public override void OnColumnsFilterDataProcessing(ref object data, RequestInfoModel requestInfoModel)
206+
{
207+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnColumnsFilterDataProcessing));
208+
}
209+
210+
public override void OnColumnsFilterDataProcessed(ref object data, RequestInfoModel requestInfoModel)
211+
{
212+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnColumnsFilterDataProcessed));
213+
}
214+
215+
public override void OnSortDataProcessing(ref object data, RequestInfoModel requestInfoModel)
216+
{
217+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnSortDataProcessing));
218+
}
219+
220+
public override void OnSortDataProcessed(ref object data, RequestInfoModel requestInfoModel)
221+
{
222+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnSortDataProcessed));
223+
}
224+
225+
public override void OnPagingDataProcessing(ref object data, RequestInfoModel requestInfoModel)
226+
{
227+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnPagingDataProcessing));
228+
}
229+
230+
public override void OnPagingDataProcessed(ref object data, RequestInfoModel requestInfoModel)
231+
{
232+
this.calledEvents.Add(nameof(JQDataTableAttribute.OnPagingDataProcessed));
233+
}
234+
}
62235
}

0 commit comments

Comments
 (0)