Skip to content

Commit 8fd4084

Browse files
committed
Partial unit tests for ApplicationBase added
1 parent 46ec959 commit 8fd4084

File tree

11 files changed

+214
-15
lines changed

11 files changed

+214
-15
lines changed

src/JQDT.MVC/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@
3434
// [assembly: AssemblyVersion("1.0.*")]
3535
[assembly: AssemblyVersion("1.0.0.1")]
3636
[assembly: AssemblyFileVersion("1.0.0.1")]
37+
[assembly: InternalsVisibleTo("Tests.UnitTests")]

src/JQDT/Application/ApplicationBase.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ public ResultModel Execute()
105105
var dataProcessChain = this.GetDataProcessChain(requestModel.Helpers.DataCollectionType);
106106

107107
// Call events before the data is processed
108-
this.PerformDataProcessorEventHandler(ref data, requestModel);
108+
this.PerformDataProcessorEventHandler(ref data, requestModel, this.OnDataProcessingEvent);
109109

110110
var processedData = dataProcessChain.ProcessData(data, requestModel);
111111

112112
// Call events after the data is processed
113-
this.PerformDataProcessorEventHandler(ref processedData, requestModel);
113+
this.PerformDataProcessorEventHandler(ref processedData, requestModel, this.OnDataProcessedEvent);
114114

115115
result.Data = processedData.ToList().Select(x => (object)x).ToList();
116116
result.Draw = requestModel.TableParameters.Draw;
@@ -142,10 +142,10 @@ public ResultModel Execute()
142142
/// </summary>
143143
/// <param name="data">The data.</param>
144144
/// <param name="requestInfoModel">The request information model.</param>
145-
private void PerformDataProcessorEventHandler(ref IQueryable<T> data, RequestInfoModel requestInfoModel)
145+
private void PerformDataProcessorEventHandler(ref IQueryable<T> data, RequestInfoModel requestInfoModel, DataProcessorEventHandler eventHandler)
146146
{
147147
var dataAsObj = (object)data;
148-
this.OnDataProcessedEvent(ref dataAsObj, requestInfoModel);
148+
eventHandler(ref dataAsObj, requestInfoModel);
149149
data = (IQueryable<T>)dataAsObj;
150150
}
151151

@@ -175,28 +175,28 @@ private IDataProcess<T> GetDataProcessChain(Type dataCollectionType)
175175
var dataProcessChain = new DataProcessChain<T>();
176176

177177
var searchDataProcessor = this.serviceLocator.GetSearchDataProcessor<T>();
178-
((DataProcessBase<T>)searchDataProcessor).OnDataProcessingEvent += this.OnSearchDataProcessingEvent;
179-
((DataProcessBase<T>)searchDataProcessor).OnDataProcessedEvent += this.OnSearchDataProcessedEvent;
178+
searchDataProcessor.OnDataProcessingEvent += this.OnSearchDataProcessingEvent;
179+
searchDataProcessor.OnDataProcessedEvent += this.OnSearchDataProcessedEvent;
180180
dataProcessChain.AddDataProcessor(searchDataProcessor);
181181

182182
var customFiltersDataProcessor = this.serviceLocator.GetCustomFiltersDataProcessor<T>();
183-
((DataProcessBase<T>)customFiltersDataProcessor).OnDataProcessingEvent += this.OnCustomFiltersDataProcessingEvent;
184-
((DataProcessBase<T>)customFiltersDataProcessor).OnDataProcessedEvent += this.OnCustomFiltersDataProcessedEvent;
183+
customFiltersDataProcessor.OnDataProcessingEvent += this.OnCustomFiltersDataProcessingEvent;
184+
customFiltersDataProcessor.OnDataProcessedEvent += this.OnCustomFiltersDataProcessedEvent;
185185
dataProcessChain.AddDataProcessor(customFiltersDataProcessor);
186186

187187
var columnsFilterDataProcessor = this.serviceLocator.GetColumnsFilterDataProcessor<T>();
188-
((DataProcessBase<T>)columnsFilterDataProcessor).OnDataProcessingEvent += this.OnColumnsFilterDataProcessingEvent;
189-
((DataProcessBase<T>)columnsFilterDataProcessor).OnDataProcessedEvent += this.OnColumnsFilterDataProcessedEvent;
188+
columnsFilterDataProcessor.OnDataProcessingEvent += this.OnColumnsFilterDataProcessingEvent;
189+
columnsFilterDataProcessor.OnDataProcessedEvent += this.OnColumnsFilterDataProcessedEvent;
190190
dataProcessChain.AddDataProcessor(columnsFilterDataProcessor);
191191

