diff --git a/TransactionProcessor.Aggregates.Tests/MerchantAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/MerchantAggregateTests.cs index e23aa29..cfb6241 100644 --- a/TransactionProcessor.Aggregates.Tests/MerchantAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/MerchantAggregateTests.cs @@ -1,8 +1,15 @@ -using System.Reflection; -using Shared.DomainDrivenDesign.EventSourcing; +using Shared.DomainDrivenDesign.EventSourcing; +using Shared.EventStore.Aggregate; using Shouldly; +using SimpleResults; +using System.Reflection; +using TransactionProcessor.DataTransferObjects.Requests.Merchant; using TransactionProcessor.Models.Merchant; using TransactionProcessor.Testing; +using static TransactionProcessor.Testing.TestData; +using Address = TransactionProcessor.Models.Merchant.Address; +using Contact = TransactionProcessor.Models.Merchant.Contact; +using SettlementSchedule = TransactionProcessor.Models.Merchant.SettlementSchedule; namespace TransactionProcessor.Aggregates.Tests { @@ -12,15 +19,17 @@ public void MerchantAggregate_CanBeCreated_IsCreated(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); aggregate.AggregateId.ShouldBe(TestData.MerchantId); - TransactionProcessor.Models.Merchant.Merchant merchantModel = aggregate.GetMerchant(); + Merchant merchantModel = aggregate.GetMerchant(); merchantModel.ShouldBeNull(); } - + [Fact] public void MerchantAggregate_Create_IsCreated(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.GenerateReference(); + Result result = aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + result.IsSuccess.ShouldBeTrue(); aggregate.AggregateId.ShouldBe(TestData.MerchantId); aggregate.EstateId.ShouldBe(TestData.EstateId); @@ -28,41 +37,100 @@ public void MerchantAggregate_Create_IsCreated(){ aggregate.DateCreated.ShouldBe(TestData.DateMerchantCreated); aggregate.IsCreated.ShouldBeTrue(); aggregate.MerchantReference.ShouldBe(TestData.MerchantReference); + aggregate.SettlementSchedule.ShouldBe(TestData.SettlementScheduleModel); + + Merchant merchantModel = aggregate.GetMerchant(); + merchantModel.ShouldNotBeNull(); + merchantModel.MerchantId.ShouldBe(TestData.MerchantId); + merchantModel.EstateId.ShouldBe(TestData.EstateId); + merchantModel.MerchantName.ShouldBe(TestData.MerchantName); + merchantModel.Reference.ShouldBe(TestData.MerchantReference); + merchantModel.SettlementSchedule.ShouldBe(TestData.SettlementScheduleModel); + merchantModel.Addresses.Count.ShouldBe(1); + merchantModel.Contacts.Count.ShouldBe(1); } - + [Fact] - public async Task MerchantAggregate_Create_MerchantAlreadyCreated_ErrorThrown(){ + public void MerchantAggregate_Create_MerchantAlreadyCreated_NoError(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + Result result = aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + result.IsSuccess.ShouldBeTrue(); + result = aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + result.IsSuccess.ShouldBeTrue(); + } - Should.NotThrow(() => { aggregate.Create(TestData.MerchantId, TestData.MerchantName, TestData.DateMerchantCreated); }); + [Theory] + [InlineData(null)] + [InlineData("")] + public void MerchantAggregate_Create_NoName_ErrorReturned(String merchantName) + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + Result result = aggregate.Create(TestData.EstateId, merchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldBe("Merchant name must be provided when registering a new merchant"); + } + + [Fact] + public void MerchantAggregate_Create_NoAddress_ErrorReturned() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + Result result = aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, null, TestData.ContactModel, + TestData.SettlementScheduleModel); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldBe("An Address must be provided when registering a new merchant"); } [Fact] - public void MerchantAggregate_GenerateReference_CalledTwice_NoErrorThrown(){ + public void MerchantAggregate_Create_NoContact_ErrorReturned() + { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.GenerateReference(); + Result result = aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, null, + TestData.SettlementScheduleModel); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldBe("A Contact must be provided when registering a new merchant"); + } - Should.NotThrow(() => { aggregate.GenerateReference(); }); + [Fact] + public void MerchantAggregate_Create_InvalidSettlementSchedule_ErrorReturned() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + Result result = aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModelNotSet); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldBe("A valid settlement schedule must be provided when registering a new merchant"); } + [Fact] public void MerchantAggregate_AddAddress_AddressIsAdded(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Address newAddress = new(Guid.Empty, TestData.MerchantAddressLine1, + TestData.MerchantAddressLine2, + TestData.MerchantAddressLine3, + TestData.MerchantAddressLine4, + TestData.MerchantTown, + TestData.MerchantRegion, + TestData.MerchantPostalCode, + TestData.MerchantCountry); + Result result = aggregate.AddAddress(newAddress); + result.IsSuccess.ShouldBeTrue(); + Merchant merchantModel = aggregate.GetMerchant(); - merchantModel.Addresses.ShouldHaveSingleItem(); - Address addressModel = merchantModel.Addresses.Single(); + merchantModel.Addresses.Count.ShouldBe(2); + + Address addressModel = merchantModel.Addresses.SingleOrDefault(a => a.AddressLine1 == TestData.MerchantAddressLine1); + addressModel.ShouldNotBeNull(); addressModel.AddressId.ShouldNotBe(Guid.Empty); addressModel.AddressLine1.ShouldBe(TestData.MerchantAddressLine1); addressModel.AddressLine2.ShouldBe(TestData.MerchantAddressLine2); @@ -73,134 +141,86 @@ public void MerchantAggregate_AddAddress_AddressIsAdded(){ addressModel.PostalCode.ShouldBe(TestData.MerchantPostalCode); addressModel.Country.ShouldBe(TestData.MerchantCountry); } - + [Fact] public void MerchantAggregate_AddAddress_SameAddress_AddressIsNotAdded(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); - aggregate.AddAddress(TestData.MerchantAddressLine1Update, - TestData.MerchantAddressLine2Update, - TestData.MerchantAddressLine3Update, - TestData.MerchantAddressLine4Update, - TestData.MerchantTownUpdate, - TestData.MerchantRegionUpdate, - TestData.MerchantPostalCodeUpdate, - TestData.MerchantCountryUpdate); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - Merchant merchantModel = aggregate.GetMerchant(); - merchantModel.Addresses.Count.ShouldBe(2); - aggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); - merchantModel = aggregate.GetMerchant(); - merchantModel.Addresses.Count.ShouldBe(2); + Result result = aggregate.AddAddress(TestData.AddressModel); + result.IsSuccess.ShouldBeTrue(); + Merchant merchantModel = aggregate.GetMerchant(); + merchantModel.Addresses.ShouldHaveSingleItem(); } - + [Fact] public void MerchantAggregate_AddAddress_MerchantNotCreated_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - InvalidOperationException exception = Should.Throw(() => { - aggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); - }); - - exception.Message.ShouldContain($"Merchant has not been created"); + Result result = aggregate.AddAddress(TestData.AddressModel); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldContain($"Merchant has not been created"); } - + [Fact] public void MerchantAggregate_AddContact_ContactIsAdded(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); - - Merchant merchantModel = aggregate.GetMerchant(); - merchantModel.Contacts.ShouldHaveSingleItem(); - Contact contactModel = merchantModel.Contacts.Single(); - //contactModel.ContactId.ShouldNotBe(Guid.Empty); - contactModel.ContactName.ShouldBe(TestData.MerchantContactName); - contactModel.ContactEmailAddress.ShouldBe(TestData.MerchantContactEmailAddress); - contactModel.ContactPhoneNumber.ShouldBe(TestData.MerchantContactPhoneNumber); - } + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - [Fact] - public void MerchantAggregate_AddContact_SecondContact_ContactIsAdded() - { - MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AddContact(TestData.MerchantContactName, + Result result = aggregate.AddContact(TestData.MerchantContactName, TestData.MerchantContactPhoneNumber, TestData.MerchantContactEmailAddress); - aggregate.AddContact(TestData.ContactName, - TestData.ContactPhone, - TestData.ContactEmail); + result.IsSuccess.ShouldBeTrue(); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Contacts.Count.ShouldBe(2); + Contact contactModel = merchantModel.Contacts.SingleOrDefault(c => c.ContactName == TestData.MerchantContactName); + contactModel.ShouldNotBeNull(); + contactModel.ContactName.ShouldBe(TestData.MerchantContactName); + contactModel.ContactEmailAddress.ShouldBe(TestData.MerchantContactEmailAddress); + contactModel.ContactPhoneNumber.ShouldBe(TestData.MerchantContactPhoneNumber); } [Fact] public void MerchantAggregate_AddContact_SameContact_ContactNotAdded(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); - aggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Result result = aggregate.AddContact(TestData.ContactModel.ContactName, + TestData.ContactModel.ContactPhoneNumber, + TestData.ContactModel.ContactEmailAddress); + result.IsSuccess.ShouldBeTrue(); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Contacts.ShouldHaveSingleItem(); - Contact contactModel = merchantModel.Contacts.Single(); - //contactModel.ContactId.ShouldNotBe(Guid.Empty); - contactModel.ContactName.ShouldBe(TestData.MerchantContactName); - contactModel.ContactEmailAddress.ShouldBe(TestData.MerchantContactEmailAddress); - contactModel.ContactPhoneNumber.ShouldBe(TestData.MerchantContactPhoneNumber); } [Fact] public void MerchantAggregate_AddContact_MerchantNotCreated_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - InvalidOperationException exception = Should.Throw(() => { - aggregate.AddContact(TestData.MerchantContactName, + Result result = aggregate.AddContact(TestData.MerchantContactName, TestData.MerchantContactPhoneNumber, TestData.MerchantContactEmailAddress); - }); - - exception.Message.ShouldContain($"Merchant has not been created"); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldContain($"Merchant has not been created"); } - + [Fact] public void MerchantAggregate_AssignOperator_OperatorIsAssigned(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + Result result = aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); + result.IsSuccess.ShouldBeTrue(); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Operators.ShouldHaveSingleItem(); @@ -215,23 +235,31 @@ public void MerchantAggregate_AssignOperator_OperatorIsAssigned(){ public void MerchantAggregate_AssignOperator_MerchantNotCreated_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - Should.Throw(() => { aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); }); + Result result = aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_AssignOperator_OperatorAlreadyAssigned_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); - Should.Throw(() => { aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); }); + Result result = aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } - + [Fact] public void MerchantAggregate_AddSecurityUserToMerchant_SecurityUserIsAdded(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.AddSecurityUser(TestData.SecurityUserId, TestData.MerchantUserEmailAddress); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Result result = aggregate.AddSecurityUser(TestData.SecurityUserId, TestData.MerchantUserEmailAddress); + result.IsSuccess.ShouldBeTrue(); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.SecurityUsers.ShouldHaveSingleItem(); @@ -244,17 +272,20 @@ public void MerchantAggregate_AddSecurityUserToMerchant_SecurityUserIsAdded(){ public void MerchantAggregate_AddSecurityUserToMerchant_MerchantNotCreated_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - InvalidOperationException exception = Should.Throw(() => { aggregate.AddSecurityUser(TestData.SecurityUserId, TestData.EstateUserEmailAddress); }); - - exception.Message.ShouldContain("Merchant has not been created"); + Result result = aggregate.AddSecurityUser(TestData.SecurityUserId, TestData.EstateUserEmailAddress); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + result.Message.ShouldContain("Merchant has not been created"); } - + [Fact] public void MerchantAggregate_AddDevice_DeviceAdded(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); + Result result = aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); + result.IsSuccess.ShouldBeTrue(); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Devices.ShouldHaveSingleItem(); @@ -267,87 +298,127 @@ public void MerchantAggregate_AddDevice_DeviceAdded(){ [InlineData("")] public void MerchantAggregate_AddDevice_DeviceIdentifierInvalid_ErrorThrown(String deviceIdentifier){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - Should.Throw(() => { aggregate.AddDevice(TestData.DeviceId, deviceIdentifier); }); + Result result = aggregate.AddDevice(TestData.DeviceId, deviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_AddDevice_MerchantNotCreated_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - Should.Throw(() => { aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); }); + Result result = aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_AddDevice_MerchantNoSpaceForDevice_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); - Should.Throw(() => { aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); }); + Result result = aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_AddDevice_DuplicateDevice_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); - Should.Throw(() => { aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); }); + Result result = aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } - - - + [Fact] public void MerchantAggregate_SetSetttlmentSchedule_ScheduleIsSet(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.SetSettlementSchedule(SettlementSchedule.Immediate); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + Result result = aggregate.SetSettlementSchedule(SettlementSchedule.Immediate); + result.IsSuccess.ShouldBeTrue(); aggregate.SettlementSchedule.ShouldBe(SettlementSchedule.Immediate); aggregate.NextSettlementDueDate.ShouldBe(DateTime.MinValue); - aggregate.SetSettlementSchedule(SettlementSchedule.Weekly); + result = aggregate.SetSettlementSchedule(SettlementSchedule.Weekly); + result.IsSuccess.ShouldBeTrue(); aggregate.SettlementSchedule.ShouldBe(SettlementSchedule.Weekly); aggregate.NextSettlementDueDate.ShouldBe(DateTime.Now.Date.AddDays(7)); - aggregate.SetSettlementSchedule(SettlementSchedule.Immediate); + result = aggregate.SetSettlementSchedule(SettlementSchedule.Immediate); + result.IsSuccess.ShouldBeTrue(); aggregate.SettlementSchedule.ShouldBe(SettlementSchedule.Immediate); aggregate.NextSettlementDueDate.ShouldBe(DateTime.MinValue); - aggregate.SetSettlementSchedule(SettlementSchedule.Monthly); + result = aggregate.SetSettlementSchedule(SettlementSchedule.Monthly); + result.IsSuccess.ShouldBeTrue(); aggregate.SettlementSchedule.ShouldBe(SettlementSchedule.Monthly); aggregate.NextSettlementDueDate.ShouldBe(DateTime.Now.Date.AddMonths(1)); } + [Fact] + public void MerchantAggregate_SetSetttlmentSchedule_MerchantNotCreated_ErrorReturned() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + + Result result = aggregate.SetSettlementSchedule(SettlementSchedule.Immediate); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + + + [Fact] + public void MerchantAggregate_SetSetttlmentSchedule_NotSet_ErrorReturned() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + Result result = aggregate.SetSettlementSchedule(SettlementSchedule.NotSet); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + [Theory] [InlineData(SettlementSchedule.Immediate, SettlementSchedule.Immediate)] [InlineData(SettlementSchedule.Weekly, SettlementSchedule.Weekly)] [InlineData(SettlementSchedule.Monthly, SettlementSchedule.Monthly)] public void MerchantAggregate_SetSetttlmentSchedule_SameValue_NoEventRaised(SettlementSchedule originalSettlementSchedule, SettlementSchedule newSettlementSchedule){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - aggregate.SetSettlementSchedule(originalSettlementSchedule); - aggregate.SetSettlementSchedule(newSettlementSchedule); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + originalSettlementSchedule); + + Result result = aggregate.SetSettlementSchedule(newSettlementSchedule); + result.IsSuccess.ShouldBeTrue(); Type type = aggregate.GetType(); PropertyInfo property = type.GetProperty("PendingEvents", BindingFlags.Instance | BindingFlags.NonPublic); Object value = property.GetValue(aggregate); value.ShouldNotBeNull(); List eventHistory = (List)value; - eventHistory.Count.ShouldBe(2); + eventHistory.Count.ShouldBe(5); Merchant merchant = aggregate.GetMerchant(); merchant.SettlementSchedule.ShouldBe(originalSettlementSchedule); } - + [Fact] public void MerchantAggregate_SwapDevice_DeviceIsSwapped(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); - aggregate.SwapDevice(TestData.DeviceIdentifier, TestData.NewDeviceIdentifier); + Result result = aggregate.SwapDevice(TestData.DeviceIdentifier, TestData.NewDeviceIdentifier); + result.IsSuccess.ShouldBeTrue(); Merchant merchant = aggregate.GetMerchant(); merchant.Devices.Count.ShouldBe(2); @@ -363,7 +434,9 @@ public void MerchantAggregate_SwapDevice_DeviceIsSwapped(){ public void MerchantAggregate_SwapDevice_InvalidOriginalDeviceIdentifier_ErrorThrown(String originalDeviceIdentifier){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - Should.Throw(() => { aggregate.SwapDevice(originalDeviceIdentifier, TestData.NewDeviceIdentifier); }); + Result result = aggregate.SwapDevice(originalDeviceIdentifier, TestData.NewDeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Theory] @@ -372,41 +445,53 @@ public void MerchantAggregate_SwapDevice_InvalidOriginalDeviceIdentifier_ErrorTh public void MerchantAggregate_SwapDevice_InvalidNewDeviceIdentifier_ErrorThrown(String newDeviceIdentifier){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - Should.Throw(() => { aggregate.SwapDevice(TestData.DeviceIdentifier, newDeviceIdentifier); }); + Result result = aggregate.SwapDevice(TestData.DeviceIdentifier, newDeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_SwapDevice_MerchantNotCreated_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - Should.Throw(() => { aggregate.SwapDevice(TestData.DeviceIdentifier, TestData.NewDeviceIdentifier); }); + Result result = aggregate.SwapDevice(TestData.DeviceIdentifier, TestData.NewDeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_SwapDevice_MerchantDoesNotHaveOriginalDevice_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - Should.Throw(() => { aggregate.SwapDevice(TestData.DeviceIdentifier, TestData.NewDeviceIdentifier); }); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + Result result = aggregate.SwapDevice(TestData.DeviceIdentifier, TestData.NewDeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_SwapDevice_MerchantAlreadyHasNewDevice_ErrorThrown(){ MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AddDevice(TestData.DeviceId, TestData.NewDeviceIdentifier); - Should.Throw(() => { aggregate.SwapDevice(TestData.NewDeviceIdentifier, TestData.NewDeviceIdentifier); }); - } + Result result = aggregate.SwapDevice(TestData.NewDeviceIdentifier, TestData.NewDeviceIdentifier); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + [Fact] public void MerchantAggregate_AddContract_ContractAndProductsAddedToMerchant(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); ContractAggregate contractAggregate = TestData.Aggregates.CreatedContractAggregateWithAProduct(); - merchantAggregate.AddContract(contractAggregate); + aggregate.AddContract(contractAggregate); - Merchant merchant = merchantAggregate.GetMerchant(); + Merchant merchant = aggregate.GetMerchant(); merchant.Contracts.Count.ShouldBe(1); Contract contract = merchant.Contracts.SingleOrDefault(); contract.ShouldNotBeNull(); @@ -419,87 +504,84 @@ public void MerchantAggregate_AddContract_MerchantNotCreated_ErrorThrown(){ MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); ContractAggregate contractAggregate = TestData.Aggregates.CreatedContractAggregateWithAProduct(); - Should.Throw(() => { merchantAggregate.AddContract(contractAggregate); }); + Result result = merchantAggregate.AddContract(contractAggregate); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_AddContract_ContractAlreadyAdded_ErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); ContractAggregate contractAggregate = TestData.Aggregates.CreatedContractAggregateWithAProduct(); - merchantAggregate.AddContract(contractAggregate); + aggregate.AddContract(contractAggregate); - Should.Throw(() => { merchantAggregate.AddContract(contractAggregate); }); + Result result = aggregate.AddContract(contractAggregate); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } - + [Fact] public void MerchantAggregate_UpdateMerchant_NameUpdated_ErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - - merchantAggregate.UpdateMerchant(TestData.MerchantNameUpdated); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - merchantAggregate.Name.ShouldBe(TestData.MerchantNameUpdated); + Result result = aggregate.UpdateMerchant(TestData.MerchantNameUpdated); + result.IsSuccess.ShouldBeTrue(); + aggregate.Name.ShouldBe(TestData.MerchantNameUpdated); } [Fact] public void MerchantAggregate_UpdateMerchant_SameName_NoUpdate_ErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - merchantAggregate.UpdateMerchant(TestData.MerchantName); + Result result = aggregate.UpdateMerchant(TestData.MerchantName); + result.IsSuccess.ShouldBeTrue(); + aggregate.Name.ShouldBe(TestData.MerchantName); + } - merchantAggregate.Name.ShouldBe(TestData.MerchantName); + [Fact] + public void MerchantAggregate_UpdateMerchant_MerchantNotCreated_ErrorThrown() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + + Result result = aggregate.UpdateMerchant(TestData.MerchantNameUpdated); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Theory] [InlineData("")] [InlineData(null)] public void MerchantAggregate_UpdateMerchant_NameNotSet_NoUpdate_ErrorThrown(String merchantName){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - - merchantAggregate.UpdateMerchant(merchantName); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - merchantAggregate.Name.ShouldBe(TestData.MerchantName); + Result result = aggregate.UpdateMerchant(merchantName); + result.IsSuccess.ShouldBeTrue(); + aggregate.Name.ShouldBe(TestData.MerchantName); } [Fact] public void MerchantAggregate_UpdateAddress_AddressIsAdded(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); - - Merchant merchantModel = merchantAggregate.GetMerchant(); - var address = merchantModel.Addresses.ShouldHaveSingleItem(); - address.AddressLine1.ShouldBe(TestData.MerchantAddressLine1); - address.AddressLine2.ShouldBe(TestData.MerchantAddressLine2); - address.AddressLine3.ShouldBe(TestData.MerchantAddressLine3); - address.AddressLine4.ShouldBe(TestData.MerchantAddressLine4); - address.Town.ShouldBe(TestData.MerchantTown); - address.Region.ShouldBe(TestData.MerchantRegion); - address.PostalCode.ShouldBe(TestData.MerchantPostalCode); - address.Country.ShouldBe(TestData.MerchantCountry); - - merchantAggregate.UpdateAddress(address.AddressId, - TestData.MerchantAddressLine1Update, - TestData.MerchantAddressLine2Update, - TestData.MerchantAddressLine3Update, - TestData.MerchantAddressLine4Update, - TestData.MerchantTownUpdate, - TestData.MerchantRegionUpdate, - TestData.MerchantPostalCodeUpdate, - TestData.MerchantCountryUpdate); - - merchantModel = merchantAggregate.GetMerchant(); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Merchant merchantModel = aggregate.GetMerchant(); + Address? address = merchantModel.Addresses.ShouldHaveSingleItem(); + + Address newAddress = new(address.AddressId, TestData.MerchantAddressLine1Update, TestData.MerchantAddressLine2Update, TestData.MerchantAddressLine3Update, TestData.MerchantAddressLine4Update, TestData.MerchantTownUpdate, TestData.MerchantRegionUpdate, TestData.MerchantPostalCodeUpdate, TestData.MerchantCountryUpdate); + Result result = aggregate.UpdateAddress(newAddress); + result.IsSuccess.ShouldBeTrue(); + + merchantModel = aggregate.GetMerchant(); address = merchantModel.Addresses.ShouldHaveSingleItem(); address.AddressLine1.ShouldBe(TestData.MerchantAddressLine1Update); address.AddressLine2.ShouldBe(TestData.MerchantAddressLine2Update); @@ -511,88 +593,70 @@ public void MerchantAggregate_UpdateAddress_AddressIsAdded(){ address.Country.ShouldBe(TestData.MerchantCountryUpdate); } + [Fact] + public void MerchantAggregate_UpdateAddress_MerchantNotCreated_ErrorThrown() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + + Address newAddress = new(Guid.NewGuid(), TestData.MerchantAddressLine1Update, TestData.MerchantAddressLine2Update, TestData.MerchantAddressLine3Update, TestData.MerchantAddressLine4Update, TestData.MerchantTownUpdate, TestData.MerchantRegionUpdate, TestData.MerchantPostalCodeUpdate, TestData.MerchantCountryUpdate); + Result result = aggregate.UpdateAddress(newAddress); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + [Fact] public void MerchantAggregate_UpdateAddress_AddressNotFound_NoErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Address newAddress = new(Guid.NewGuid(), TestData.MerchantAddressLine1Update, TestData.MerchantAddressLine2Update, TestData.MerchantAddressLine3Update, TestData.MerchantAddressLine4Update, TestData.MerchantTownUpdate, TestData.MerchantRegionUpdate, TestData.MerchantPostalCodeUpdate, TestData.MerchantCountryUpdate); - Should.NotThrow(() => { - merchantAggregate.UpdateAddress(Guid.NewGuid(), - TestData.MerchantAddressLine1Update, - TestData.MerchantAddressLine2Update, - TestData.MerchantAddressLine3Update, - TestData.MerchantAddressLine4Update, - TestData.MerchantTownUpdate, - TestData.MerchantRegionUpdate, - TestData.MerchantPostalCodeUpdate, - TestData.MerchantCountryUpdate); - }); + Result result = aggregate.UpdateAddress(newAddress); + result.IsSuccess.ShouldBeTrue(); } [Fact] public void MerchantAggregate_UpdateAddress_UpdatedAddressHasNotChanges_NoErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); - - Merchant merchantModel = merchantAggregate.GetMerchant(); - var address = merchantModel.Addresses.ShouldHaveSingleItem(); - address.AddressLine1.ShouldBe(TestData.MerchantAddressLine1); - address.AddressLine2.ShouldBe(TestData.MerchantAddressLine2); - address.AddressLine3.ShouldBe(TestData.MerchantAddressLine3); - address.AddressLine4.ShouldBe(TestData.MerchantAddressLine4); - address.Town.ShouldBe(TestData.MerchantTown); - address.Region.ShouldBe(TestData.MerchantRegion); - address.PostalCode.ShouldBe(TestData.MerchantPostalCode); - address.Country.ShouldBe(TestData.MerchantCountry); - - merchantAggregate.UpdateAddress(address.AddressId, - TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); - - merchantModel = merchantAggregate.GetMerchant(); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Merchant merchantModel = aggregate.GetMerchant(); + Address? address = merchantModel.Addresses.ShouldHaveSingleItem(); + + Address newAddress = new (address.AddressId, address.AddressLine1, address.AddressLine2, address.AddressLine3, address.AddressLine4, address.Town, address.Region, address.PostalCode, address.Country); + + Result result = aggregate.UpdateAddress(newAddress); + + result.IsSuccess.ShouldBeTrue(); + merchantModel = aggregate.GetMerchant(); address = merchantModel.Addresses.ShouldHaveSingleItem(); - address.AddressLine1.ShouldBe(TestData.MerchantAddressLine1); - address.AddressLine2.ShouldBe(TestData.MerchantAddressLine2); - address.AddressLine3.ShouldBe(TestData.MerchantAddressLine3); - address.AddressLine4.ShouldBe(TestData.MerchantAddressLine4); - address.Town.ShouldBe(TestData.MerchantTown); - address.Region.ShouldBe(TestData.MerchantRegion); - address.PostalCode.ShouldBe(TestData.MerchantPostalCode); - address.Country.ShouldBe(TestData.MerchantCountry); + address.AddressLine1.ShouldBe(address.AddressLine1); + address.AddressLine2.ShouldBe(address.AddressLine2); + address.AddressLine3.ShouldBe(address.AddressLine3); + address.AddressLine4.ShouldBe(address.AddressLine4); + address.Town.ShouldBe(address.Town); + address.Region.ShouldBe(address.Region); + address.PostalCode.ShouldBe(address.PostalCode); + address.Country.ShouldBe(address.Country); } - + [Fact] public void MerchantAggregate_UpdateContact_ContactIsUpdated(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddContact(TestData.ContactName, TestData.ContactPhone, TestData.ContactEmail); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - Merchant merchantModel = merchantAggregate.GetMerchant(); + Merchant merchantModel = aggregate.GetMerchant(); var contact = merchantModel.Contacts.ShouldHaveSingleItem(); - contact.ContactName.ShouldBe(TestData.ContactName); - contact.ContactEmailAddress.ShouldBe(TestData.ContactEmail); - contact.ContactPhoneNumber.ShouldBe(TestData.ContactPhone); - merchantAggregate.UpdateContact(contact.ContactId, + aggregate.UpdateContact(contact.ContactId, TestData.ContactNameUpdate, TestData.ContactEmailUpdate, TestData.ContactPhoneUpdate); - merchantModel = merchantAggregate.GetMerchant(); + merchantModel = aggregate.GetMerchant(); contact = merchantModel.Contacts.ShouldHaveSingleItem(); contact.ContactName.ShouldBe(TestData.ContactNameUpdate); contact.ContactEmailAddress.ShouldBe(TestData.ContactEmailUpdate); @@ -601,46 +665,60 @@ public void MerchantAggregate_UpdateContact_ContactIsUpdated(){ [Fact] public void MerchantAggregate_UpdateContact_ContactNotFound_NoErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - Should.NotThrow(() => { - merchantAggregate.UpdateContact(Guid.NewGuid(), + Result result = aggregate.UpdateContact(Guid.NewGuid(), TestData.ContactName, TestData.ContactEmail, TestData.ContactPhone); - }); + result.IsSuccess.ShouldBeTrue(); } [Fact] public void MerchantAggregate_UpdateContact_UpdatedContactHasNotChanges_NoErrorThrown(){ - MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddContact(TestData.ContactName, TestData.ContactPhone, TestData.ContactEmail); + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); - Merchant merchantModel = merchantAggregate.GetMerchant(); - var contact = merchantModel.Contacts.ShouldHaveSingleItem(); - contact.ContactName.ShouldBe(TestData.ContactName); - contact.ContactEmailAddress.ShouldBe(TestData.ContactEmail); - contact.ContactPhoneNumber.ShouldBe(TestData.ContactPhone); + Merchant merchantModel = aggregate.GetMerchant(); + Contact? contact = merchantModel.Contacts.ShouldHaveSingleItem(); - merchantAggregate.UpdateContact(contact.ContactId, TestData.ContactName, TestData.ContactEmail, TestData.ContactPhone); + Result result = aggregate.UpdateContact(contact.ContactId, TestData.ContactName, TestData.ContactEmail, TestData.ContactPhone); + result.IsSuccess.ShouldBeTrue(); - merchantModel = merchantAggregate.GetMerchant(); + merchantModel = aggregate.GetMerchant(); contact = merchantModel.Contacts.ShouldHaveSingleItem(); contact.ContactName.ShouldBe(TestData.ContactName); contact.ContactEmailAddress.ShouldBe(TestData.ContactEmail); contact.ContactPhoneNumber.ShouldBe(TestData.ContactPhone); } + [Fact] + public void MerchantAggregate_UpdateContact_MerchantNotCreated_NoErrorThrown() + { + MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); + + Result result = aggregate.UpdateContact(Guid.NewGuid(), + TestData.ContactName, + TestData.ContactEmail, + TestData.ContactPhone); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + [Fact] public void MerchantAggregate_RemoveOperator_OperatorIsRemoved() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); - aggregate.RemoveOperator(TestData.OperatorId); - + + Result result = aggregate.RemoveOperator(TestData.OperatorId); + result.IsSuccess.ShouldBeTrue(); + Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Operators.ShouldHaveSingleItem(); Operator operatorModel = merchantModel.Operators.Single(); @@ -656,25 +734,33 @@ public void MerchantAggregate_RemoveOperator_MerchantNotCreated_ErrorThrown() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - Should.Throw(() => { aggregate.RemoveOperator(TestData.OperatorId); }); + Result result = aggregate.RemoveOperator(TestData.OperatorId); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } - + [Fact] - public void MerchantAggregate_AssignOperator_OperatorNotAlreadyAssigned_ErrorThrown() + public void MerchantAggregate_RemoveOperator_OperatorNotAlreadyAssigned_ErrorThrown() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - - Should.Throw(() => { aggregate.RemoveOperator(TestData.OperatorId); }); - } + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + Result result = aggregate.RemoveOperator(TestData.OperatorId); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + [Fact] public void MerchantAggregate_RemoveContract_ContractIsRemoved() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); aggregate.AddContract(TestData.Aggregates.CreatedContractAggregate()); - aggregate.RemoveContract(TestData.ContractId); + + Result result = aggregate.RemoveContract(TestData.ContractId); + result.IsSuccess.ShouldBeTrue(); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Contracts.ShouldHaveSingleItem(); @@ -687,22 +773,22 @@ public void MerchantAggregate_RemoveContract_ContractIsRemoved() public void MerchantAggregate_RemoveContract_MerchantNotCreated_ErrorThrown() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - - Should.Throw(() => - { - aggregate.RemoveContract(TestData.ContractId); - }); + + Result result = aggregate.RemoveContract(TestData.ContractId); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void MerchantAggregate_RemoveContract_MerchantDoesNotHaveContract_ErrorThrown() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); - aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - Should.Throw(() => - { - aggregate.RemoveContract(TestData.ContractId); - }); + aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); + + Result result = aggregate.RemoveContract(TestData.ContractId); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } } } diff --git a/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs index c4f9a05..9d28b50 100644 --- a/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/MerchantDepositListAggregateTests.cs @@ -1,3 +1,4 @@ +using Shared.EventStore.Aggregate; using Shared.ValueObjects; using Shouldly; using TransactionProcessor.Models.Merchant; @@ -12,7 +13,8 @@ public class MerchantDepositListAggregateTests [Fact] public void MerchantDepositListAggregate_Create_IsCreated() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -26,7 +28,8 @@ public void MerchantDepositListAggregate_Create_IsCreated() { public void MerchantDepositListAggregate_Create_AlreadyCreated_IsCreated() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -49,7 +52,8 @@ public void MerchantDepositListAggregate_Create_MerchantNotCreated_ErrorThrown() [Fact] public void MerchantDepositListAggregate_MakeDeposit_AutomaticDepositSource_DepositMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -70,7 +74,8 @@ public void MerchantDepositListAggregate_MakeDeposit_AutomaticDepositSource_Depo [Fact] public void MerchantDepositListAggregate_MakeDeposit_DepositMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -89,7 +94,8 @@ public void MerchantDepositListAggregate_MakeDeposit_DepositMade() { [Fact] public void MerchantDepositListAggregate_MakeDeposit_DepositSourceNotSet_ErrorThrown() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -105,7 +111,8 @@ public void MerchantDepositListAggregate_MakeDeposit_DepositSourceNotSet_ErrorTh [Fact] public void MerchantDepositListAggregate_MakeDeposit_DuplicateDeposit_ErrorThrown() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -137,7 +144,8 @@ public void MerchantDepositListAggregate_MakeDeposit_MerchantDepositListNotCreat [Fact] public void MerchantDepositListAggregate_MakeDeposit_TwoDeposits_BothDepositsMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -155,7 +163,8 @@ public void MerchantDepositListAggregate_MakeDeposit_TwoDeposits_BothDepositsMad [Fact] public void MerchantDepositListAggregate_MakeDeposit_TwoDepositsOneMonthApartSameDetails_BothDepositsMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -176,7 +185,8 @@ public void MerchantDepositListAggregate_MakeDeposit_TwoDepositsOneMonthApartSam [Fact] public void MerchantDepositListAggregate_MakeDeposit_TwoDepositsSameDetailsApartFromAmounts_BothDepositsMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -197,7 +207,8 @@ public void MerchantDepositListAggregate_MakeDeposit_TwoDepositsSameDetailsApart [Fact] public void MerchantDepositListAggregate_MakeWithdrawal_DuplicateWithdrawal_ErrorThrown() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -219,7 +230,8 @@ public void MerchantDepositListAggregate_MakeWithdrawal_MerchantDepositListNotCr [Fact] public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawals_BothWithdrawalsMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -234,7 +246,8 @@ public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawals_BothWithd [Fact] public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawalsOneMonthApartSameDetails_BothWithdrawalsMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -249,7 +262,8 @@ public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawalsOneMonthAp [Fact] public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawalsSameDetailsApartFromAmounts_BothWithdrawalsMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -264,14 +278,15 @@ public void MerchantDepositListAggregate_MakeWithdrawal_TwoWithdrawalsSameDetail [Fact] public void MerchantDepositListAggregate_MakeWithdrawal_WithdrawalMade() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); merchantDepositListAggregate.MakeWithdrawal(TestData.WithdrawalDateTime, TestData.WithdrawalAmount); - var withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); + List withdrawalListModel = merchantDepositListAggregate.GetWithdrawals(); withdrawalListModel.ShouldHaveSingleItem(); withdrawalListModel.Single().WithdrawalDateTime.ShouldBe(TestData.WithdrawalDateTime); diff --git a/TransactionProcessor.Aggregates/MerchantAggregate.cs b/TransactionProcessor.Aggregates/MerchantAggregate.cs index d6aeee1..310f4d8 100644 --- a/TransactionProcessor.Aggregates/MerchantAggregate.cs +++ b/TransactionProcessor.Aggregates/MerchantAggregate.cs @@ -1,7 +1,8 @@ -using System.Diagnostics.CodeAnalysis; -using Shared.DomainDrivenDesign.EventSourcing; +using Shared.DomainDrivenDesign.EventSourcing; using Shared.EventStore.Aggregate; using Shared.General; +using SimpleResults; +using System.Diagnostics.CodeAnalysis; using TransactionProcessor.DomainEvents; using TransactionProcessor.Models.Contract; using TransactionProcessor.Models.Merchant; @@ -23,71 +24,73 @@ namespace TransactionProcessor.Aggregates { public static class MerchantAggregateExtensions{ - public static void UpdateContact(this MerchantAggregate aggregate, Guid contactId, String contactName, String contactEmailAddress, String contactPhoneNumber){ - aggregate.EnsureMerchantHasBeenCreated(); + public static Result UpdateContact(this MerchantAggregate aggregate, Guid contactId, String contactName, String contactEmailAddress, String contactPhoneNumber){ + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; Boolean isExistingContact = aggregate.Contacts.ContainsKey(contactId); - if (isExistingContact == false) - { + if (isExistingContact == false) { // Not an existing contact, what should we do here ?? - return; + return Result.Success(); } - var existingContact = aggregate.Contacts.Single(a => a.Key == contactId).Value; + Contact existingContact = aggregate.Contacts.Single(a => a.Key == contactId).Value; - var updatedContact = new Contact(contactEmailAddress, contactName, contactPhoneNumber); + Contact updatedContact = new Contact(contactEmailAddress, contactName, contactPhoneNumber); - if (updatedContact == existingContact) - { + if (updatedContact == existingContact) { // No changes - return; + return Result.Success(); } aggregate.HandleContactUpdates(contactId, existingContact, updatedContact); + + return Result.Success(); } - public static void UpdateMerchant(this MerchantAggregate aggregate, String name){ - aggregate.EnsureMerchantHasBeenCreated(); + public static Result UpdateMerchant(this MerchantAggregate aggregate, String name){ + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; if (String.Compare(name, aggregate.Name, StringComparison.InvariantCultureIgnoreCase) != 0 && String.IsNullOrEmpty(name) == false){ // Name has been updated to raise an event for this - MerchantDomainEvents.MerchantNameUpdatedEvent merchantNameUpdatedEvent = new MerchantDomainEvents.MerchantNameUpdatedEvent(aggregate.AggregateId, + MerchantDomainEvents.MerchantNameUpdatedEvent merchantNameUpdatedEvent = new(aggregate.AggregateId, aggregate.EstateId, name); aggregate.ApplyAndAppend(merchantNameUpdatedEvent); } + + return Result.Success(); } - public static void UpdateAddress(this MerchantAggregate aggregate, Guid addressId, - String addressLine1, - String addressLine2, - String addressLine3, - String addressLine4, - String town, - String region, - String postalCode, - String country) + public static Result UpdateAddress(this MerchantAggregate aggregate, AddressModel address) { - aggregate.EnsureMerchantHasBeenCreated(); - - Boolean isExistingAddress = aggregate.Addresses.ContainsKey(addressId); + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + Boolean isExistingAddress = aggregate.Addresses.ContainsKey(address.AddressId); if (isExistingAddress == false){ // Not an existing address, what should we do here ?? - return; + return Result.Success(); } - Address existingAddress = aggregate.Addresses.Single(a => a.Key == addressId).Value; + Address existingAddress = aggregate.Addresses.Single(a => a.Key == address.AddressId).Value; - Address updatedAddress = new Address(addressLine1, addressLine2, addressLine3, addressLine4, town, region, postalCode, country); + Address updatedAddress = new Address(address.AddressLine1, address.AddressLine2, address.AddressLine3, address.AddressLine4, + address.Town, address.Region, address.PostalCode, address.Country); if (updatedAddress == existingAddress){ // No changes - return; + return Result.Success(); } - aggregate.HandleAddressUpdates(addressId,existingAddress, updatedAddress); + aggregate.HandleAddressUpdates(address.AddressId, existingAddress, updatedAddress); + + return Result.Success(); } @@ -175,117 +178,122 @@ private static void HandleAddressUpdates(this MerchantAggregate merchantAggregat } } - public static void AddAddress(this MerchantAggregate aggregate, - String addressLine1, - String addressLine2, - String addressLine3, - String addressLine4, - String town, - String region, - String postalCode, - String country) - { - aggregate.EnsureMerchantHasBeenCreated(); - - if (IsDuplicateAddress(aggregate, addressLine1,addressLine2, addressLine3, addressLine4, town,region, postalCode, country)) - return; - - MerchantDomainEvents.AddressAddedEvent addressAddedEvent = new MerchantDomainEvents.AddressAddedEvent(aggregate.AggregateId, - aggregate.EstateId, - Guid.NewGuid(), - addressLine1, - addressLine2, - addressLine3, - addressLine4, - town, - region, - postalCode, - country); - - aggregate.ApplyAndAppend(addressAddedEvent); - } - - public static void GenerateReference(this MerchantAggregate aggregate) + public static Result AddAddress(this MerchantAggregate aggregate, AddressModel address) { - // Just return as we already have a reference allocated - if (String.IsNullOrEmpty(aggregate.MerchantReference) == false) - return; + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; - aggregate.EnsureMerchantHasBeenCreated(); + if (IsDuplicateAddress(aggregate, address.AddressLine1, address.AddressLine2, address.AddressLine3, address.AddressLine4, + address.Town,address.Region, address.PostalCode, address.Country)) + return Result.Success(); // No need to throw an error, just ignore as we already have this address - String reference = $"{aggregate.AggregateId.GetHashCode():X}"; + MerchantDomainEvents.AddressAddedEvent addressAddedEvent = new(aggregate.AggregateId, aggregate.EstateId, Guid.NewGuid(), + address.AddressLine1, address.AddressLine2, address.AddressLine3, address.AddressLine4, address.Town, + address.Region, address.PostalCode, address.Country); - MerchantDomainEvents.MerchantReferenceAllocatedEvent merchantReferenceAllocatedEvent = new MerchantDomainEvents.MerchantReferenceAllocatedEvent(aggregate.AggregateId, aggregate.EstateId, reference); + aggregate.ApplyAndAppend(addressAddedEvent); - aggregate.ApplyAndAppend(merchantReferenceAllocatedEvent); + return Result.Success(); } - - public static void RemoveContract(this MerchantAggregate aggregate, Guid contractId){ - aggregate.EnsureMerchantHasBeenCreated(); - aggregate.EnsureContractHasBeenAdded(contractId); + + public static Result RemoveContract(this MerchantAggregate aggregate, Guid contractId){ + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureContractHasBeenAdded(contractId); + if (result.IsFailed) + return result; MerchantDomainEvents.ContractRemovedFromMerchantEvent contractRemovedFromMerchantEvent = new MerchantDomainEvents.ContractRemovedFromMerchantEvent(aggregate.AggregateId, aggregate.EstateId, contractId); aggregate.ApplyAndAppend(contractRemovedFromMerchantEvent); + + return Result.Success(); } - public static void AddContract(this MerchantAggregate aggregate, ContractAggregate contractAggregate){ - aggregate.EnsureMerchantHasBeenCreated(); - aggregate.EnsureContractHasNotAlreadyBeenAdded(contractAggregate.AggregateId); + public static Result AddContract(this MerchantAggregate aggregate, ContractAggregate contractAggregate){ + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureContractHasNotAlreadyBeenAdded(contractAggregate.AggregateId); + if (result.IsFailed) + return result; - MerchantDomainEvents.ContractAddedToMerchantEvent contractAddedToMerchantEvent = new MerchantDomainEvents.ContractAddedToMerchantEvent(aggregate.AggregateId, aggregate.EstateId, contractAggregate.AggregateId); + MerchantDomainEvents.ContractAddedToMerchantEvent contractAddedToMerchantEvent = new(aggregate.AggregateId, aggregate.EstateId, contractAggregate.AggregateId); aggregate.ApplyAndAppend(contractAddedToMerchantEvent); foreach (Product product in contractAggregate.GetProducts()){ - MerchantDomainEvents.ContractProductAddedToMerchantEvent contractProductAddedToMerchantEvent = new MerchantDomainEvents.ContractProductAddedToMerchantEvent(aggregate.AggregateId, + MerchantDomainEvents.ContractProductAddedToMerchantEvent contractProductAddedToMerchantEvent = new(aggregate.AggregateId, aggregate.EstateId, contractAggregate.AggregateId, product.ContractProductId); aggregate.ApplyAndAppend(contractProductAddedToMerchantEvent); } + + return Result.Success(); } - public static void AddContact(this MerchantAggregate aggregate, + public static Result AddContact(this MerchantAggregate aggregate, String contactName, String contactPhoneNumber, String contactEmailAddress) { - aggregate.EnsureMerchantHasBeenCreated(); + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; if (IsDuplicateContact(aggregate, contactName, contactEmailAddress, contactPhoneNumber)) - return; + return Result.Success(); - MerchantDomainEvents.ContactAddedEvent contactAddedEvent = - new MerchantDomainEvents.ContactAddedEvent(aggregate.AggregateId, aggregate.EstateId, Guid.NewGuid(), contactName, contactPhoneNumber, contactEmailAddress); + MerchantDomainEvents.ContactAddedEvent contactAddedEvent = new(aggregate.AggregateId, aggregate.EstateId, Guid.NewGuid(), contactName, contactPhoneNumber, contactEmailAddress); aggregate.ApplyAndAppend(contactAddedEvent); + + return Result.Success(); } - public static void AddDevice(this MerchantAggregate aggregate, + public static Result AddDevice(this MerchantAggregate aggregate, Guid deviceId, String deviceIdentifier) { - Guard.ThrowIfNullOrEmpty(deviceIdentifier, typeof(ArgumentNullException), "Device Identifier cannot be null or empty"); + if (String.IsNullOrEmpty(deviceIdentifier)) + return Result.Invalid("Device Identifier cannot be null or empty"); + + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureMerchantHasSpaceForDevice(); + if (result.IsFailed) + return result; - aggregate.EnsureMerchantHasBeenCreated(); - aggregate.EnsureMerchantHasSpaceForDevice(); - MerchantDomainEvents.DeviceAddedToMerchantEvent deviceAddedToMerchantEvent = new MerchantDomainEvents.DeviceAddedToMerchantEvent(aggregate.AggregateId, aggregate.EstateId, deviceId, deviceIdentifier); aggregate.ApplyAndAppend(deviceAddedToMerchantEvent); + + return Result.Success(); } - public static void SwapDevice(this MerchantAggregate aggregate, + public static Result SwapDevice(this MerchantAggregate aggregate, String originalDeviceIdentifier, String newDeviceIdentifier) { - Guard.ThrowIfNullOrEmpty(originalDeviceIdentifier, typeof(ArgumentNullException), "Original Device Identifier cannot be null or empty"); - Guard.ThrowIfNullOrEmpty(newDeviceIdentifier, typeof(ArgumentNullException), "New Device Identifier cannot be null or empty"); + if (String.IsNullOrEmpty(originalDeviceIdentifier)) + return Result.Invalid("Original Device Identifier cannot be null or empty"); + + if (String.IsNullOrEmpty(newDeviceIdentifier)) + return Result.Invalid("New Device Identifier cannot be null or empty"); - aggregate.EnsureMerchantHasBeenCreated(); - aggregate.EnsureDeviceBelongsToMerchant(originalDeviceIdentifier); - aggregate.EnsureDeviceDoesNotAlreadyBelongToMerchant(newDeviceIdentifier); + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureDeviceBelongsToMerchant(originalDeviceIdentifier); + if (result.IsFailed) + return result; + result = aggregate.EnsureDeviceDoesNotAlreadyBelongToMerchant(newDeviceIdentifier); + if (result.IsFailed) + return result; Guid deviceId = Guid.NewGuid(); @@ -293,44 +301,59 @@ public static void SwapDevice(this MerchantAggregate aggregate, deviceId, originalDeviceIdentifier, newDeviceIdentifier); aggregate.ApplyAndAppend(deviceSwappedForMerchantEvent); + + return Result.Success(); } - public static void AddSecurityUser(this MerchantAggregate aggregate, + public static Result AddSecurityUser(this MerchantAggregate aggregate, Guid securityUserId, String emailAddress) { - aggregate.EnsureMerchantHasBeenCreated(); + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; MerchantDomainEvents.SecurityUserAddedToMerchantEvent securityUserAddedEvent = new MerchantDomainEvents.SecurityUserAddedToMerchantEvent(aggregate.AggregateId, aggregate.EstateId, securityUserId, emailAddress); aggregate.ApplyAndAppend(securityUserAddedEvent); + + return Result.Success(); } - public static void AssignOperator(this MerchantAggregate aggregate, + public static Result AssignOperator(this MerchantAggregate aggregate, Guid operatorId, String operatorName, String merchantNumber, String terminalNumber) { - aggregate.EnsureMerchantHasBeenCreated(); - aggregate.EnsureOperatorHasNotAlreadyBeenAssigned(operatorId); + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureOperatorHasNotAlreadyBeenAssigned(operatorId); + if (result.IsFailed) + return result; - MerchantDomainEvents.OperatorAssignedToMerchantEvent operatorAssignedToMerchantEvent = - new MerchantDomainEvents.OperatorAssignedToMerchantEvent(aggregate.AggregateId, aggregate.EstateId, operatorId, operatorName, merchantNumber, terminalNumber); + MerchantDomainEvents.OperatorAssignedToMerchantEvent operatorAssignedToMerchantEvent = new(aggregate.AggregateId, aggregate.EstateId, operatorId, operatorName, merchantNumber, terminalNumber); aggregate.ApplyAndAppend(operatorAssignedToMerchantEvent); + + return Result.Success(); } - public static void RemoveOperator(this MerchantAggregate aggregate, + public static Result RemoveOperator(this MerchantAggregate aggregate, Guid operatorId) { - aggregate.EnsureMerchantHasBeenCreated(); - aggregate.EnsureOperatorHasBeenAssigned(operatorId); + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + result = aggregate.EnsureOperatorHasBeenAssigned(operatorId); + if (result.IsFailed) + return result; - MerchantDomainEvents.OperatorRemovedFromMerchantEvent operatorRemovedFromMerchantEvent = - new MerchantDomainEvents.OperatorRemovedFromMerchantEvent(aggregate.AggregateId, aggregate.EstateId, operatorId); + MerchantDomainEvents.OperatorRemovedFromMerchantEvent operatorRemovedFromMerchantEvent = new(aggregate.AggregateId, aggregate.EstateId, operatorId); aggregate.ApplyAndAppend(operatorRemovedFromMerchantEvent); + return Result.Success(); } public static Merchant GetMerchant(this MerchantAggregate aggregate) @@ -340,7 +363,7 @@ public static Merchant GetMerchant(this MerchantAggregate aggregate) return null; } - Merchant merchantModel = new Merchant(); + Merchant merchantModel = new(); merchantModel.EstateId = aggregate.EstateId; merchantModel.MerchantId = aggregate.AggregateId; @@ -401,12 +424,8 @@ public static Merchant GetMerchant(this MerchantAggregate aggregate) return merchantModel; } - - public static void SetSettlementSchedule(this MerchantAggregate aggregate, SettlementSchedule settlementSchedule) - { - // Check if there has actually been a change or not, if not ignore the request - if (aggregate.SettlementSchedule == settlementSchedule) - return; + + static DateTime CalculateNextSettlementDate(this MerchantAggregate aggregate, SettlementSchedule settlementSchedule) { DateTime nextSettlementDate = DateTime.MinValue; if (settlementSchedule != SettlementSchedule.Immediate) { @@ -427,25 +446,90 @@ public static void SetSettlementSchedule(this MerchantAggregate aggregate, Settl nextSettlementDate = dateForCalculation.AddMonths(1); } } + return nextSettlementDate; + } + + public static Result SetSettlementSchedule(this MerchantAggregate aggregate, SettlementSchedule settlementSchedule) + { + Result result = aggregate.EnsureMerchantHasBeenCreated(); + if (result.IsFailed) + return result; + + if (settlementSchedule == SettlementSchedule.NotSet) + return Result.Invalid("A valid settlement schedule must be provided"); - MerchantDomainEvents.SettlementScheduleChangedEvent settlementScheduleChangedEvent = - new MerchantDomainEvents.SettlementScheduleChangedEvent(aggregate.AggregateId, aggregate.EstateId, (Int32)settlementSchedule, nextSettlementDate); + // Check if there has actually been a change or not, if not ignore the request + if (aggregate.SettlementSchedule == settlementSchedule) + return Result.Success(); + + DateTime nextSettlementDate = CalculateNextSettlementDate(aggregate, settlementSchedule); + + MerchantDomainEvents.SettlementScheduleChangedEvent settlementScheduleChangedEvent = new(aggregate.AggregateId, aggregate.EstateId, (Int32)settlementSchedule, nextSettlementDate); aggregate.ApplyAndAppend(settlementScheduleChangedEvent); + + return Result.Success(); } - public static void Create(this MerchantAggregate aggregate, + public static Result Create(this MerchantAggregate aggregate, Guid estateId, String merchantName, - DateTime dateCreated) + DateTime dateCreated, + TransactionProcessor.Models.Merchant.Address address, + TransactionProcessor.Models.Merchant.Contact contact, + SettlementSchedule settlementSchedule) { // Ensure this merchant has not already been created if (aggregate.IsCreated) - return; + return Result.Success(); + + if (String.IsNullOrEmpty(merchantName)) + return Result.Invalid("Merchant name must be provided when registering a new merchant"); - MerchantDomainEvents.MerchantCreatedEvent merchantCreatedEvent = new MerchantDomainEvents.MerchantCreatedEvent(aggregate.AggregateId, estateId, merchantName, dateCreated); + if (address == null) + return Result.Invalid("An Address must be provided when registering a new merchant"); + + if (contact == null) + return Result.Invalid("A Contact must be provided when registering a new merchant"); + + if (settlementSchedule == SettlementSchedule.NotSet) + return Result.Invalid("A valid settlement schedule must be provided when registering a new merchant"); + + MerchantDomainEvents.MerchantCreatedEvent merchantCreatedEvent = new(aggregate.AggregateId, estateId, merchantName, dateCreated); aggregate.ApplyAndAppend(merchantCreatedEvent); + + String reference = $"{aggregate.AggregateId.GetHashCode():X}"; + + MerchantDomainEvents.MerchantReferenceAllocatedEvent merchantReferenceAllocatedEvent = new(aggregate.AggregateId, aggregate.EstateId, reference); + + aggregate.ApplyAndAppend(merchantReferenceAllocatedEvent); + + MerchantDomainEvents.AddressAddedEvent addressAddedEvent = new(aggregate.AggregateId, + aggregate.EstateId, + Guid.NewGuid(), + address.AddressLine1, + address.AddressLine2, + address.AddressLine3, + address.AddressLine4, + address.Town, + address.Region, + address.PostalCode, + address.Country); + + aggregate.ApplyAndAppend(addressAddedEvent); + + MerchantDomainEvents.ContactAddedEvent contactAddedEvent = new(aggregate.AggregateId, aggregate.EstateId, Guid.NewGuid(), contact.ContactName, contact.ContactPhoneNumber, contact.ContactEmailAddress); + + aggregate.ApplyAndAppend(contactAddedEvent); + + DateTime nextSettlementDate = CalculateNextSettlementDate(aggregate, settlementSchedule); + + MerchantDomainEvents.SettlementScheduleChangedEvent settlementScheduleChangedEvent = new(aggregate.AggregateId, aggregate.EstateId, (Int32)settlementSchedule, nextSettlementDate); + + aggregate.ApplyAndAppend(settlementScheduleChangedEvent); + + return Result.Success(); } public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEvents.MerchantReferenceAllocatedEvent domainEvent) @@ -453,12 +537,11 @@ public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEve aggregate.MerchantReference = domainEvent.MerchantReference; } - private static void EnsureMerchantHasBeenCreated(this MerchantAggregate aggregate) - { - if (aggregate.IsCreated == false) - { - throw new InvalidOperationException("Merchant has not been created"); + private static Result EnsureMerchantHasBeenCreated(this MerchantAggregate aggregate) { + if (aggregate.IsCreated == false) { + return Result.Invalid("Merchant has not been created"); } + return Result.Success(); } private static Boolean IsDuplicateAddress(this MerchantAggregate aggregate, String addressLine1, @@ -500,60 +583,66 @@ private static Boolean IsDuplicateContact(this MerchantAggregate aggregate, Stri return false; } - private static void EnsureDeviceBelongsToMerchant(this MerchantAggregate aggregate, String originalDeviceIdentifier) - { - if (aggregate.Devices.Any(d => d.Value.DeviceIdentifier == originalDeviceIdentifier) == false) - { - throw new InvalidOperationException("Merchant does not have this device allocated"); + private static Result EnsureDeviceBelongsToMerchant(this MerchantAggregate aggregate, + String originalDeviceIdentifier) { + if (aggregate.Devices.Any(d => d.Value.DeviceIdentifier == originalDeviceIdentifier) == false) { + return Result.Invalid("Merchant does not have this device allocated"); } + + return Result.Success(); } - private static void EnsureDeviceDoesNotAlreadyBelongToMerchant(this MerchantAggregate aggregate, String newDeviceIdentifier) - { - if (aggregate.Devices.Any(d => d.Value.DeviceIdentifier == newDeviceIdentifier)) - { - throw new InvalidOperationException("Merchant already has this device allocated"); + private static Result EnsureDeviceDoesNotAlreadyBelongToMerchant(this MerchantAggregate aggregate, + String newDeviceIdentifier) { + if (aggregate.Devices.Any(d => d.Value.DeviceIdentifier == newDeviceIdentifier)) { + return Result.Invalid("Merchant already has this device allocated"); } + + return Result.Success(); } - - private static void EnsureMerchantHasSpaceForDevice(this MerchantAggregate aggregate) - { - if (aggregate.Devices.Count + 1 > aggregate.MaximumDevices) - { - throw new InvalidOperationException($"Merchant {aggregate.Name} already has the maximum devices allocated"); + + private static Result EnsureMerchantHasSpaceForDevice(this MerchantAggregate aggregate) { + if (aggregate.Devices.Count + 1 > aggregate.MaximumDevices) { + return Result.Invalid($"Merchant {aggregate.Name} already has the maximum devices allocated"); } + + return Result.Success(); } - private static void EnsureOperatorHasNotAlreadyBeenAssigned(this MerchantAggregate aggregate, Guid operatorId) - { - if (aggregate.Operators.Any(o => o.Key == operatorId)) - { - throw new InvalidOperationException($"Operator {operatorId} has already been assigned to merchant"); + private static Result EnsureOperatorHasNotAlreadyBeenAssigned(this MerchantAggregate aggregate, + Guid operatorId) { + if (aggregate.Operators.Any(o => o.Key == operatorId)) { + return Result.Invalid($"Operator {operatorId} has already been assigned to merchant"); } + + return Result.Success(); } - private static void EnsureOperatorHasBeenAssigned(this MerchantAggregate aggregate, Guid operatorId) - { - if (aggregate.Operators.Any(o => o.Key == operatorId) == false) - { - throw new InvalidOperationException($"Operator {operatorId} has not been assigned to merchant"); + private static Result EnsureOperatorHasBeenAssigned(this MerchantAggregate aggregate, + Guid operatorId) { + if (aggregate.Operators.Any(o => o.Key == operatorId) == false) { + return Result.Invalid($"Operator {operatorId} has not been assigned to merchant"); } + + return Result.Success(); } - private static void EnsureContractHasNotAlreadyBeenAdded(this MerchantAggregate aggregate, Guid contractId) - { - if (aggregate.Contracts.ContainsKey(contractId)) - { - throw new InvalidOperationException($"Contract {contractId} has already been assigned to merchant"); + private static Result EnsureContractHasNotAlreadyBeenAdded(this MerchantAggregate aggregate, + Guid contractId) { + if (aggregate.Contracts.ContainsKey(contractId)) { + return Result.Invalid($"Contract {contractId} has already been assigned to merchant"); } + + return Result.Success(); } - private static void EnsureContractHasBeenAdded(this MerchantAggregate aggregate, Guid contractId) - { - if (aggregate.Contracts.ContainsKey(contractId) == false) - { - throw new InvalidOperationException($"Contract {contractId} has not been assigned to merchant"); + private static Result EnsureContractHasBeenAdded(this MerchantAggregate aggregate, + Guid contractId) { + if (aggregate.Contracts.ContainsKey(contractId) == false) { + return Result.Invalid($"Contract {contractId} has not been assigned to merchant"); } + + return Result.Success(); } public static void PlayEvent(this MerchantAggregate aggregate, MerchantDomainEvents.MerchantCreatedEvent merchantCreatedEvent) diff --git a/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs b/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs index 56fa359..be8af6d 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Manager/TransactionProcessorManagerTests.cs @@ -333,56 +333,7 @@ public async Task TransactionProcessorManager_GetMerchant_MerchantIsReturned() merchantModel.Operators.Single().TerminalNumber.ShouldBe(expectedModel.Operators.Single().TerminalNumber); } - - [Fact] - public async Task TransactionProcessorManager_GetMerchant_MerchantIsReturnedWithNullAddressesAndContacts() - { - this.AggregateService.Setup(m => m.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.MerchantAggregateWithOperator())); - this.AggregateService.Setup(o => o.GetLatest(It.IsAny(), CancellationToken.None)).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyOperatorAggregate())); - - Result getMerchantResult = await this.TransactionProcessorManager.GetMerchant(TestData.EstateId, TestData.MerchantId, CancellationToken.None); - getMerchantResult.IsSuccess.ShouldBeTrue(); - Merchant merchantModel = getMerchantResult.Data; - - merchantModel.ShouldNotBeNull(); - merchantModel.MerchantId.ShouldBe(TestData.MerchantId); - merchantModel.MerchantName.ShouldBe(TestData.MerchantName); - merchantModel.Addresses.ShouldBeNull(); - merchantModel.Contacts.ShouldBeNull(); - } - - [Fact] - public async Task TransactionProcessorManager_GetMerchant_WithAddress_MerchantIsReturnedWithNullContacts() - { - this.AggregateService.Setup(m => m.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.MerchantAggregateWithAddress())); - - Result getMerchantResult = await this.TransactionProcessorManager.GetMerchant(TestData.EstateId, TestData.MerchantId, CancellationToken.None); - getMerchantResult.IsSuccess.ShouldBeTrue(); - Merchant merchantModel = getMerchantResult.Data; - - merchantModel.ShouldNotBeNull(); - merchantModel.MerchantId.ShouldBe(TestData.MerchantId); - merchantModel.MerchantName.ShouldBe(TestData.MerchantName); - merchantModel.Addresses.ShouldHaveSingleItem(); - merchantModel.Contacts.ShouldBeNull(); - } - - [Fact] - public async Task TransactionProcessorManager_GetMerchant_WithContact_MerchantIsReturnedWithNullAddresses() - { - this.AggregateService.Setup(m => m.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.MerchantAggregateWithContact())); - - Result getMerchantResult = await this.TransactionProcessorManager.GetMerchant(TestData.EstateId, TestData.MerchantId, CancellationToken.None); - getMerchantResult.IsSuccess.ShouldBeTrue(); - Merchant merchantModel = getMerchantResult.Data; - - merchantModel.ShouldNotBeNull(); - merchantModel.MerchantId.ShouldBe(TestData.MerchantId); - merchantModel.MerchantName.ShouldBe(TestData.MerchantName); - merchantModel.Addresses.ShouldBeNull(); - merchantModel.Contacts.ShouldHaveSingleItem(); - } - + [Fact] public async Task TransactionProcessorManager_GetMerchant_MerchantNotCreated_ErrorThrown() { diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs index ea03a41..4c2914a 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs @@ -56,7 +56,6 @@ public MerchantDomainServiceTests() { [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.Immediate)] [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.Monthly)] [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.Weekly)] - [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.NotSet)] public async Task MerchantDomainService_CreateMerchant_MerchantIsCreated( DataTransferObjects.Responses.Merchant.SettlementSchedule settlementSchedule) { this.AggregateService.Setup(m => m.GetLatest(It.IsAny(), It.IsAny())) @@ -829,7 +828,6 @@ public async Task MerchantDomainService_AddContractToMerchant_EstateNotCreated_E [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.Immediate)] [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.Monthly)] [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.Weekly)] - [InlineData(DataTransferObjects.Responses.Merchant.SettlementSchedule.NotSet)] public async Task MerchantDomainService_UpdateMerchant_MerchantIsUpdated( DataTransferObjects.Responses.Merchant.SettlementSchedule settlementSchedule) { this.AggregateService.Setup(m => m.GetLatest(It.IsAny(), It.IsAny())) diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs index 5d7a183..afd5ead 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs @@ -127,7 +127,7 @@ public async Task SettlementDomainService_ProcessSettlement_RunOutOfRetries_Sett Result result = await settlementDomainService.ProcessSettlement(command, CancellationToken.None); result.IsSuccess.ShouldBeFalse(); - this.AggregateService.Verify(s => s.Save(It.IsAny(), It.IsAny()), Times.Exactly(6)); + this.AggregateService.Verify(s => s.Save(It.IsAny(), It.IsAny()), Times.Exactly(7)); } [Fact] diff --git a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs index 7ac4c9b..07a76ff 100644 --- a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs @@ -90,7 +90,9 @@ public async Task AddDeviceToMerchant(MerchantCommands.AddMerchantDevice return ResultHelpers.CreateFailure(result); Guid deviceId = Guid.NewGuid(); - merchantAggregate.AddDevice(deviceId, command.RequestDto.DeviceIdentifier); + Result stateResult = merchantAggregate.AddDevice(deviceId, command.RequestDto.DeviceIdentifier); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -148,7 +150,9 @@ public async Task AssignOperatorToMerchant(MerchantCommands.AssignOperat // Assign the operator // TODO: Swap second parameter to name - merchantAggregate.AssignOperator(command.RequestDto.OperatorId, @operator.Name, command.RequestDto.MerchantNumber, command.RequestDto.TerminalNumber); + Result stateResult = merchantAggregate.AssignOperator(command.RequestDto.OperatorId, @operator.Name, command.RequestDto.MerchantNumber, command.RequestDto.TerminalNumber); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -193,18 +197,17 @@ public async Task CreateMerchant(MerchantCommands.CreateMerchantCommand MerchantAggregate merchantAggregate = merchantResult.Data; - merchantAggregate.Create(command.EstateId, command.RequestDto.Name, command.RequestDto.CreatedDateTime.GetValueOrDefault(DateTime.Now)); - merchantAggregate.GenerateReference(); - - // Add the address - merchantAggregate.AddAddress(command.RequestDto.Address.AddressLine1, command.RequestDto.Address.AddressLine2, command.RequestDto.Address.AddressLine3, command.RequestDto.Address.AddressLine4, command.RequestDto.Address.Town, command.RequestDto.Address.Region, command.RequestDto.Address.PostalCode, command.RequestDto.Address.Country); - - // Add the contact - merchantAggregate.AddContact(command.RequestDto.Contact.ContactName, command.RequestDto.Contact.PhoneNumber, command.RequestDto.Contact.EmailAddress); - + // Build up the models for the Crete call + Address address = new Address(Guid.Empty, command.RequestDto.Address.AddressLine1, command.RequestDto.Address.AddressLine2, command.RequestDto.Address.AddressLine3, command.RequestDto.Address.AddressLine4, command.RequestDto.Address.Town, command.RequestDto.Address.Region, command.RequestDto.Address.PostalCode, command.RequestDto.Address.Country); + Contact contact = new Contact(Guid.Empty, command.RequestDto.Contact.EmailAddress, command.RequestDto.Contact.ContactName, command.RequestDto.Contact.PhoneNumber); // Set the settlement schedule SettlementSchedule settlementSchedule = ConvertSettlementSchedule(command.RequestDto.SettlementSchedule); - merchantAggregate.SetSettlementSchedule(settlementSchedule); + + var stateResult = merchantAggregate.Create(command.EstateId, command.RequestDto.Name, command.RequestDto.CreatedDateTime.GetValueOrDefault(DateTime.Now), + address, contact, settlementSchedule); + if (stateResult.IsFailed) + return stateResult; + Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -264,7 +267,9 @@ public async Task CreateMerchantUser(MerchantCommands.CreateMerchantUser return Result.Failure($"Unable to get user details for username {createUserRequest.EmailAddress}"); // Add the user to the aggregate - merchantAggregate.AddSecurityUser(user.UserId, command.RequestDto.EmailAddress); + Result stateResult = merchantAggregate.AddSecurityUser(user.UserId, command.RequestDto.EmailAddress); + if (stateResult.IsFailed) + return stateResult; // TODO: add a delete user here in case the aggregate add fails... @@ -421,7 +426,9 @@ public async Task AddContractToMerchant(MerchantCommands.AddMerchantCont return Result.Invalid($"Contract Id {command.RequestDto.ContractId} has not been created"); } - merchantAggregate.AddContract(contractAggregate); + Result stateResult = merchantAggregate.AddContract(contractAggregate); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -436,8 +443,7 @@ public async Task AddContractToMerchant(MerchantCommands.AddMerchantCont public async Task UpdateMerchant(MerchantCommands.UpdateMerchantCommand command, CancellationToken cancellationToken) { - try - { + try { Result estateResult = await DomainServiceHelper.GetAggregateOrFailure(ct => this.AggregateService.Get(command.EstateId, ct), command.EstateId, cancellationToken); if (estateResult.IsFailed) return ResultHelpers.CreateFailure(estateResult); @@ -449,15 +455,17 @@ public async Task UpdateMerchant(MerchantCommands.UpdateMerchantCommand EstateAggregate estateAggregate = estateResult.Data; MerchantAggregate merchantAggregate = merchantResult.Data; - Result result = - this.ValidateEstateAndMerchant(estateAggregate, merchantAggregate); - if (result.IsFailed) - return ResultHelpers.CreateFailure(result); - - merchantAggregate.UpdateMerchant(command.RequestDto.Name); + Result result = this.ValidateEstateAndMerchant(estateAggregate, merchantAggregate); + if (result.IsFailed) + return ResultHelpers.CreateFailure(result); - SettlementSchedule settlementSchedule = ConvertSettlementSchedule(command.RequestDto.SettlementSchedule); - merchantAggregate.SetSettlementSchedule(settlementSchedule); + Result stateResult = merchantAggregate.UpdateMerchant(command.RequestDto.Name); + if (stateResult.IsFailed) + return stateResult; + SettlementSchedule settlementSchedule = ConvertSettlementSchedule(command.RequestDto.SettlementSchedule); + stateResult = merchantAggregate.SetSettlementSchedule(settlementSchedule); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -465,8 +473,7 @@ public async Task UpdateMerchant(MerchantCommands.UpdateMerchantCommand return saveResult; } - catch (Exception ex) - { + catch (Exception ex) { return Result.Failure(ex.GetExceptionMessages()); } } @@ -491,14 +498,11 @@ public async Task AddMerchantAddress(MerchantCommands.AddMerchantAddress if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.AddAddress(command.RequestDto.AddressLine1, - command.RequestDto.AddressLine2, - command.RequestDto.AddressLine3, - command.RequestDto.AddressLine4, - command.RequestDto.Town, - command.RequestDto.Region, - command.RequestDto.PostalCode, - command.RequestDto.Country); + Address address = new(Guid.Empty, command.RequestDto.AddressLine1, command.RequestDto.AddressLine2, command.RequestDto.AddressLine3, command.RequestDto.AddressLine4, command.RequestDto.Town, command.RequestDto.Region, command.RequestDto.PostalCode, command.RequestDto.Country); + + Result stateResult = merchantAggregate.AddAddress(address); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -532,15 +536,11 @@ public async Task UpdateMerchantAddress(MerchantCommands.UpdateMerchantA if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.UpdateAddress(command.AddressId, - command.RequestDto.AddressLine1, - command.RequestDto.AddressLine2, - command.RequestDto.AddressLine3, - command.RequestDto.AddressLine4, - command.RequestDto.Town, - command.RequestDto.Region, - command.RequestDto.PostalCode, - command.RequestDto.Country); + Address address = new(command.AddressId, command.RequestDto.AddressLine1, command.RequestDto.AddressLine2, command.RequestDto.AddressLine3, command.RequestDto.AddressLine4, command.RequestDto.Town, command.RequestDto.Region, command.RequestDto.PostalCode, command.RequestDto.Country); + + Result stateResult = merchantAggregate.UpdateAddress(address); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -574,9 +574,11 @@ public async Task AddMerchantContact(MerchantCommands.AddMerchantContact if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.AddContact(command.RequestDto.ContactName, + Result stateResult = merchantAggregate.AddContact(command.RequestDto.ContactName, command.RequestDto.PhoneNumber, command.RequestDto.EmailAddress); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -608,8 +610,9 @@ public async Task UpdateMerchantContact(MerchantCommands.UpdateMerchantC if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.UpdateContact(command.ContactId, command.RequestDto.ContactName, command.RequestDto.EmailAddress, command.RequestDto.PhoneNumber); - ; + Result stateResult = merchantAggregate.UpdateContact(command.ContactId, command.RequestDto.ContactName, command.RequestDto.EmailAddress, command.RequestDto.PhoneNumber); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -640,7 +643,9 @@ public async Task RemoveOperatorFromMerchant(MerchantCommands.RemoveOper if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.RemoveOperator(command.OperatorId); + Result stateResult = merchantAggregate.RemoveOperator(command.OperatorId); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -673,7 +678,9 @@ public async Task RemoveContractFromMerchant(MerchantCommands.RemoveMerc if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.RemoveContract(command.ContractId); + Result stateResult = merchantAggregate.RemoveContract(command.ContractId); + if (stateResult.IsFailed) + return stateResult; Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) @@ -687,25 +694,24 @@ public async Task RemoveContractFromMerchant(MerchantCommands.RemoveMerc } } - private Result ValidateEstateAndMerchant(EstateAggregate estateAggregate, MerchantAggregate merchantAggregate) - { + private Result ValidateEstateAndMerchant(EstateAggregate estateAggregate, + MerchantAggregate merchantAggregate) { // Check merchant has been created - if (merchantAggregate.IsCreated == false) - { + if (merchantAggregate.IsCreated == false) { return Result.Invalid($"Merchant Id {merchantAggregate.AggregateId} has not been created"); } // Estate Id is a valid estate - if (estateAggregate.IsCreated == false) - { + if (estateAggregate.IsCreated == false) { return Result.Invalid($"Estate Id {estateAggregate.AggregateId} has not been created"); } + return Result.Success(); } public async Task SwapMerchantDevice(MerchantCommands.SwapMerchantDeviceCommand command, - CancellationToken cancellationToken) + CancellationToken cancellationToken) { try { @@ -725,7 +731,10 @@ public async Task SwapMerchantDevice(MerchantCommands.SwapMerchantDevice if (result.IsFailed) return ResultHelpers.CreateFailure(result); - merchantAggregate.SwapDevice(command.DeviceIdentifier, command.RequestDto.NewDeviceIdentifier); + Result stateResult = merchantAggregate.SwapDevice(command.DeviceIdentifier, command.RequestDto.NewDeviceIdentifier); + if (stateResult.IsFailed) + return stateResult; + Result saveResult = await this.AggregateService.Save(merchantAggregate, cancellationToken); if (saveResult.IsFailed) return ResultHelpers.CreateFailure(saveResult); diff --git a/TransactionProcessor.Testing/TestData.cs b/TransactionProcessor.Testing/TestData.cs index 7e2dfb5..c67fbbe 100644 --- a/TransactionProcessor.Testing/TestData.cs +++ b/TransactionProcessor.Testing/TestData.cs @@ -15,6 +15,7 @@ using TransactionProcessor.DomainEvents; using TransactionProcessor.Models.Contract; using TransactionProcessor.Models.Merchant; +using Address = TransactionProcessor.Models.Merchant.Address; using AssignOperatorRequest = TransactionProcessor.DataTransferObjects.Requests.Estate.AssignOperatorRequest; using Contract = TransactionProcessor.Models.Merchant.Contract; using Deposit = CallbackHandler.DataTransferObjects.Deposit; @@ -2099,6 +2100,14 @@ public static DataTransferObjects.Requests.Contract.AddTransactionFeeForProductT { MerchantStatementDate = TestData.StatementCreateDate }; + + public static Models.Merchant.Address AddressModel => new (Guid.Empty, AddressLine1, AddressLine2, AddressLine3, AddressLine4, Town, Region, PostCode, Country); + + public static Models.Merchant.Contact ContactModel => new(Guid.Empty, ContactEmail, ContactName, ContactPhone); + + public static SettlementScheduleModel SettlementScheduleModel => SettlementScheduleModel.Immediate; + public static SettlementScheduleModel SettlementScheduleModelNotSet => SettlementScheduleModel.NotSet; + #endregion public static class Commands { @@ -2288,15 +2297,8 @@ public static MerchantAggregate MerchantAggregateWithAddress() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); return merchantAggregate; } @@ -2305,10 +2307,8 @@ public static MerchantAggregate MerchantAggregateWithContact() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); return merchantAggregate; } @@ -2319,7 +2319,8 @@ public static MerchantDepositListAggregate CreatedMerchantDepositListAggregate() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); MerchantDepositListAggregate merchantDepositListAggregate = MerchantDepositListAggregate.Create(TestData.MerchantId); merchantDepositListAggregate.Create(merchantAggregate, TestData.DateMerchantCreated); @@ -2330,7 +2331,8 @@ public static MerchantAggregate MerchantAggregateWithDevice() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); merchantAggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); return merchantAggregate; @@ -2340,7 +2342,8 @@ public static MerchantAggregate MerchantAggregateWithOperator() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); merchantAggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); return merchantAggregate; @@ -2350,20 +2353,10 @@ public static MerchantAggregate MerchantAggregateWithEverything(Models.Merchant. { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); - merchantAggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + settlementSchedule); merchantAggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); - merchantAggregate.SetSettlementSchedule(settlementSchedule); + merchantAggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); merchantAggregate.AddContract(TestData.Aggregates.CreatedContractAggregateWithAProductAndTransactionFee(CalculationType.Fixed,Models.Contract.FeeType.Merchant)); return merchantAggregate; @@ -2373,20 +2366,9 @@ public static MerchantAggregate MerchantAggregateWithNoContracts(SettlementSched { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); - merchantAggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + settlementSchedule); merchantAggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); - merchantAggregate.SetSettlementSchedule(settlementSchedule); merchantAggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); return merchantAggregate; } @@ -2395,20 +2377,10 @@ public static MerchantAggregate MerchantAggregateWithDeletedOperator(SettlementS { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); - merchantAggregate.AddContact(TestData.MerchantContactName, - TestData.MerchantContactPhoneNumber, - TestData.MerchantContactEmailAddress); - merchantAggregate.AddAddress(TestData.MerchantAddressLine1, - TestData.MerchantAddressLine2, - TestData.MerchantAddressLine3, - TestData.MerchantAddressLine4, - TestData.MerchantTown, - TestData.MerchantRegion, - TestData.MerchantPostalCode, - TestData.MerchantCountry); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + settlementSchedule); merchantAggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); - merchantAggregate.SetSettlementSchedule(settlementSchedule); + merchantAggregate.AddDevice(TestData.DeviceId, TestData.DeviceIdentifier); merchantAggregate.RemoveOperator(TestData.OperatorId); return merchantAggregate; @@ -2418,7 +2390,8 @@ public static MerchantAggregate CreatedMerchantAggregate() { MerchantAggregate merchantAggregate = MerchantAggregate.Create(TestData.MerchantId); - merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); + merchantAggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated, TestData.AddressModel, TestData.ContactModel, + TestData.SettlementScheduleModel); return merchantAggregate; } @@ -2595,12 +2568,10 @@ public static Models.Merchant.Merchant MerchantModelWithAddressesContactsDevices MerchantName = TestData.MerchantName, SettlementSchedule = settlementSchedule, Addresses = new List{ - new Models.Merchant.Address(Guid.NewGuid(), MerchantAddressLine1,MerchantAddressLine2, - MerchantAddressLine3,MerchantAddressLine4, MerchantTown,MerchantRegion, - MerchantPostalCode, MerchantCountry) + TestData.AddressModel }, Contacts = new List{ - new Models.Merchant.Contact(Guid.NewGuid(), MerchantContactEmailAddress, MerchantContactName, MerchantContactPhoneNumber) + ContactModel }, Devices = new List{ new Device(DeviceId, DeviceIdentifier)}, Operators= new List() {