Skip to content

Commit bde1b30

Browse files
Merge pull request #184 from TransactionProcessing/bug/#182_duplicatedeposit
Bug fix and unit test added for duplicate deposit handling
2 parents 5224113 + 89ec4d6 commit bde1b30

4 files changed

Lines changed: 85 additions & 15 deletions

File tree

EstateManagement.BusinessLogic/Services/MerchantDomainService.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
using MerchantAggregate;
1212
using Models;
1313
using Models.Estate;
14+
using Models.Merchant;
1415
using NLog;
1516
using SecurityService.Client;
1617
using SecurityService.DataTransferObjects;
1718
using Shared.DomainDrivenDesign.EventSourcing;
1819
using Shared.EventStore.Aggregate;
1920
using Shared.EventStore.EventStore;
21+
using Operator = Models.Estate.Operator;
2022

2123
/// <summary>
2224
///
@@ -307,15 +309,18 @@ public async Task<Guid> MakeMerchantDeposit(Guid estateId,
307309
{
308310
throw new InvalidOperationException($"Estate Id {estateId} has not been created");
309311
}
312+
313+
merchantAggregate.MakeDeposit(source,reference,depositDateTime,amount);
310314

311-
String depositData = $"{depositDateTime.ToString("yyyymmdd hh:mm:ss.fff")}-{reference}-{amount:N2)}-{source}";
312-
Guid depositId = this.GenerateGuidFromString(depositData);
315+
await this.MerchantAggregateRepository.SaveChanges(merchantAggregate, cancellationToken);
313316

314-
merchantAggregate.MakeDeposit(depositId, source,reference,depositDateTime,amount);
317+
Merchant merchant = merchantAggregate.GetMerchant();
315318

316-
await this.MerchantAggregateRepository.SaveChanges(merchantAggregate, cancellationToken);
319+
// Find the deposit
320+
Deposit deposit = merchant.Deposits.Single(d => d.Reference == reference && d.DepositDateTime == depositDateTime && d.Source == source &&
321+
d.Amount == amount);
317322

318-
return depositId;
323+
return deposit.DepositId;
319324
}
320325

321326
/// <summary>

EstateManagement.MerchantAggregate.Tests/MerchantAggregateTests.cs

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -261,40 +261,79 @@ public void MerchantAggregate_MakeDeposit_DepositMade()
261261
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
262262
aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated);
263263

264-
aggregate.MakeDeposit(TestData.DepositId, TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
264+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
265265

266266
Merchant merchantModel = aggregate.GetMerchant();
267267
merchantModel.Deposits.ShouldHaveSingleItem();
268268
merchantModel.Deposits.Single().Source.ShouldBe(TestData.MerchantDepositSourceManual);
269-
merchantModel.Deposits.Single().DepositId.ShouldBe(TestData.DepositId);
269+
//merchantModel.Deposits.Single().DepositId.ShouldNotBe(TestData.DepositId);
270270
merchantModel.Deposits.Single().DepositDateTime.ShouldBe(TestData.DepositDateTime);
271271
merchantModel.Deposits.Single().Reference.ShouldBe(TestData.DepositReference);
272272
merchantModel.Deposits.Single().Amount.ShouldBe(TestData.DepositAmount);
273273
}
274274