192192
var sortDataProcessor = this.serviceLocator.GetSortDataProcessor<T>();
193-
((DataProcessBase<T>)sortDataProcessor).OnDataProcessingEvent += this.OnSortDataProcessingEvent;
194-
((DataProcessBase<T>)sortDataProcessor).OnDataProcessedEvent += this.OnSortDataProcessedEvent;
193+
sortDataProcessor.OnDataProcessingEvent += this.OnSortDataProcessingEvent;
194+
sortDataProcessor.OnDataProcessedEvent += this.OnSortDataProcessedEvent;
195195
dataProcessChain.AddDataProcessor(sortDataProcessor);
196196

197197
var pagingDataProcessor = this.serviceLocator.GetPagingDataProcessor<T>();
198-
((DataProcessBase<T>)pagingDataProcessor).OnDataProcessingEvent += this.OnPagingDataProcessingEvent;
199-
((DataProcessBase<T>)pagingDataProcessor).OnDataProcessedEvent += this.OnPagingDataProcessedEvent;
198+
pagingDataProcessor.OnDataProcessingEvent += this.OnPagingDataProcessingEvent;
199+
pagingDataProcessor.OnDataProcessedEvent += this.OnPagingDataProcessedEvent;
200200
dataProcessChain.AddDataProcessor(pagingDataProcessor);
201201

202202
return dataProcessChain;

src/JQDT/DI/IServiceLocator.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace JQDT.DI
22
{
33
using JQDT.DataProcessing;
4+
using JQDT.ModelBinders;
45

56
/// <summary>
67
/// Service Locator Interface
@@ -42,5 +43,11 @@ public interface IServiceLocator
4243
/// <typeparam name="T">Generic data model type</typeparam>
4344
/// <returns>Instance of sort data processor</returns>
4445
IDataProcess<T> GetSortDataProcessor<T>();
46+
47+
/// <summary>
48+
/// Gets the form model binder.
49+
/// </summary>
50+
/// <returns></returns>
51+
IFormModelBinder GetFormModelBinder();
4552
}
4653
}

src/JQDT/DataProcessing/IDataFilter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/// <summary>
44
/// Interface for filter processors. Used to mark the filter processors.
55
/// </summary>
6-
internal interface IDataFilter
6+
public interface IDataFilter
77
{
88
}
99
}

