Skip to content

Commit d1bfe69

Browse files
Merge pull request #109 from StuartFerguson/task/#106_makemerchantdeposit
Make Merchant Depoist flow added
2 parents aaef10b + 983a563 commit d1bfe69

41 files changed

Lines changed: 1596 additions & 307 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

EstateManagement.BusinessLogic.Tests/RequestHandler/MerchantRequestHandlerTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,20 @@ public void MerchantRequestHandler_AddMerchantDeviceRequest_IsHandled()
7171
});
7272

7373
}
74+
75+
[Fact]
76+
public void MerchantRequestHandler_MakeMerchantDepositRequest_IsHandled()
77+
{
78+
Mock<IMerchantDomainService> merchantDomainService = new Mock<IMerchantDomainService>();
79+
MerchantRequestHandler handler = new MerchantRequestHandler(merchantDomainService.Object);
80+
81+
MakeMerchantDepositRequest request = TestData.MakeMerchantDepositRequest;
82+
83+
Should.NotThrow(async () =>
84+
{
85+
await handler.Handle(request, CancellationToken.None);
86+
});
87+
88+
}
7489
}
7590
}

EstateManagement.BusinessLogic.Tests/Requests/RequestsTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace EstateManagement.BusinessLogic.Tests.Commands
66
{
7+
using Models;
78
using Requests;
89
using Shouldly;
910
using Testing;
@@ -138,5 +139,26 @@ public void AddMerchantDeviceRequest_CanBeCreted_IsCreated()
138139
addMerchantDeviceRequest.DeviceId.ShouldBe(TestData.DeviceId);
139140
addMerchantDeviceRequest.DeviceIdentifier.ShouldBe(TestData.DeviceIdentifier);
140141
}
142+
143+
[Theory]
144+
[InlineData(MerchantDepositSource.Manual)]
145+
[InlineData(MerchantDepositSource.Automatic)]
146+
public void MakeMerchantDepositRequest_CanBeCreated_IsCreated(MerchantDepositSource merchantDepositSource)
147+
{
148+
MakeMerchantDepositRequest makeMerchantDepositRequest = MakeMerchantDepositRequest.Create(TestData.EstateId,
149+
TestData.MerchantId,
150+
merchantDepositSource,
151+
TestData.DepositReference,
152+
TestData.DepositDateTime,
153+
TestData.DepositAmount);
154+
155+
makeMerchantDepositRequest.ShouldNotBeNull();
156+
makeMerchantDepositRequest.EstateId.ShouldBe(TestData.EstateId);
157+
makeMerchantDepositRequest.MerchantId.ShouldBe(TestData.MerchantId);
158+
makeMerchantDepositRequest.Source.ShouldBe(merchantDepositSource);
159+
makeMerchantDepositRequest.Amount.ShouldBe(TestData.DepositAmount);
160+
makeMerchantDepositRequest.DepositDateTime.ShouldBe(TestData.DepositDateTime);
161+
makeMerchantDepositRequest.Reference.ShouldBe(TestData.DepositReference);
162+
}
141163
}
142164
}