275+
[Fact]
276+
public void MerchantAggregate_MakeDeposit_TwoDeposits_BothDepositsMade()
277+
{
278+
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
279+
aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated);
280+
281+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
282+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference2, TestData.DepositDateTime2, TestData.DepositAmount2);
283+
284+
Merchant merchantModel = aggregate.GetMerchant();
285+
merchantModel.Deposits.Count.ShouldBe(2);
286+
}
287+
288+
[Fact]
289+
public void MerchantAggregate_MakeDeposit_TwoDepositsSameDetailsApartFromAmounts_BothDepositsMade()
290+
{
291+
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
292+
aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated);
293+
294+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021,1,1,0,0,0), 650.00m);
295+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 1, 1, 0, 0, 0), 934.00m);
296+
297+
Merchant merchantModel = aggregate.GetMerchant();
298+
merchantModel.Deposits.Count.ShouldBe(2);
299+
}
300+
301+
[Fact]
302+
public void MerchantAggregate_MakeDeposit_TwoDepositsOneMonthApartSameDetails_BothDepositsMade()
303+
{
304+
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
305+
aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated);
306+
307+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 1, 1, 0, 0, 0), 650.00m);
308+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, "Test Data Gen Deposit", new DateTime(2021, 2, 1, 0, 0, 0), 650.00m);
309+
310+
Merchant merchantModel = aggregate.GetMerchant();
311+
merchantModel.Deposits.Count.ShouldBe(2);
312+
}
313+
275314
[Fact]
276315
public void MerchantAggregate_MakeDeposit_MerchantNotCreated_ErrorThrown()
277316
{
278317
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
279318

280319
Should.Throw<InvalidOperationException>(() =>
281320
{
282-
aggregate.MakeDeposit(TestData.DepositId, TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
321+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
283322
});
284323
}
285324

286325
[Fact]
287-
public void MerchantAggregate_MakeDeposit_DuplicateDepositId_ErrorThrown()
326+
public void MerchantAggregate_MakeDeposit_DuplicateDeposit_ErrorThrown()
288327
{
289328
MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId);
290329
aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated);
291-
aggregate.MakeDeposit(TestData.DepositId, TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
330+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
292331
Merchant merchantModel = aggregate.GetMerchant();
293332
merchantModel.Deposits.ShouldHaveSingleItem();
294333

295334
Should.Throw<InvalidOperationException>(() =>
296335
{
297-
aggregate.MakeDeposit(TestData.DepositId, TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
336+
aggregate.MakeDeposit(TestData.MerchantDepositSourceManual, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
298337
});
299338
}
300339

@@ -306,7 +345,7 @@ public void MerchantAggregate_MakeDeposit_DepositSourceNotSet_ErrorThrown()
306345

307346
Should.Throw<InvalidOperationException>(() =>
308347
{
309-
aggregate.MakeDeposit(TestData.DepositId, MerchantDepositSource.NotSet, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
348+
aggregate.MakeDeposit(MerchantDepositSource.NotSet, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
310349
});
311350
}
312351

@@ -318,7 +357,7 @@ public void MerchantAggregate_MakeDeposit_AutomaticDepositSource_ErrorThrown()
318357

319358
Should.Throw<NotSupportedException>(() =>
320359
{
321-
aggregate.MakeDeposit(TestData.DepositId, TestData.MerchantDepositSourceAutomatic, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
360+
aggregate.MakeDeposit(TestData.MerchantDepositSourceAutomatic, TestData.DepositReference, TestData.DepositDateTime, TestData.DepositAmount);
322361
});
323362
}
324363

EstateManagement.MerchantAggregate/MerchantAggregate.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Collections.Generic;
55
using System.Diagnostics.CodeAnalysis;
66
using System.Linq;
7+
using System.Security.Cryptography;
8+
using System.Text;
79
using Merchant.DomainEvents;
810
using Models;
911
using Models.Merchant;
@@ -363,6 +365,25 @@ public Merchant GetMerchant()
363365
return merchantModel;
364366
}
365367

368+
/// <summary>
369+
/// Generates the unique identifier from string.
370+
/// </summary>
371+
/// <param name="input">The input.</param>
372+
/// <returns></returns>
373+
private Guid GenerateGuidFromString(String input)
374+
{
375+
using (SHA256 sha256Hash = SHA256.Create())
376+
{
377+
//Generate hash from the key
378+
Byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
379+
380+
Byte[] j = bytes.Skip(Math.Max(0, bytes.Count() - 16)).ToArray(); //Take last 16
381+
382+
//Create our Guid.
383+
return new Guid(j);
384+
}
385+
}
386+
366387
/// <summary>
367388
/// Makes the deposit.
368389
/// </summary>
@@ -371,12 +392,14 @@ public Merchant GetMerchant()
371392
/// <param name="reference">The reference.</param>
372393
/// <param name="depositDateTime">The deposit date time.</param>
373394
/// <param name="amount">The amount.</param>
374-
public void MakeDeposit(Guid depositId,
375-
MerchantDepositSource source,
395+
public void MakeDeposit(MerchantDepositSource source,
376396
String reference,
377397
DateTime depositDateTime,
378398
Decimal amount)
379399
{
400+
String depositData = $"{depositDateTime.ToString("yyyyMMdd hh:mm:ss.fff")}-{reference}-{amount:N2}-{source}";
401+
Guid depositId = this.GenerateGuidFromString(depositData);
402+
380403
this.EnsureMerchantHasBeenCreated();
381404
this.EnsureNotDuplicateDeposit(depositId);
382405
// TODO: Change amount to a value object (PositiveAmount VO)

EstateManagement.Testing/TestData.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,10 +605,13 @@ public static MerchantAggregate MerchantAggregateWithOperator()
605605
public static Guid DepositId = Guid.Parse("A15460B1-9665-4C3E-861D-3B65D0EBEF19");
606606

607607
public static String DepositReference = "Test Deposit 1";
608+
public static String DepositReference2 = "Test Deposit 2";
608609

609610
public static DateTime DepositDateTime = new DateTime(2019, 11, 16);
611+
public static DateTime DepositDateTime2 = new DateTime(2019, 11, 16);
610612

611613
public static Decimal DepositAmount = 1000.00m;
614+
public static Decimal DepositAmount2 = 1200.00m;
612615

613616
public static MerchantDepositSource MerchantDepositSourceManual = MerchantDepositSource.Manual;
614617

0 commit comments

Comments
 (0)