src/JQDT/DataProcessing/IDataProcess.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace JQDT.DataProcessing
22
{
33
using System.Linq;
4+
using JQDT.Delegates;
45
using JQDT.Models;
56

67
/// <summary>
@@ -9,6 +10,16 @@
910
/// <typeparam name="T">Generic data model type.</typeparam>
1011
public interface IDataProcess<T>
1112
{
13+
/// <summary>
14+
/// Occurs when [on data processing event].
15+
/// </summary>
16+
event DataProcessorEventHandler OnDataProcessingEvent;
17+
18+
/// <summary>
19+
/// Occurs when [on data processed event].
20+
/// </summary>
21+
event DataProcessorEventHandler OnDataProcessedEvent;
22+
1223
/// <summary>
1324
/// Gets the processed data.
1425
/// </summary>
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
namespace Tests.UnitTests
2+
{
3+
using System.Collections.Generic;
4+
using System.Collections.Specialized;
5+
using System.Diagnostics;
6+
using System.Linq;
7+
using JQDT.DataProcessing;
8+
using JQDT.DI;
9+
using JQDT.ModelBinders;
10+
using JQDT.Models;
11+
using Moq;
12+
using NUnit.Framework;
13+
using Tests.UnitTests.Mocks;
14+
using Tests.UnitTests.Models;
15+
16+
public class ApplicationBaseUnitTests
17+
{
18+
[Test]
19+
public void OnDataProcessingEventShouldBeRized()
20+
{
21+
var app = this.GetAppMock();
22+
23+
bool flag = false;
24+
app.OnDataProcessingEvent += (ref object data, RequestInfoModel requestInfoModel) =>
25+
{
26+
Trace.WriteLine(flag);
27+
flag = true;
28+
};
29+
30+
app.Execute();
31+
32+
Assert.IsTrue(flag);
33+
}
34+
35+
[Test]
36+
public void OnDataProcessedEventShouldBeRized()
37+
{
38+
var app = this.GetAppMock();
39+
40+
bool flag = false;
41+
app.OnDataProcessedEvent += (ref object data, RequestInfoModel requestInfoModel) =>
42+
{
43+
Trace.WriteLine(flag);
44+
flag = true;
45+
};
46+
47+
app.Execute();
48+
49+
Assert.IsTrue(flag);
50+
}
51+
52+
[Test]
53+
public void OnSearchDataProcessingEventShouldBeRized()
54+
{
55+
var app = this.GetAppMock();
56+
57+
bool flag = false;
58+
app.OnSearchDataProcessingEvent += (ref object data, RequestInfoModel requestInfoModel) =>
59+
{
60+
Trace.WriteLine(flag);
61+
flag = true;
62+
};
63+
64+
app.Execute();
65+
66+
Assert.IsTrue(flag);
67+
}
68+
69+
public AppMock<IntModel> GetAppMock()
70+
{
71+
var serviceLocatorMock = new Mock<IServiceLocator>();
72+
serviceLocatorMock.Setup(x => x.GetSearchDataProcessor<IntModel>()).Returns(this.GetDataFilterMock().Object);
73+
serviceLocatorMock.Setup(x => x.GetColumnsFilterDataProcessor<IntModel>()).Returns(this.GetDataFilterMock().Object);
74+
serviceLocatorMock.Setup(x => x.GetCustomFiltersDataProcessor<IntModel>()).Returns(this.GetDataFilterMock().Object);
75+
serviceLocatorMock.Setup(x => x.GetPagingDataProcessor<IntModel>()).Returns(this.GetDataProcessMock().Object);
76+
serviceLocatorMock.Setup(x => x.GetSortDataProcessor<IntModel>()).Returns(this.GetDataProcessMock().Object);
77+
var formModelBinderMock = new Mock<IFormModelBinder>();
78+
formModelBinderMock.Setup(x => x.BindModel(It.IsAny<NameValueCollection>(), It.IsAny<IQueryable<IntModel>>())).Returns(new RequestInfoModel() { Helpers = new RequestHelpers(), TableParameters = new DataTableAjaxPostModel() });
79+
var app = new AppMock<IntModel>(serviceLocatorMock.Object, formModelBinderMock.Object);
80+
81+
return app;
82+
}
83+
84+
private Mock<IDataProcess<IntModel>> GetDataProcessMock()
85+
{
86+
var mock = new Mock<IDataProcess<IntModel>>();
87+
mock.Setup(x => x.ProcessData(It.IsAny<IQueryable<IntModel>>(), It.IsAny<RequestInfoModel>())).Returns(new List<IntModel>().AsQueryable());
88+
mock.Raise(x => x.OnDataProcessedEvent += delegate { });
89+
return mock;
90+
}
91+
92+
private Mock<IDataProcess<IntModel>> GetDataFilterMock()
93+
{
94+
var dataFilterMock = new Mock<IDataFilter>();
95+
var mock = dataFilterMock.As<IDataProcess<IntModel>>();
96+
mock.Setup(x => x.ProcessData(It.IsAny<IQueryable<IntModel>>(), It.IsAny<RequestInfoModel>())).Returns(new List<IntModel>().AsQueryable());
97+
mock.Raise(x => x.OnDataProcessedEvent += delegate { });
98+
99+
return mock;
100+
}
101+
}
102+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace Tests.UnitTests.Mocks
2+
{
3+
using System.Collections.Generic;
4+
using System.Collections.Specialized;
5+
using System.Linq;
6+
using JQDT.Application;
7+
using JQDT.DI;
8+
using JQDT.ModelBinders;
9+
10+
public class AppMock<T> : ApplicationBase<T>
11+
{
12+
public AppMock(IServiceLocator sreviceLocator, IFormModelBinder formModelBinder)
13+
: base(sreviceLocator, formModelBinder)
14+
{
15+
}
16+
17+
protected override NameValueCollection GetAjaxForm()
18+
{
19+
return new NameValueCollection();
20+
}
21+
22+
protected override IQueryable<T> GetData()
23+
{
24+
return new List<T>().AsQueryable();
25+
}
26+
}
27+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace Tests.UnitTests.Mocks
2+
{
3+
using System.Linq;
4+
using JQDT.DataProcessing;
5+
using JQDT.Delegates;
6+
using JQDT.Models;
7+
8+
internal class DataProcessorMockModel<T> : IDataProcess<T>
9+
{
10+
public IQueryable<T> ProcessedData { get; set; }
11+
12+
public event DataProcessorEventHandler OnDataProcessingEvent = delegate { };
13+
14+
public event DataProcessorEventHandler OnDataProcessedEvent = delegate { };
15+
16+
public virtual IQueryable<T> ProcessData(IQueryable<T> data, RequestInfoModel requestInfoModel)
17+
{
18+
this.ProcessedData = data;
19+
20+
return data;
21+
}
22+
}
23+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Tests.UnitTests.Models
2+
{
3+
public class IntModel
4+
{
5+
public int IntProperty { get; set; }
6+
}
7+
}

src/Tests/UnitTests/Tests.UnitTests/Tests.UnitTests.csproj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
4848
</PropertyGroup>
4949
<ItemGroup>
50+
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
51+
<HintPath>..\..\..\packages\Castle.Core.4.2.1\lib\net45\Castle.Core.dll</HintPath>
52+
</Reference>
5053
<Reference Include="FakeData, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
5154
<HintPath>..\..\..\packages\FakeData.1.0.0\lib\FakeData.dll</HintPath>
5255
</Reference>
@@ -56,19 +59,27 @@
5659
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
5760
<HintPath>..\..\..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
5861
</Reference>
62+
<Reference Include="Moq, Version=4.7.145.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
63+
<HintPath>..\..\..\packages\Moq.4.7.145\lib\net45\Moq.dll</HintPath>
64+
</Reference>
5965
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
6066
<HintPath>..\..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
6167
</Reference>
6268
<Reference Include="System" />
69+
<Reference Include="System.Configuration" />
6370
<Reference Include="System.Core" />
6471
<Reference Include="System.Linq.Dynamic, Version=1.0.6132.35681, Culture=neutral, processorArchitecture=MSIL">
6572
<HintPath>..\..\..\packages\System.Linq.Dynamic.1.0.7\lib\net40\System.Linq.Dynamic.dll</HintPath>
6673
</Reference>
6774
</ItemGroup>
6875
<ItemGroup>
76+
<Compile Include="ApplicationBaseUnitTests.cs" />
77+
<Compile Include="Mocks\AppMock.cs" />
6978
<Compile Include="ColumnsFilterDataProcessorUnitTests.cs" />
7079
<Compile Include="Common\TestHelpers.cs" />
7180
<Compile Include="CustomFiltersDataProcessorUnitTests.cs" />
81+
<Compile Include="Mocks\DataProcessorMockModel.cs" />
82+
<Compile Include="Models\IntModel.cs" />
7283
<Compile Include="PagingDataProcessorTests.cs" />
7384
<Compile Include="Properties\AssemblyInfo.cs" />
7485
<Compile Include="SearchDataProcessorTests.cs" />
@@ -78,6 +89,14 @@
7889
<None Include="packages.config" />
7990
</ItemGroup>
8091
<ItemGroup>
92+
<ProjectReference Include="..\..\..\JQDT.MVC\JQDT.MVC.csproj">
93+
<Project>{d845ab6d-1887-4597-9256-148ad0a11459}</Project>
94+
<Name>JQDT.MVC</Name>
95+
</ProjectReference>
96+
<ProjectReference Include="..\..\..\JQDT.WebAPI\JQDT.WebAPI.csproj">
97+
<Project>{a57f2edc-8dc9-4a9a-bd3d-5ca31ee56910}</Project>
98+
<Name>JQDT.WebAPI</Name>
99+
</ProjectReference>
81100
<ProjectReference Include="..\..\..\JQDT\JQDT.csproj">
82101
<Project>{c82e4675-88ab-4b78-8475-f1521bdae330}</Project>
83102
<Name>JQDT</Name>

src/Tests/UnitTests/Tests.UnitTests/packages.config

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="Castle.Core" version="4.2.1" targetFramework="net461" />
34
<package id="FakeData" version="1.0.0" targetFramework="net461" />
5+
<package id="Moq" version="4.7.145" targetFramework="net461" />
46
<package id="MSTest.TestAdapter" version="1.2.0" targetFramework="net461" />
57
<package id="MSTest.TestFramework" version="1.2.0" targetFramework="net461" />
68
<package id="NUnit" version="3.9.0" targetFramework="net461" />

0 commit comments

Comments
 (0)