Skip to content

Commit e061401

Browse files
Merge pull request #792 from TransactionProcessing/copilot/add-transaction-request-handler-tests
Add unit tests for TransactionRequestHandler and SettlementRequestHandler
2 parents a87e3d3 + abb1e05 commit e061401

1 file changed

Lines changed: 392 additions & 0 deletions

File tree

Lines changed: 392 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,392 @@
1+
using EstateManagementUI.BusinessLogic.Client;
2+
using EstateManagementUI.BusinessLogic.Models;
3+
using EstateManagementUI.BusinessLogic.RequestHandlers;
4+
using EstateManagementUI.BusinessLogic.Requests;
5+
using Moq;
6+
using Shouldly;
7+
using SimpleResults;
8+
9+
namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers;
10+
11+
public class TransactionRequestHandlerTests
12+
{
13+
private readonly Mock<IApiClient> _mockApiClient;
14+
private readonly TransactionRequestHandler _handler;
15+
private readonly SettlementRequestHandler _settlementHandler;
16+
17+
public TransactionRequestHandlerTests()
18+
{
19+
_mockApiClient = new Mock<IApiClient>();
20+
_handler = new TransactionRequestHandler(_mockApiClient.Object);
21+
_settlementHandler = new SettlementRequestHandler(_mockApiClient.Object);
22+
}
23+
24+
[Fact]
25+
public async Task Handle_GetTodaysSalesQuery_ReturnsSuccess_WhenApiClientSucceeds()
26+
{
27+
// Arrange
28+
var estateId = Guid.NewGuid();
29+
var comparisonDate = DateTime.UtcNow.Date;
30+
var query = new TransactionQueries.GetTodaysSalesQuery(CorrelationIdHelper.New(), estateId, comparisonDate);
31+
var model = new TodaysSalesModel { TodaysSalesCount = 5, TodaysSalesValue = 100m };
32+
33+
_mockApiClient
34+
.Setup(c => c.GetTodaysSales(query, It.IsAny<CancellationToken>()))
35+
.ReturnsAsync(Result.Success(model));
36+
37+
// Act
38+
var result = await _handler.Handle(query, CancellationToken.None);
39+
40+
// Assert
41+
result.IsSuccess.ShouldBeTrue();
42+
result.Data.ShouldNotBeNull();
43+
result.Data!.TodaysSalesCount.ShouldBe(5);
44+
result.Data.TodaysSalesValue.ShouldBe(100m);
45+
46+
_mockApiClient.Verify(c => c.GetTodaysSales(query, It.IsAny<CancellationToken>()), Times.Once);
47+
}
48+
49+
[Fact]
50+
public async Task Handle_GetTodaysSalesQuery_ReturnsFailure_WhenApiClientFails()
51+
{
52+
// Arrange
53+
var query = new TransactionQueries.GetTodaysSalesQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.Date);
54+
55+
_mockApiClient
56+
.Setup(c => c.GetTodaysSales(query, It.IsAny<CancellationToken>()))
57+
.ReturnsAsync(Result.Failure("api error"));
58+
59+
// Act
60+
var result = await _handler.Handle(query, CancellationToken.None);
61+
62+
// Assert
63+
result.IsFailed.ShouldBeTrue();
64+
65+
_mockApiClient.Verify(c => c.GetTodaysSales(query, It.IsAny<CancellationToken>()), Times.Once);
66+
}
67+
68+
[Fact]
69+
public async Task Handle_GetTodaysFailedSalesQuery_ReturnsSuccess_WhenApiClientSucceeds()
70+
{
71+
// Arrange
72+
var estateId = Guid.NewGuid();
73+
var comparisonDate = DateTime.UtcNow.Date;
74+
var query = new TransactionQueries.GetTodaysFailedSalesQuery(CorrelationIdHelper.New(), estateId, "RC1", comparisonDate);
75+
var model = new TodaysSalesModel { TodaysSalesCount = 3, TodaysSalesValue = 30m };
76+
77+
_mockApiClient
78+
.Setup(c => c.GetTodaysFailedSales(query, It.IsAny<CancellationToken>()))
79+
.ReturnsAsync(Result.Success(model));
80+
81+
// Act
82+
var result = await _handler.Handle(query, CancellationToken.None);
83+
84+
// Assert
85+
result.IsSuccess.ShouldBeTrue();
86+
result.Data.ShouldNotBeNull();
87+
result.Data!.TodaysSalesCount.ShouldBe(3);
88+
89+
_mockApiClient.Verify(c => c.GetTodaysFailedSales(query, It.IsAny<CancellationToken>()), Times.Once);
90+
}
91+
92+
[Fact]
93+
public async Task Handle_GetTodaysFailedSalesQuery_ReturnsFailure_WhenApiClientFails()
94+
{
95+
// Arrange
96+
var query = new TransactionQueries.GetTodaysFailedSalesQuery(CorrelationIdHelper.New(), Guid.NewGuid(), "RC1", DateTime.UtcNow.Date);
97+
98+
_mockApiClient
99+
.Setup(c => c.GetTodaysFailedSales(query, It.IsAny<CancellationToken>()))
100+
.ReturnsAsync(Result.Failure("api error"));
101+
102+
// Act
103+
var result = await _handler.Handle(query, CancellationToken.None);
104+
105+
// Assert
106+
result.IsFailed.ShouldBeTrue();
107+
108+
_mockApiClient.Verify(c => c.GetTodaysFailedSales(query, It.IsAny<CancellationToken>()), Times.Once);
109+
}
110+
111+
[Fact]
112+
public async Task Handle_GetTransactionDetailQuery_ReturnsSuccess_WhenApiClientSucceeds()
113+
{
114+
// Arrange
115+
var estateId = Guid.NewGuid();
116+
var startDate = DateTime.UtcNow.AddDays(-7);
117+
var endDate = DateTime.UtcNow;
118+
var query = new TransactionQueries.GetTransactionDetailQuery(CorrelationIdHelper.New(), estateId, startDate, endDate);
119+
var model = new TransactionModels.TransactionDetailReportResponse
120+
{
121+
Transactions = new List<TransactionModels.TransactionDetail>(),
122+
Summary = new TransactionModels.TransactionDetailSummary { TransactionCount = 10 }
123+
};
124+
125+
_mockApiClient
126+
.Setup(c => c.GetTransactionDetailReport(query, It.IsAny<CancellationToken>()))
127+
.ReturnsAsync(Result.Success(model));
128+
129+
// Act
130+
var result = await _handler.Handle(query, CancellationToken.None);
131+
132+
// Assert
133+
result.IsSuccess.ShouldBeTrue();
134+
result.Data.ShouldNotBeNull();
135+
result.Data!.Summary.TransactionCount.ShouldBe(10);
136+
137+
_mockApiClient.Verify(c => c.GetTransactionDetailReport(query, It.IsAny<CancellationToken>()), Times.Once);
138+
}
139+
140+
[Fact]
141+
public async Task Handle_GetTransactionDetailQuery_ReturnsFailure_WhenApiClientFails()
142+
{
143+
// Arrange
144+
var query = new TransactionQueries.GetTransactionDetailQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);
145+
146+
_mockApiClient
147+
.Setup(c => c.GetTransactionDetailReport(query, It.IsAny<CancellationToken>()))
148+
.ReturnsAsync(Result.Failure("api error"));
149+
150+
// Act
151+
var result = await _handler.Handle(query, CancellationToken.None);
152+
153+
// Assert
154+
result.IsFailed.ShouldBeTrue();
155+
156+
_mockApiClient.Verify(c => c.GetTransactionDetailReport(query, It.IsAny<CancellationToken>()), Times.Once);
157+
}
158+
159+
[Fact]
160+
public async Task Handle_GetMerchantTransactionSummaryQuery_ReturnsSuccess_WhenApiClientSucceeds()
161+
{
162+
// Arrange
163+
var estateId = Guid.NewGuid();
164+
var startDate = DateTime.UtcNow.AddDays(-7);
165+
var endDate = DateTime.UtcNow;
166+
var query = new TransactionQueries.GetMerchantTransactionSummaryQuery(CorrelationIdHelper.New(), estateId, startDate, endDate, 1, 2);
167+
var model = new TransactionModels.TransactionSummaryByMerchantResponse
168+
{
169+
Merchants = new List<TransactionModels.MerchantDetail>(),
170+
Summary = new TransactionModels.MerchantDetailSummary { TotalMerchants = 2 }
171+
};
172+
173+
_mockApiClient
174+
.Setup(c => c.GetMerchantTransactionSummary(query, It.IsAny<CancellationToken>()))
175+
.ReturnsAsync(Result.Success(model));
176+
177+
// Act
178+
var result = await _handler.Handle(query, CancellationToken.None);
179+
180+
// Assert
181+
result.IsSuccess.ShouldBeTrue();
182+
result.Data.ShouldNotBeNull();
183+
result.Data!.Summary.TotalMerchants.ShouldBe(2);
184+
185+
_mockApiClient.Verify(c => c.GetMerchantTransactionSummary(query, It.IsAny<CancellationToken>()), Times.Once);
186+
}
187+
188+
[Fact]
189+
public async Task Handle_GetMerchantTransactionSummaryQuery_ReturnsFailure_WhenApiClientFails()
190+
{
191+
// Arrange
192+
var query = new TransactionQueries.GetMerchantTransactionSummaryQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);
193+
194+
_mockApiClient
195+
.Setup(c => c.GetMerchantTransactionSummary(query, It.IsAny<CancellationToken>()))
196+
.ReturnsAsync(Result.Failure("api error"));
197+
198+
// Act
199+
var result = await _handler.Handle(query, CancellationToken.None);
200+
201+
// Assert
202+
result.IsFailed.ShouldBeTrue();
203+
204+
_mockApiClient.Verify(c => c.GetMerchantTransactionSummary(query, It.IsAny<CancellationToken>()), Times.Once);
205+
}
206+
207+
[Fact]
208+
public async Task Handle_GetOperatorTransactionSummaryQuery_ReturnsSuccess_WhenApiClientSucceeds()
209+
{
210+
// Arrange
211+
var estateId = Guid.NewGuid();
212+
var startDate = DateTime.UtcNow.AddDays(-7);
213+
var endDate = DateTime.UtcNow;
214+
var query = new TransactionQueries.GetOperatorTransactionSummaryQuery(CorrelationIdHelper.New(), estateId, startDate, endDate, 3, 4);
215+
var model = new TransactionModels.TransactionSummaryByOperatorResponse
216+
{
217+
Operators = new List<TransactionModels.OperatorDetail>(),
218+
Summary = new TransactionModels.OperatorDetailSummary { TotalOperators = 3 }
219+
};
220+
221+
_mockApiClient
222+
.Setup(c => c.GetOperatorTransactionSummary(query, It.IsAny<CancellationToken>()))
223+
.ReturnsAsync(Result.Success(model));
224+
225+
// Act
226+
var result = await _handler.Handle(query, CancellationToken.None);
227+
228+
// Assert
229+
result.IsSuccess.ShouldBeTrue();
230+
result.Data.ShouldNotBeNull();
231+
result.Data!.Summary.TotalOperators.ShouldBe(3);
232+
233+
_mockApiClient.Verify(c => c.GetOperatorTransactionSummary(query, It.IsAny<CancellationToken>()), Times.Once);
234+
}
235+
236+
[Fact]
237+
public async Task Handle_GetOperatorTransactionSummaryQuery_ReturnsFailure_WhenApiClientFails()
238+
{
239+
// Arrange
240+
var query = new TransactionQueries.GetOperatorTransactionSummaryQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);
241+
242+
_mockApiClient
243+
.Setup(c => c.GetOperatorTransactionSummary(query, It.IsAny<CancellationToken>()))
244+
.ReturnsAsync(Result.Failure("api error"));
245+
246+
// Act
247+
var result = await _handler.Handle(query, CancellationToken.None);
248+
249+
// Assert
250+
result.IsFailed.ShouldBeTrue();
251+
252+
_mockApiClient.Verify(c => c.GetOperatorTransactionSummary(query, It.IsAny<CancellationToken>()), Times.Once);
253+
}
254+
255+
[Fact]
256+
public async Task Handle_GetProductPerformanceQuery_ReturnsSuccess_WhenApiClientSucceeds()
257+
{
258+
// Arrange
259+
var estateId = Guid.NewGuid();
260+
var startDate = DateTime.UtcNow.AddDays(-7);
261+
var endDate = DateTime.UtcNow;
262+
var query = new TransactionQueries.GetProductPerformanceQuery(CorrelationIdHelper.New(), estateId, startDate, endDate);
263+
var model = new TransactionModels.ProductPerformanceResponse
264+
{
265+
ProductDetails = new List<TransactionModels.ProductPerformanceDetail>(),
266+
Summary = new TransactionModels.ProductPerformanceSummary { TotalProducts = 4 }
267+
};
268+
269+
_mockApiClient
270+
.Setup(c => c.GetProductPerformance(query, It.IsAny<CancellationToken>()))
271+
.ReturnsAsync(Result.Success(model));
272+
273+
// Act
274+
var result = await _handler.Handle(query, CancellationToken.None);
275+
276+
// Assert
277+
result.IsSuccess.ShouldBeTrue();
278+
result.Data.ShouldNotBeNull();
279+
result.Data!.Summary.TotalProducts.ShouldBe(4);
280+
281+
_mockApiClient.Verify(c => c.GetProductPerformance(query, It.IsAny<CancellationToken>()), Times.Once);
282+
}
283+
284+
[Fact]
285+
public async Task Handle_GetProductPerformanceQuery_ReturnsFailure_WhenApiClientFails()
286+
{
287+
// Arrange
288+
var query = new TransactionQueries.GetProductPerformanceQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);
289+
290+
_mockApiClient
291+
.Setup(c => c.GetProductPerformance(query, It.IsAny<CancellationToken>()))
292+
.ReturnsAsync(Result.Failure("api error"));
293+
294+
// Act
295+
var result = await _handler.Handle(query, CancellationToken.None);
296+
297+
// Assert
298+
result.IsFailed.ShouldBeTrue();
299+
300+
_mockApiClient.Verify(c => c.GetProductPerformance(query, It.IsAny<CancellationToken>()), Times.Once);
301+
}
302+
303+
[Fact]
304+
public async Task Handle_GetTodaysSalesByHourQuery_ReturnsSuccess_WhenApiClientSucceeds()
305+
{
306+
// Arrange
307+
var estateId = Guid.NewGuid();
308+
var comparisonDate = DateTime.UtcNow.Date;
309+
var query = new TransactionQueries.GetTodaysSalesByHourQuery(CorrelationIdHelper.New(), estateId, comparisonDate);
310+
var model = new List<TransactionModels.TodaysSalesByHourModel>
311+
{
312+
new() { Hour = 9, TodaysSalesCount = 7, TodaysSalesValue = 70m }
313+
};
314+
315+
_mockApiClient
316+
.Setup(c => c.GetTodaysSalesByHour(query, It.IsAny<CancellationToken>()))
317+
.ReturnsAsync(Result.Success(model));
318+
319+
// Act
320+
var result = await _handler.Handle(query, CancellationToken.None);
321+
322+
// Assert
323+
result.IsSuccess.ShouldBeTrue();
324+
result.Data.ShouldNotBeNull();
325+
result.Data!.Count.ShouldBe(1);
326+
result.Data[0].Hour.ShouldBe(9);
327+
328+
_mockApiClient.Verify(c => c.GetTodaysSalesByHour(query, It.IsAny<CancellationToken>()), Times.Once);
329+
}
330+
331+
[Fact]
332+
public async Task Handle_GetTodaysSalesByHourQuery_ReturnsFailure_WhenApiClientFails()
333+
{
334+
// Arrange
335+
var query = new TransactionQueries.GetTodaysSalesByHourQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.Date);
336+
337+
_mockApiClient
338+
.Setup(c => c.GetTodaysSalesByHour(query, It.IsAny<CancellationToken>()))
339+
.ReturnsAsync(Result.Failure("api error"));
340+
341+
// Act
342+
var result = await _handler.Handle(query, CancellationToken.None);
343+
344+
// Assert
345+
result.IsFailed.ShouldBeTrue();
346+
347+
_mockApiClient.Verify(c => c.GetTodaysSalesByHour(query, It.IsAny<CancellationToken>()), Times.Once);
348+
}
349+
350+
[Fact]
351+
public async Task Handle_GetTodaysSettlementQuery_ReturnsSuccess_WhenApiClientSucceeds()
352+
{
353+
// Arrange
354+
var estateId = Guid.NewGuid();
355+
var comparisonDate = DateTime.UtcNow.Date;
356+
var query = new SettlementQueries.GetTodaysSettlementQuery(CorrelationIdHelper.New(), estateId, comparisonDate);
357+
var model = new TodaysSettlementModel { TodaysSettlementValue = 500m };
358+
359+
_mockApiClient
360+
.Setup(c => c.GetTodaysSettlement(query, It.IsAny<CancellationToken>()))
361+
.ReturnsAsync(Result.Success(model));
362+
363+
// Act
364+
var result = await _settlementHandler.Handle(query, CancellationToken.None);
365+
366+
// Assert
367+
result.IsSuccess.ShouldBeTrue();
368+
result.Data.ShouldNotBeNull();
369+
result.Data!.TodaysSettlementValue.ShouldBe(500m);
370+
371+
_mockApiClient.Verify(c => c.GetTodaysSettlement(query, It.IsAny<CancellationToken>()), Times.Once);
372+
}
373+
374+
[Fact]
375+
public async Task Handle_GetTodaysSettlementQuery_ReturnsFailure_WhenApiClientFails()
376+
{
377+
// Arrange
378+
var query = new SettlementQueries.GetTodaysSettlementQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.Date);
379+
380+
_mockApiClient
381+
.Setup(c => c.GetTodaysSettlement(query, It.IsAny<CancellationToken>()))
382+
.ReturnsAsync(Result.Failure("api error"));
383+
384+
// Act
385+
var result = await _settlementHandler.Handle(query, CancellationToken.None);
386+
387+
// Assert
388+
result.IsFailed.ShouldBeTrue();
389+
390+
_mockApiClient.Verify(c => c.GetTodaysSettlement(query, It.IsAny<CancellationToken>()), Times.Once);
391+
}
392+
}

0 commit comments

Comments
 (0)