EstateManagement.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,5 +494,95 @@ await domainService.AddDeviceToMerchant(TestData.EstateId,
494494
CancellationToken.None);
495495
});
496496
}
497+
498+
[Fact]
499+
public async Task MerchantDomainService_MakeMerchantDeposit_DepositIsMade()
500+
{
501+
Mock<IAggregateRepository<EstateAggregate>> estateAggregateRepository = new Mock<IAggregateRepository<EstateAggregate>>();
502+
estateAggregateRepository.Setup(e => e.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedEstateAggregate);
503+
504+
Mock<IAggregateRepository<MerchantAggregate>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate>>();
505+
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedMerchantAggregate);
506+
merchantAggregateRepository.Setup(m => m.SaveChanges(It.IsAny<MerchantAggregate>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
507+
508+
Mock<IAggregateRepositoryManager> aggregateRepositoryManager = new Mock<IAggregateRepositoryManager>();
509+
aggregateRepositoryManager.Setup(x => x.GetAggregateRepository<MerchantAggregate>(It.IsAny<Guid>())).Returns(merchantAggregateRepository.Object);
510+
aggregateRepositoryManager.Setup(x => x.GetAggregateRepository<EstateAggregate>(It.IsAny<Guid>())).Returns(estateAggregateRepository.Object);
511+
512+
Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();
513+
514+
MerchantDomainService domainService = new MerchantDomainService(aggregateRepositoryManager.Object, securityServiceClient.Object);
515+
516+
Should.NotThrow(async () =>
517+
{
518+
await domainService.MakeMerchantDeposit(TestData.EstateId,
519+
TestData.MerchantId,
520+
TestData.MerchantDepositSourceManual,
521+
TestData.DepositReference,
522+
TestData.DepositDateTime,
523+
TestData.DepositAmount,
524+
CancellationToken.None);
525+
});
526+
}
527+
528+
[Fact]
529+
public async Task MerchantDomainService_MakeMerchantDeposit_EstateNotCreated_ErrorThrown()
530+
{
531+
Mock<IAggregateRepository<EstateAggregate>> estateAggregateRepository = new Mock<IAggregateRepository<EstateAggregate>>();
532+
estateAggregateRepository.Setup(e => e.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.EmptyEstateAggregate);
533+
534+
Mock<IAggregateRepository<MerchantAggregate>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate>>();
535+
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedMerchantAggregate);
536+
merchantAggregateRepository.Setup(m => m.SaveChanges(It.IsAny<MerchantAggregate>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
537+
538+
Mock<IAggregateRepositoryManager> aggregateRepositoryManager = new Mock<IAggregateRepositoryManager>();
539+
aggregateRepositoryManager.Setup(x => x.GetAggregateRepository<MerchantAggregate>(It.IsAny<Guid>())).Returns(merchantAggregateRepository.Object);
540+
aggregateRepositoryManager.Setup(x => x.GetAggregateRepository<EstateAggregate>(It.IsAny<Guid>())).Returns(estateAggregateRepository.Object);
541+
542+
Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();
543+
544+
MerchantDomainService domainService = new MerchantDomainService(aggregateRepositoryManager.Object, securityServiceClient.Object);
545+
546+
Should.Throw<InvalidOperationException>(async () =>
547+
{
548+
await domainService.MakeMerchantDeposit(TestData.EstateId,
549+
TestData.MerchantId,
550+
TestData.MerchantDepositSourceManual,
551+
TestData.DepositReference,
552+
TestData.DepositDateTime,
553+
TestData.DepositAmount,
554+
CancellationToken.None);
555+
});
556+
}
557+
558+
[Fact]
559+
public async Task MerchantDomainService_MakeMerchantDeposit_MerchantNotCreated_ErrorThrown()
560+
{
561+
Mock<IAggregateRepository<EstateAggregate>> estateAggregateRepository = new Mock<IAggregateRepository<EstateAggregate>>();
562+
estateAggregateRepository.Setup(e => e.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedEstateAggregate);
563+
564+
Mock<IAggregateRepository<MerchantAggregate>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate>>();
565+
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(new MerchantAggregate());
566+
merchantAggregateRepository.Setup(m => m.SaveChanges(It.IsAny<MerchantAggregate>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
567+
568+
Mock<IAggregateRepositoryManager> aggregateRepositoryManager = new Mock<IAggregateRepositoryManager>();
569+
aggregateRepositoryManager.Setup(x => x.GetAggregateRepository<MerchantAggregate>(It.IsAny<Guid>())).Returns(merchantAggregateRepository.Object);
570+
aggregateRepositoryManager.Setup(x => x.GetAggregateRepository<EstateAggregate>(It.IsAny<Guid>())).Returns(estateAggregateRepository.Object);
571+
572+
Mock<ISecurityServiceClient> securityServiceClient = new Mock<ISecurityServiceClient>();
573+
574+
MerchantDomainService domainService = new MerchantDomainService(aggregateRepositoryManager.Object, securityServiceClient.Object);
575+
576+
Should.Throw<InvalidOperationException>(async () =>
577+
{
578+
await domainService.MakeMerchantDeposit(TestData.EstateId,
579+
TestData.MerchantId,
580+
TestData.MerchantDepositSourceManual,
581+
TestData.DepositReference,
582+
TestData.DepositDateTime,
583+
TestData.DepositAmount,
584+
CancellationToken.None);
585+
});
586+
}
497587
}
498588
}

EstateManagement.BusinessLogic/RequestHandlers/MerchantRequestHandler.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
public class MerchantRequestHandler : IRequestHandler<CreateMerchantRequest, String>,
1818
IRequestHandler<AssignOperatorToMerchantRequest, String>,
1919
IRequestHandler<CreateMerchantUserRequest, Guid>,
20-
IRequestHandler<AddMerchantDeviceRequest, String>
20+
IRequestHandler<AddMerchantDeviceRequest, String>,
21+
IRequestHandler<MakeMerchantDepositRequest, Guid>
2122
{
2223
#region Fields
2324

@@ -128,5 +129,27 @@ public async Task<String> Handle(AddMerchantDeviceRequest request,
128129
}
129130

130131
#endregion
132+
133+
/// <summary>
134+
/// Handles a request
135+
/// </summary>
136+
/// <param name="request">The request</param>
137+
/// <param name="cancellationToken">Cancellation token</param>
138+
/// <returns>
139+
/// Response from the request
140+
/// </returns>
141+
public async Task<Guid> Handle(MakeMerchantDepositRequest request,
142+
CancellationToken cancellationToken)
143+
{
144+
Guid depositId = await this.MerchantDomainService.MakeMerchantDeposit(request.EstateId,
145+
request.MerchantId,
146+
request.Source,
147+
request.Reference,
148+
request.DepositDateTime,
149+
request.Amount,
150+
cancellationToken);
151+
152+
return depositId;
153+
}
131154
}
132155
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
namespace EstateManagement.BusinessLogic.Requests
2+
{
3+
using System;
4+
using MediatR;
5+
using Models;
6+
7+
/// <summary>
8+
///
9+
/// </summary>
10+
/// <seealso cref="MediatR.IRequest{System.Guid}" />
11+
public class MakeMerchantDepositRequest : IRequest<Guid>
12+
{
13+
#region Constructors
14+
15+
/// <summary>
16+
/// Initializes a new instance of the <see cref="MakeMerchantDepositRequest"/> class.
17+
/// </summary>
18+
/// <param name="estateId">The estate identifier.</param>
19+
/// <param name="merchantId">The merchant identifier.</param>
20+
/// <param name="source">The source.</param>
21+
/// <param name="reference">The reference.</param>
22+
/// <param name="depositDateTime">The deposit date time.</param>
23+
/// <param name="amount">The amount.</param>
24+
public MakeMerchantDepositRequest(Guid estateId,
25+
Guid merchantId,
26+
MerchantDepositSource source,
27+
String reference,
28+
DateTime depositDateTime,
29+
Decimal amount)
30+
{
31+
this.EstateId = estateId;
32+
this.MerchantId = merchantId;
33+
this.Source = source;
34+
this.Reference = reference;
35+
this.DepositDateTime = depositDateTime;
36+
this.Amount = amount;
37+
}
38+
39+
#endregion
40+
41+
#region Properties
42+
43+
/// <summary>
44+
/// Gets the amount.
45+
/// </summary>
46+
/// <value>
47+
/// The amount.
48+
/// </value>
49+
public Decimal Amount { get; }
50+
51+
/// <summary>
52+
/// Gets the deposit date time.
53+
/// </summary>
54+
/// <value>
55+
/// The deposit date time.
56+
/// </value>
57+
public DateTime DepositDateTime { get; }
58+
59+
/// <summary>
60+
/// Gets the estate identifier.
61+
/// </summary>
62+
/// <value>
63+
/// The estate identifier.
64+
/// </value>
65+
public Guid EstateId { get; }
66+
67+
/// <summary>
68+
/// Gets the merchant identifier.
69+
/// </summary>
70+
/// <value>
71+
/// The merchant identifier.
72+
/// </value>
73+
public Guid MerchantId { get; }
74+
75+
/// <summary>
76+
/// Gets the reference.
77+
/// </summary>
78+
/// <value>
79+
/// The reference.
80+
/// </value>
81+
public String Reference { get; }
82+
83+
/// <summary>
84+
/// Gets the source.
85+
/// </summary>
86+
/// <value>
87+
/// The source.
88+
/// </value>
89+
public MerchantDepositSource Source { get; }
90+
91+
#endregion
92+
93+
#region Methods
94+
95+
/// <summary>
96+
/// Creates the specified estate identifier.
97+
/// </summary>
98+
/// <param name="estateId">The estate identifier.</param>
99+
/// <param name="merchantId">The merchant identifier.</param>
100+
/// <param name="source">The source.</param>
101+
/// <param name="reference">The reference.</param>
102+
/// <param name="depositDateTime">The deposit date time.</param>
103+
/// <param name="amount">The amount.</param>
104+
/// <returns></returns>
105+
public static MakeMerchantDepositRequest Create(Guid estateId,
106+
Guid merchantId,
107+
MerchantDepositSource source,
108+
String reference,
109+
DateTime depositDateTime,
110+
Decimal amount)
111+
{
112+
return new MakeMerchantDepositRequest(estateId, merchantId, source, reference, depositDateTime, amount);
113+
}
114+
115+
#endregion
116+
}
117+
}

EstateManagement.BusinessLogic/Services/IMerchantDomainService.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,25 @@ Task AddDeviceToMerchant(Guid estateId,
104104
String deviceIdentifier,
105105
CancellationToken cancellationToken);
106106

107+
/// <summary>
108+
/// Makes the merchant deposit.
109+
/// </summary>
110+
/// <param name="estateId">The estate identifier.</param>
111+
/// <param name="merchantId">The merchant identifier.</param>
112+
/// <param name="source">The source.</param>
113+
/// <param name="reference">The reference.</param>
114+
/// <param name="depositDateTime">The deposit date time.</param>
115+
/// <param name="amount">The amount.</param>
116+
/// <param name="cancellationToken">The cancellation token.</param>
117+
/// <returns></returns>
118+
Task<Guid> MakeMerchantDeposit(Guid estateId,
119+
Guid merchantId,
120+
Models.MerchantDepositSource source,
121+
String reference,
122+
DateTime depositDateTime,
123+
Decimal amount,
124+
CancellationToken cancellationToken);
125+
107126
#endregion
108127
}
109128
}

0 commit comments

Comments
 (0)