Skip to content

Commit 7cb6e13

Browse files
added unit tests for productcomparison module (#1079)
Co-authored-by: Hisham Bin Ateya <hishamco_2007@yahoo.com>
1 parent 6816fa1 commit 7cb6e13

4 files changed

Lines changed: 464 additions & 0 deletions

File tree

SimplCommerce.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplCommerce.Module.Paymen
136136
EndProject
137137
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplCommerce.Module.Checkouts", "src\Modules\SimplCommerce.Module.Checkouts\SimplCommerce.Module.Checkouts.csproj", "{4473538D-2BFA-4C53-B642-0D0DC4F16863}"
138138
EndProject
139+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimplCommerce.Module.ProductComparison.Tests", "test\SimplCommerce.Module.ProductComparison.Tests\SimplCommerce.Module.ProductComparison.Tests.csproj", "{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}"
139140
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimplCommerce.Module.ShippingFree.Tests", "test\SimplCommerce.Module.ShippingFree.Tests\SimplCommerce.Module.ShippingFree.Tests.csproj", "{16BB6B44-3300-4C22-A37B-D9CD7A4EA300}"
140141
EndProject
141142
Global
@@ -712,6 +713,18 @@ Global
712713
{4473538D-2BFA-4C53-B642-0D0DC4F16863}.Release|x64.Build.0 = Release|Any CPU
713714
{4473538D-2BFA-4C53-B642-0D0DC4F16863}.Release|x86.ActiveCfg = Release|Any CPU
714715
{4473538D-2BFA-4C53-B642-0D0DC4F16863}.Release|x86.Build.0 = Release|Any CPU
716+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
717+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
718+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Debug|x64.ActiveCfg = Debug|Any CPU
719+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Debug|x64.Build.0 = Debug|Any CPU
720+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Debug|x86.ActiveCfg = Debug|Any CPU
721+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Debug|x86.Build.0 = Debug|Any CPU
722+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
723+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Release|Any CPU.Build.0 = Release|Any CPU
724+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Release|x64.ActiveCfg = Release|Any CPU
725+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Release|x64.Build.0 = Release|Any CPU
726+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Release|x86.ActiveCfg = Release|Any CPU
727+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7}.Release|x86.Build.0 = Release|Any CPU
715728
{16BB6B44-3300-4C22-A37B-D9CD7A4EA300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
716729
{16BB6B44-3300-4C22-A37B-D9CD7A4EA300}.Debug|Any CPU.Build.0 = Debug|Any CPU
717730
{16BB6B44-3300-4C22-A37B-D9CD7A4EA300}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -779,6 +792,7 @@ Global
779792
{14586564-62CC-4117-AC1B-858ED53C2D6C} = {7EFA2FA7-32DD-4047-B021-50E77A83D714}
780793
{E30CF10F-FABF-4917-8BEB-CB81E4CE2C92} = {7EFA2FA7-32DD-4047-B021-50E77A83D714}
781794
{4473538D-2BFA-4C53-B642-0D0DC4F16863} = {7EFA2FA7-32DD-4047-B021-50E77A83D714}
795+
{EEC02E89-E89A-4871-8C3E-4BABA1E56CA7} = {D9FD9ABA-AE5E-4427-AA6B-6285BE2E212D}
782796
{16BB6B44-3300-4C22-A37B-D9CD7A4EA300} = {D9FD9ABA-AE5E-4427-AA6B-6285BE2E212D}
783797
EndGlobalSection
784798
GlobalSection(ExtensibilityGlobals) = postSolution
Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using Microsoft.AspNetCore.Identity;
6+
using Microsoft.AspNetCore.Mvc;
7+
using Moq;
8+
using SimplCommerce.Infrastructure.Data;
9+
using SimplCommerce.Module.Catalog.Models;
10+
using SimplCommerce.Module.Catalog.Services;
11+
using SimplCommerce.Module.Core.Extensions;
12+
using SimplCommerce.Module.Core.Models;
13+
using SimplCommerce.Module.Core.Services;
14+
using SimplCommerce.Module.ProductComparison.Areas.ProductComparison.Controllers;
15+
using SimplCommerce.Module.ProductComparison.Areas.ProductComparison.ViewModels;
16+
using SimplCommerce.Module.ProductComparison.Models;
17+
using SimplCommerce.Module.ProductComparison.Services;
18+
using Xunit;
19+
20+
namespace SimplCommerce.Module.ProductComparison.Tests.Controllers
21+
{
22+
public class ComparingProductControllerTests
23+
{
24+
[Fact]
25+
public async Task AddToComparison_SuccessfullyAddsProduct()
26+
{
27+
// Arrange
28+
var userId = 1; // Use a unique user id
29+
var productId = 1001;
30+
var model = new AddToComparisonModel { ProductId = productId };
31+
var repositoryMock = new Mock<IRepository<ComparingProduct>>();
32+
var comparingProductServiceMock = new Mock<IComparingProductService>();
33+
var productPricingServiceMock = new Mock<IProductPricingService>();
34+
var mediaServiceMock = new Mock<IMediaService>();
35+
var contentLocalizationServiceMock = new Mock<IContentLocalizationService>();
36+
var workContextMock = new Mock<IWorkContext>();
37+
var userManagerMock = new Mock<UserManager<User>>(
38+
Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
39+
var controller = new ComparingProductController(
40+
userManagerMock.Object,
41+
repositoryMock.Object,
42+
comparingProductServiceMock.Object,
43+
productPricingServiceMock.Object,
44+
mediaServiceMock.Object,
45+
contentLocalizationServiceMock.Object,
46+
workContextMock.Object
47+
);
48+
var user = new User()
49+
{
50+
Id = userId,
51+
UserName = "TestUser"
52+
};
53+
workContextMock.Setup(repo => repo.GetCurrentUser()).ReturnsAsync(user);
54+
55+
// Act
56+
var result = await controller.AddToComparison(model);
57+
58+
// Assert
59+
comparingProductServiceMock.Verify(s => s.AddToComparison(userId, productId), Times.Once);
60+
Assert.IsType<PartialViewResult>(result);
61+
}
62+
63+
[Fact]
64+
public async Task Remove_ValidProduct_RemovesProduct()
65+
{
66+
// Arrange
67+
var userId = 1;
68+
var productId = 1001;
69+
var repositoryMock = new Mock<IRepository<ComparingProduct>>();
70+
repositoryMock.Setup(r => r.Query()).Returns(new[]
71+
{
72+
new ComparingProduct { UserId = userId, ProductId = productId }
73+
}.AsQueryable());
74+
var comparingProductServiceMock = new Mock<IComparingProductService>();
75+
var productPricingServiceMock = new Mock<IProductPricingService>();
76+
var mediaServiceMock = new Mock<IMediaService>();
77+
var contentLocalizationServiceMock = new Mock<IContentLocalizationService>();
78+
var workContextMock = new Mock<IWorkContext>();
79+
var userManagerMock = new Mock<UserManager<User>>(
80+
Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
81+
var controller = new ComparingProductController(
82+
userManagerMock.Object,
83+
repositoryMock.Object,
84+
comparingProductServiceMock.Object,
85+
productPricingServiceMock.Object,
86+
mediaServiceMock.Object,
87+
contentLocalizationServiceMock.Object,
88+
workContextMock.Object
89+
);
90+
var user = new User()
91+
{
92+
Id = userId,
93+
UserName = "TestUser"
94+
};
95+
workContextMock.Setup(repo => repo.GetCurrentUser()).ReturnsAsync(user);
96+
97+
// Act
98+
var result = await controller.Remove(productId);
99+
100+
// Assert
101+
repositoryMock.Verify(r => r.Remove(It.IsAny<ComparingProduct>()), Times.Once);
102+
repositoryMock.Verify(r => r.SaveChanges(), Times.Once);
103+
Assert.IsType<OkResult>(result);
104+
}
105+
106+
[Fact]
107+
public async Task Index_ReturnsValidViewModel()
108+
{
109+
// Arrange
110+
var userId = 1; // Use a unique user id
111+
var comparingProducts = new List<ComparingProduct>()
112+
{
113+
new ComparingProduct
114+
{
115+
UserId = userId,
116+
ProductId = 1001,
117+
CreatedOn = DateTime.Now,
118+
Product=new Product
119+
{
120+
AttributeValues={ new ProductAttributeValue()
121+
{
122+
AttributeId=1,
123+
Attribute= new ProductAttribute(){Name="test1"}
124+
},
125+
new ProductAttributeValue()
126+
{
127+
AttributeId=2,
128+
Attribute= new ProductAttribute(){Name="test2"}
129+
},
130+
new ProductAttributeValue()
131+
{
132+
AttributeId=3,
133+
Attribute= new ProductAttribute(){Name="test3"}
134+
},}
135+
}
136+
},
137+
new ComparingProduct
138+
{
139+
UserId = userId,
140+
ProductId = 1002 ,
141+
CreatedOn = DateTime.Now,
142+
Product=new Product
143+
{
144+
AttributeValues={
145+
new ProductAttributeValue()
146+
{
147+
AttributeId=1,
148+
Attribute= new ProductAttribute(){Name="test1"}
149+
},
150+
new ProductAttributeValue()
151+
{
152+
AttributeId=2,
153+
Attribute= new ProductAttribute(){Name="test2"}
154+
},
155+
new ProductAttributeValue()
156+
{
157+
AttributeId=3,
158+
Attribute= new ProductAttribute(){Name="test3"}
159+
},
160+
}
161+
}
162+
},
163+
};
164+
var repositoryMock = new Mock<IRepository<ComparingProduct>>();
165+
repositoryMock.Setup(r => r.Query()).Returns(comparingProducts.AsQueryable());
166+
var comparingProductServiceMock = new Mock<IComparingProductService>();
167+
var productPricingServiceMock = new Mock<IProductPricingService>();
168+
var mediaServiceMock = new Mock<IMediaService>();
169+
var contentLocalizationServiceMock = new Mock<IContentLocalizationService>();
170+
contentLocalizationServiceMock.Setup(s => s.GetLocalizedProperty(It.IsAny<ComparingProduct>(), It.IsAny<string>(), It.IsAny<string>()))
171+
.Returns<string, string, string>((obj, propertyName, defaultValue) => defaultValue);
172+
var workContextMock = new Mock<IWorkContext>();
173+
var userManagerMock = new Mock<UserManager<User>>(
174+
Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
175+
workContextMock.Setup(w => w.GetCurrentUser()).ReturnsAsync(new User { Id = userId });
176+
var controller = new ComparingProductController(
177+
userManagerMock.Object,
178+
repositoryMock.Object,
179+
comparingProductServiceMock.Object,
180+
productPricingServiceMock.Object,
181+
mediaServiceMock.Object,
182+
contentLocalizationServiceMock.Object,
183+
workContextMock.Object
184+
);
185+
186+
// Act
187+
var result = await controller.Index();
188+
189+
// Assert
190+
var viewResult = Assert.IsType<ViewResult>(result);
191+
var viewModel = Assert.IsType<ProductComparisonVm>(viewResult.Model);
192+
Assert.Equal(comparingProducts.Count, viewModel.Products.Count);
193+
Assert.NotEmpty(viewModel.Attributes);
194+
}
195+
196+
[Fact]
197+
public async Task AddToComparison_TooManyComparingProducts_ReturnsErrorMessage()
198+
{
199+
// Arrange
200+
var userId = 1;
201+
var productId = 1001;
202+
var model = new AddToComparisonModel { ProductId = productId };
203+
var repositoryMock = new Mock<IRepository<ComparingProduct>>();
204+
var comparingProductServiceMock = new Mock<IComparingProductService>();
205+
comparingProductServiceMock.Setup(s => s.AddToComparison(userId, productId))
206+
.Throws(new TooManyComparingProductException(4));
207+
var productPricingServiceMock = new Mock<IProductPricingService>();
208+
var mediaServiceMock = new Mock<IMediaService>();
209+
var contentLocalizationServiceMock = new Mock<IContentLocalizationService>();
210+
var workContextMock = new Mock<IWorkContext>();
211+
var userManagerMock = new Mock<UserManager<User>>(
212+
Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
213+
var controller = new ComparingProductController(
214+
userManagerMock.Object,
215+
repositoryMock.Object,
216+
comparingProductServiceMock.Object,
217+
productPricingServiceMock.Object,
218+
mediaServiceMock.Object,
219+
contentLocalizationServiceMock.Object,
220+
workContextMock.Object
221+
);
222+
var user = new User()
223+
{
224+
Id = userId,
225+
UserName = "TestUser"
226+
};
227+
workContextMock.Setup(repo => repo.GetCurrentUser()).ReturnsAsync(user);
228+
229+
// Act
230+
var result = await controller.AddToComparison(model);
231+
232+
// Assert
233+
comparingProductServiceMock.Verify(s => s.AddToComparison(It.IsAny<long>(), It.IsAny<long>()), Times.Once);
234+
var viewResult = Assert.IsType<PartialViewResult>(result);
235+
var viewModel = Assert.IsType<AddToComparisonResult>(viewResult.Model);
236+
Assert.Contains("Can not add to comparison items", viewModel.Message);
237+
}
238+
239+
[Fact]
240+
public async Task Remove_InvalidProduct_ReturnsNotFound()
241+
{
242+
// Arrange
243+
var userId = 1;
244+
var productId = 1001;
245+
var repositoryMock = new Mock<IRepository<ComparingProduct>>();
246+
repositoryMock.Setup(r => r.Query()).Returns(new[]
247+
{
248+
new ComparingProduct { UserId = userId, ProductId = 999 }
249+
}.AsQueryable());
250+
var comparingProductServiceMock = new Mock<IComparingProductService>();
251+
var productPricingServiceMock = new Mock<IProductPricingService>();
252+
var mediaServiceMock = new Mock<IMediaService>();
253+
var contentLocalizationServiceMock = new Mock<IContentLocalizationService>();
254+
var workContextMock = new Mock<IWorkContext>();
255+
var userManagerMock = new Mock<UserManager<User>>(
256+
Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
257+
var controller = new ComparingProductController(
258+
userManagerMock.Object,
259+
repositoryMock.Object,
260+
comparingProductServiceMock.Object,
261+
productPricingServiceMock.Object,
262+
mediaServiceMock.Object,
263+
contentLocalizationServiceMock.Object,
264+
workContextMock.Object
265+
);
266+
var user = new User()
267+
{
268+
Id = userId,
269+
UserName = "TestUser"
270+
};
271+
workContextMock.Setup(repo => repo.GetCurrentUser()).ReturnsAsync(user);
272+
273+
// Act
274+
var result = await controller.Remove(productId);
275+
276+
// Assert
277+
repositoryMock.Verify(r => r.Remove(It.IsAny<ComparingProduct>()), Times.Never);
278+
repositoryMock.Verify(r => r.SaveChanges(), Times.Never);
279+
Assert.IsType<NotFoundResult>(result);
280+
}
281+
}
282+
}

0 commit comments

Comments
 (0)