From 5e3a763d75ddd4c1fac963e417b70c84311473d7 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 12 May 2020 15:29:08 +0100 Subject: [PATCH] Get Merchants for Estate added --- ...stateManagement.BusinessLogic.Tests.csproj | 6 +- .../Manager/EstateManagementManagerTests.cs | 31 +- .../ModelFactoryTests.cs | 456 +++++++++++++++- .../EstateManagement.BusinessLogic.csproj | 2 +- .../Manger/EstateManagementManager.cs | 14 + .../Manger/IEstateManagementManager.cs | 9 + .../Services/MerchantDomainService.cs | 1 + EstateManagement.Client/EstateClient.cs | 85 ++- EstateManagement.Client/IEstateClient.cs | 12 + .../EstateAggregateTests.cs | 1 + ...ateManagement.EstateAggregate.Tests.csproj | 4 +- .../EstateAggregate.cs | 5 +- .../Estate/Estate.feature.cs | 4 +- .../EstateManagement.IntegrationTests.csproj | 16 +- .../Merchant/Merchant.feature | 92 +++- .../Merchant/Merchant.feature.cs | 502 ++++++++++++++++-- .../Shared/SharedSteps.cs | 15 + ...eManagement.MerchantAggregate.Tests.csproj | 4 +- .../MerchantAggregateTests.cs | 3 +- .../MerchantAggregate.cs | 7 +- EstateManagement.Models/Estate/Estate.cs | 2 +- EstateManagement.Models/Estate/Operator.cs | 2 +- .../Factories/IModelFactory.cs | 25 +- .../Factories/ModelFactory.cs | 96 +++- EstateManagement.Models/Merchant/Merchant.cs | 10 +- .../Merchant/SecurityUser.cs | 32 -- .../{Estate => }/SecurityUser.cs | 0 .../EstateManagement.Repository.Tests.csproj | 10 +- .../EstateManagementRepositoryTests.cs | 81 ++- .../EstateManagementRepository.cs | 53 +- EstateManagement.Testing/TestData.cs | 150 ++++-- .../EstateManagement.Tests.csproj | 8 +- .../Factories/ModelFactoryTests.cs | 28 +- .../Controllers/EstateController.cs | 1 + .../Controllers/MerchantController.cs | 36 ++ EstateManagement/EstateManagement.csproj | 30 +- EstateManagement/Factories/IModelFactory.cs | 10 +- EstateManagement/Factories/ModelFactory.cs | 47 +- EstateManagement/appsettings.development.json | 2 +- EstateManagement/appsettings.json | 2 +- 40 files changed, 1653 insertions(+), 241 deletions(-) delete mode 100644 EstateManagement.Models/Merchant/SecurityUser.cs rename EstateManagement.Models/{Estate => }/SecurityUser.cs (100%) diff --git a/EstateManagement.BusinessLogic.Tests/EstateManagement.BusinessLogic.Tests.csproj b/EstateManagement.BusinessLogic.Tests/EstateManagement.BusinessLogic.Tests.csproj index a074e819..7229a288 100644 --- a/EstateManagement.BusinessLogic.Tests/EstateManagement.BusinessLogic.Tests.csproj +++ b/EstateManagement.BusinessLogic.Tests/EstateManagement.BusinessLogic.Tests.csproj @@ -7,12 +7,12 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/EstateManagement.BusinessLogic.Tests/Manager/EstateManagementManagerTests.cs b/EstateManagement.BusinessLogic.Tests/Manager/EstateManagementManagerTests.cs index 692ad98e..dc74ed20 100644 --- a/EstateManagement.BusinessLogic.Tests/Manager/EstateManagementManagerTests.cs +++ b/EstateManagement.BusinessLogic.Tests/Manager/EstateManagementManagerTests.cs @@ -11,6 +11,7 @@ namespace EstateManagement.BusinessLogic.Tests.Manager using Manger; using MerchantAggregate; using Models; + using Models.Estate; using Models.Factories; using Models.Merchant; using Moq; @@ -72,7 +73,7 @@ public async Task EstateManagementManager_GetEstate_InvalidEstateId_ErrorIsThrow } [Fact] - public async Task EstateManagementManager_GetMerchant_MerchantIsReturnedWithEmptyAddressesAndContacts() + public async Task EstateManagementManager_GetMerchant_MerchantIsReturnedWithNullAddressesAndContacts() { this.MerchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.CreatedMerchantAggregate); @@ -82,12 +83,12 @@ public async Task EstateManagementManager_GetMerchant_MerchantIsReturnedWithEmpt merchantModel.EstateId.ShouldBe(TestData.EstateId); merchantModel.MerchantId.ShouldBe(TestData.MerchantId); merchantModel.MerchantName.ShouldBe(TestData.MerchantName); - merchantModel.Addresses.ShouldBeEmpty(); - merchantModel.Contacts.ShouldBeEmpty(); + merchantModel.Addresses.ShouldBeNull(); + merchantModel.Contacts.ShouldBeNull(); } [Fact] - public async Task EstateManagementManager_GetMerchant_WithAddress_MerchantIsReturnedWithEmptyContacts() + public async Task EstateManagementManager_GetMerchant_WithAddress_MerchantIsReturnedWithNullContacts() { this.MerchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.MerchantAggregateWithAddress); @@ -98,11 +99,11 @@ public async Task EstateManagementManager_GetMerchant_WithAddress_MerchantIsRetu merchantModel.MerchantId.ShouldBe(TestData.MerchantId); merchantModel.MerchantName.ShouldBe(TestData.MerchantName); merchantModel.Addresses.ShouldHaveSingleItem(); - merchantModel.Contacts.ShouldBeEmpty(); + merchantModel.Contacts.ShouldBeNull(); } [Fact] - public async Task EstateManagementManager_GetMerchant_WithContact_MerchantIsReturnedWithEmptyAddresses() + public async Task EstateManagementManager_GetMerchant_WithContact_MerchantIsReturnedWithNullAddresses() { this.MerchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.MerchantAggregateWithContact); @@ -112,8 +113,24 @@ public async Task EstateManagementManager_GetMerchant_WithContact_MerchantIsRetu merchantModel.EstateId.ShouldBe(TestData.EstateId); merchantModel.MerchantId.ShouldBe(TestData.MerchantId); merchantModel.MerchantName.ShouldBe(TestData.MerchantName); - merchantModel.Addresses.ShouldBeEmpty(); + merchantModel.Addresses.ShouldBeNull(); merchantModel.Contacts.ShouldHaveSingleItem(); } + + [Fact] + public async Task EstateManagementManager_GetMerchants_MerchantListIsReturned() + { + this.EstateManagementRepository.Setup(e => e.GetMerchants(It.IsAny(), It.IsAny())).ReturnsAsync(new List + { + TestData + .MerchantModelWithAddressesContactsDevicesAndOperators + }); + + List merchantList = await this.EstateManagementManager.GetMerchants(TestData.EstateId, CancellationToken.None); + + merchantList.ShouldNotBeNull(); + merchantList.ShouldNotBeEmpty(); + merchantList.ShouldHaveSingleItem(); + } } } diff --git a/EstateManagement.BusinessLogic.Tests/ModelFactoryTests.cs b/EstateManagement.BusinessLogic.Tests/ModelFactoryTests.cs index 0d06a1a5..5d36818e 100644 --- a/EstateManagement.BusinessLogic.Tests/ModelFactoryTests.cs +++ b/EstateManagement.BusinessLogic.Tests/ModelFactoryTests.cs @@ -1,11 +1,18 @@ using System; using System.Collections.Generic; using System.Text; -using EstateModel = EstateManagement.Models.Estate; +using EstateModel = EstateManagement.Models.Estate.Estate; using EstateEntity = EstateReporting.Database.Entities.Estate; using EstateOperatorEntity = EstateReporting.Database.Entities.EstateOperator; using EstateSecurityUserEntity = EstateReporting.Database.Entities.EstateSecurityUser; +using MerchantEntity = EstateReporting.Database.Entities.Merchant; +using MerchantAddressEntity = EstateReporting.Database.Entities.MerchantAddress; +using MerchantContactEntity = EstateReporting.Database.Entities.MerchantContact; +using MerchantOperatorEntity = EstateReporting.Database.Entities.MerchantOperator; +using MerchantDeviceEntity = EstateReporting.Database.Entities.MerchantDevice; +using MerchantSecurityUserEntity = EstateReporting.Database.Entities.MerchantSecurityUser; + namespace EstateManagement.BusinessLogic.Tests { using EstateAggregate; @@ -15,6 +22,7 @@ namespace EstateManagement.BusinessLogic.Tests using Shouldly; using Testing; using Xunit; + using Merchant = Models.Merchant.Merchant; public class ModelFactoryTests { @@ -131,5 +139,451 @@ public void EstateEntities_ConvertFrom_NullSecurityUsers_EstateConverted() estateModel.Operators.Count.ShouldBe(estateOperators.Count); estateModel.SecurityUsers.ShouldBeNull(); } + + [Fact] + public void MerchantEntities_ConvertFrom_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NoAddresses_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List(); + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldBeNull(); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NullAddresses_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = null; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldBeNull(); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NoContacts_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List(); + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldBeNull(); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NullContacts_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = null; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldBeNull(); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NoOperators_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List(); + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldBeNull(); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NullOperators_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = null; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldBeNull(); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NoDevices_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List(); + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldBeNull(); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NullDevices_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = null; + List merchantSecurityUsers = new List + { + TestData.MerchantSecurityUserEntity + }; + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldBeNull(); + merchantModel.SecurityUsers.ShouldNotBeNull(); + merchantModel.SecurityUsers.Count.ShouldBe(merchantSecurityUsers.Count); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NoSecurityUsers_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = new List(); + + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldBeNull(); + } + + [Fact] + public void MerchantEntities_ConvertFrom_NullSecurityUsers_MerchantConverted() + { + MerchantEntity merchant = TestData.MerchantEntity; + List merchantAddresses = new List + { + TestData.MerchantAddressEntity + }; + List merchantContacts = new List + { + TestData.MerchantContactEntity + }; + List merchantOperators = new List + { + TestData.MerchantOperatorEntity + }; + List merchantDevices = new List + { + TestData.MerchantDeviceEntity + }; + List merchantSecurityUsers = null; + + ModelFactory modelFactory = new ModelFactory(); + + Merchant merchantModel = modelFactory.ConvertFrom(merchant, merchantAddresses, merchantContacts, merchantOperators, merchantDevices, merchantSecurityUsers); + + merchantModel.ShouldNotBeNull(); + merchantModel.EstateId.ShouldBe(merchant.EstateId); + merchantModel.MerchantId.ShouldBe(merchant.MerchantId); + merchantModel.MerchantName.ShouldBe(merchant.Name); + merchantModel.Addresses.ShouldNotBeNull(); + merchantModel.Addresses.Count.ShouldBe(merchantAddresses.Count); + merchantModel.Contacts.ShouldNotBeNull(); + merchantModel.Contacts.Count.ShouldBe(merchantContacts.Count); + merchantModel.Operators.ShouldNotBeNull(); + merchantModel.Operators.Count.ShouldBe(merchantOperators.Count); + merchantModel.Devices.ShouldNotBeNull(); + merchantModel.Devices.Count.ShouldBe(merchantDevices.Count); + merchantModel.SecurityUsers.ShouldBeNull(); + } } } diff --git a/EstateManagement.BusinessLogic/EstateManagement.BusinessLogic.csproj b/EstateManagement.BusinessLogic/EstateManagement.BusinessLogic.csproj index 3ee17ec6..887f06fd 100644 --- a/EstateManagement.BusinessLogic/EstateManagement.BusinessLogic.csproj +++ b/EstateManagement.BusinessLogic/EstateManagement.BusinessLogic.csproj @@ -7,7 +7,7 @@ - + diff --git a/EstateManagement.BusinessLogic/Manger/EstateManagementManager.cs b/EstateManagement.BusinessLogic/Manger/EstateManagementManager.cs index 31100562..2e1ad76e 100644 --- a/EstateManagement.BusinessLogic/Manger/EstateManagementManager.cs +++ b/EstateManagement.BusinessLogic/Manger/EstateManagementManager.cs @@ -1,11 +1,13 @@ namespace EstateManagement.BusinessLogic.Manger { using System; + using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using EstateAggregate; using MerchantAggregate; using Models; + using Models.Estate; using Models.Factories; using Models.Merchant; using Repository; @@ -98,6 +100,18 @@ public async Task GetMerchant(Guid estateId, return merchantModel; } + /// + /// Gets the merchants. + /// + /// The estate identifier. + /// The cancellation token. + /// + public async Task> GetMerchants(Guid estateId, + CancellationToken cancellationToken) + { + return await this.EstateManagementRepository.GetMerchants(estateId, cancellationToken); + } + #endregion } } \ No newline at end of file diff --git a/EstateManagement.BusinessLogic/Manger/IEstateManagementManager.cs b/EstateManagement.BusinessLogic/Manger/IEstateManagementManager.cs index 0a20bbc9..524e9a6c 100644 --- a/EstateManagement.BusinessLogic/Manger/IEstateManagementManager.cs +++ b/EstateManagement.BusinessLogic/Manger/IEstateManagementManager.cs @@ -1,9 +1,11 @@ namespace EstateManagement.BusinessLogic.Manger { using System; + using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Models; + using Models.Estate; using Models.Merchant; public interface IEstateManagementManager @@ -29,6 +31,13 @@ Task GetEstate(Guid estateId, Task GetMerchant(Guid estateId, Guid merchantId, CancellationToken cancellationToken); + /// + /// Gets the merchants. + /// + /// The estate identifier. + /// The cancellation token. + /// + Task> GetMerchants(Guid estateId, CancellationToken cancellationToken); #endregion } } \ No newline at end of file diff --git a/EstateManagement.BusinessLogic/Services/MerchantDomainService.cs b/EstateManagement.BusinessLogic/Services/MerchantDomainService.cs index 3ab4c992..5f5f0a5d 100644 --- a/EstateManagement.BusinessLogic/Services/MerchantDomainService.cs +++ b/EstateManagement.BusinessLogic/Services/MerchantDomainService.cs @@ -8,6 +8,7 @@ using EstateAggregate; using MerchantAggregate; using Models; + using Models.Estate; using SecurityService.Client; using SecurityService.DataTransferObjects; using Shared.DomainDrivenDesign.EventStore; diff --git a/EstateManagement.Client/EstateClient.cs b/EstateManagement.Client/EstateClient.cs index 848b4acb..3337d114 100644 --- a/EstateManagement.Client/EstateClient.cs +++ b/EstateManagement.Client/EstateClient.cs @@ -1,6 +1,7 @@ namespace EstateManagement.Client { using System; + using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text; @@ -48,6 +49,54 @@ public EstateClient(Func baseAddressResolver, #region Methods + /// + /// Adds the device to merchant. + /// + /// The access token. + /// The estate identifier. + /// The merchant identifier. + /// The add merchant device request. + /// The cancellation token. + /// + public async Task AddDeviceToMerchant(String accessToken, + Guid estateId, + Guid merchantId, + AddMerchantDeviceRequest addMerchantDeviceRequest, + CancellationToken cancellationToken) + { + AddMerchantDeviceResponse response = null; + + String requestUri = $"{this.BaseAddress}/api/estates/{estateId}/merchants/{merchantId}/devices"; + + try + { + String requestSerialised = JsonConvert.SerializeObject(addMerchantDeviceRequest); + + StringContent httpContent = new StringContent(requestSerialised, Encoding.UTF8, "application/json"); + + // Add the access token to the client headers + this.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + + // Make the Http Call here + HttpResponseMessage httpResponse = await this.HttpClient.PostAsync(requestUri, httpContent, cancellationToken); + + // Process the response + String content = await this.HandleResponse(httpResponse, cancellationToken); + + // call was successful so now deserialise the body to the response object + response = JsonConvert.DeserializeObject(content); + } + catch(Exception ex) + { + // An exception has occurred, add some additional information to the message + Exception exception = new Exception($"Error adding device to merchant Id {merchantId} in estate {estateId}.", ex); + + throw exception; + } + + return response; + } + /// /// Assigns the operator to merchant. /// @@ -243,10 +292,10 @@ public async Task CreateMerchant(String accessToken, /// The cancellation token. /// public async Task CreateMerchantUser(String accessToken, - Guid estateId, - Guid merchantId, - CreateMerchantUserRequest createMerchantUserRequest, - CancellationToken cancellationToken) + Guid estateId, + Guid merchantId, + CreateMerchantUserRequest createMerchantUserRequest, + CancellationToken cancellationToken) { CreateMerchantUserResponse response = null; @@ -411,46 +460,38 @@ public async Task GetMerchant(String accessToken, } /// - /// Adds the device to merchant. + /// Gets the merchants. /// /// The access token. /// The estate identifier. - /// The merchant identifier. - /// The add merchant device request. /// The cancellation token. /// - public async Task AddDeviceToMerchant(String accessToken, - Guid estateId, - Guid merchantId, - AddMerchantDeviceRequest addMerchantDeviceRequest, - CancellationToken cancellationToken) + public async Task> GetMerchants(String accessToken, + Guid estateId, + CancellationToken cancellationToken) { - AddMerchantDeviceResponse response = null; + List response = null; - String requestUri = $"{this.BaseAddress}/api/estates/{estateId}/merchants/{merchantId}/devices"; + String requestUri = $"{this.BaseAddress}/api/estates/{estateId}/merchants"; try { - String requestSerialised = JsonConvert.SerializeObject(addMerchantDeviceRequest); - - StringContent httpContent = new StringContent(requestSerialised, Encoding.UTF8, "application/json"); - // Add the access token to the client headers this.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); // Make the Http Call here - HttpResponseMessage httpResponse = await this.HttpClient.PostAsync(requestUri, httpContent, cancellationToken); + HttpResponseMessage httpResponse = await this.HttpClient.GetAsync(requestUri, cancellationToken); // Process the response String content = await this.HandleResponse(httpResponse, cancellationToken); // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + response = JsonConvert.DeserializeObject>(content); } - catch (Exception ex) + catch(Exception ex) { // An exception has occurred, add some additional information to the message - Exception exception = new Exception($"Error adding device to merchant Id {merchantId} in estate {estateId}.", ex); + Exception exception = new Exception($"Error getting merchant list for estate {estateId}.", ex); throw exception; } diff --git a/EstateManagement.Client/IEstateClient.cs b/EstateManagement.Client/IEstateClient.cs index e9201124..01b3a7be 100644 --- a/EstateManagement.Client/IEstateClient.cs +++ b/EstateManagement.Client/IEstateClient.cs @@ -1,6 +1,7 @@ namespace EstateManagement.Client { using System; + using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using DataTransferObjects.Requests; @@ -132,6 +133,17 @@ Task GetMerchant(String accessToken, Guid merchantId, CancellationToken cancellationToken); + /// + /// Gets the merchant. + /// + /// The access token. + /// The estate identifier. + /// The cancellation token. + /// + Task> GetMerchants(String accessToken, + Guid estateId, + CancellationToken cancellationToken); + #endregion } } \ No newline at end of file diff --git a/EstateManagement.EstateAggregate.Tests/EstateAggregateTests.cs b/EstateManagement.EstateAggregate.Tests/EstateAggregateTests.cs index cf656eee..aa1e9e51 100644 --- a/EstateManagement.EstateAggregate.Tests/EstateAggregateTests.cs +++ b/EstateManagement.EstateAggregate.Tests/EstateAggregateTests.cs @@ -4,6 +4,7 @@ using System.Linq; using EstateManagement.Testing; using Models; + using Models.Estate; using Shouldly; using Xunit; diff --git a/EstateManagement.EstateAggregate.Tests/EstateManagement.EstateAggregate.Tests.csproj b/EstateManagement.EstateAggregate.Tests/EstateManagement.EstateAggregate.Tests.csproj index 494636ec..e4a58d4c 100644 --- a/EstateManagement.EstateAggregate.Tests/EstateManagement.EstateAggregate.Tests.csproj +++ b/EstateManagement.EstateAggregate.Tests/EstateManagement.EstateAggregate.Tests.csproj @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/EstateManagement.EstateAggregate/EstateAggregate.cs b/EstateManagement.EstateAggregate/EstateAggregate.cs index f39d96e0..29c70523 100644 --- a/EstateManagement.EstateAggregate/EstateAggregate.cs +++ b/EstateManagement.EstateAggregate/EstateAggregate.cs @@ -6,6 +6,7 @@ using System.Linq; using Estate.DomainEvents; using Models; + using Models.Estate; using Shared.DomainDrivenDesign.EventSourcing; using Shared.DomainDrivenDesign.EventStore; using Shared.General; @@ -156,11 +157,11 @@ public Estate GetEstate() if (this.Operators.Any()) { - estateModel.Operators = new List(); + estateModel.Operators = new List(); foreach (Operator @operator in this.Operators) { - estateModel.Operators.Add(new Models.Operator + estateModel.Operators.Add(new Models.Estate.Operator { OperatorId = @operator.OperatorId, Name = @operator.Name, diff --git a/EstateManagement.IntegrationTests/Estate/Estate.feature.cs b/EstateManagement.IntegrationTests/Estate/Estate.feature.cs index 55e5d056..7b59a844 100644 --- a/EstateManagement.IntegrationTests/Estate/Estate.feature.cs +++ b/EstateManagement.IntegrationTests/Estate/Estate.feature.cs @@ -1,4 +1,4 @@ -// ------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // // This code was generated by SpecFlow (http://www.specflow.org/). // SpecFlow Version:3.1.0.0 @@ -21,7 +21,7 @@ namespace EstateManagement.IntegrationTests.Estate [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [Xunit.TraitAttribute("Category", "base")] [Xunit.TraitAttribute("Category", "shared")] - public partial class EstateFeature : Xunit.IClassFixture, System.IDisposable + public partial class EstateFeature : object, Xunit.IClassFixture, System.IDisposable { private static TechTalk.SpecFlow.ITestRunner testRunner; diff --git a/EstateManagement.IntegrationTests/EstateManagement.IntegrationTests.csproj b/EstateManagement.IntegrationTests/EstateManagement.IntegrationTests.csproj index a51a69a2..6eea2aa2 100644 --- a/EstateManagement.IntegrationTests/EstateManagement.IntegrationTests.csproj +++ b/EstateManagement.IntegrationTests/EstateManagement.IntegrationTests.csproj @@ -10,23 +10,23 @@ - - - - + + + + - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/EstateManagement.IntegrationTests/Merchant/Merchant.feature b/EstateManagement.IntegrationTests/Merchant/Merchant.feature index 6e8b0b94..f9b27d56 100644 --- a/EstateManagement.IntegrationTests/Merchant/Merchant.feature +++ b/EstateManagement.IntegrationTests/Merchant/Merchant.feature @@ -24,14 +24,17 @@ Background: Given I have created the following estates | EstateName | | Test Estate 1 | + | Test Estate 2 | Given I have created the following operators | EstateName | OperatorName | RequireCustomMerchantNumber | RequireCustomTerminalNumber | | Test Estate 1 | Test Operator 1 | True | True | + | Test Estate 2 | Test Operator 1 | True | True | Given I have created the following security users | EmailAddress | Password | GivenName | FamilyName | EstateName | | estateuser1@testestate1.co.uk | 123456 | TestEstate | User1 | Test Estate 1 | + | estateuser1@testestate2.co.uk | 123456 | TestEstate | User1 | Test Estate 2 | Scenario: Create Merchant - System Login When I create the following merchants @@ -43,8 +46,7 @@ Scenario: Create Merchant - Estate User When I create the following merchants | MerchantName | AddressLine1 | Town | Region | Country | ContactName | EmailAddress | EstateName | | Test Merchant 1 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant1.co.uk | Test Estate 1 | - -@PRTest + Scenario: Assign Operator To Merchant - System Login Given I create the following merchants | MerchantName | AddressLine1 | Town | Region | Country | ContactName | EmailAddress | EstateName | @@ -65,7 +67,6 @@ Scenario: Assign Operator To Merchant - Estate User | OperatorName | MerchantName | MerchantNumber | TerminalNumber | EstateName | | Test Operator 1 | Test Merchant 1 | 00000001 | 10000001 | Test Estate 1 | -@PRTest Scenario: Create Security User - System Login Given I create the following merchants | MerchantName | AddressLine1 | Town | Region | Country | ContactName | EmailAddress | EstateName | @@ -75,7 +76,6 @@ Scenario: Create Security User - System Login | EmailAddress | Password | GivenName | FamilyName | MerchantName | EstateName | | merchantuser1@testmerchant1.co.uk | 123456 | TestMerchant | User1 | Test Merchant 1 | Test Estate 1 | -@PRTest Scenario: Create Security User - Estate User Given I am logged in as "estateuser1@testestate1.co.uk" with password "123456" for Estate "Test Estate 1" with client "estateClient" @@ -105,4 +105,86 @@ Scenario: Add Device To Merchant - System Login When I add the following devices to the merchant | DeviceIdentifier | MerchantName | EstateName | - | TestDevice1 | Test Merchant 1 | Test Estate 1 | \ No newline at end of file + | TestDevice1 | Test Merchant 1 | Test Estate 1 | + +@PRTest +Scenario: Get Merchats for Estate - System Login + Given I create the following merchants + | MerchantName | AddressLine1 | Town | Region | Country | ContactName | EmailAddress | EstateName | + | Test Merchant 1 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant1.co.uk | Test Estate 1 | + | Test Merchant 2 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant2.co.uk | Test Estate 1 | + | Test Merchant 3 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant3.co.uk | Test Estate 1 | + | Test Merchant 4 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant4.co.uk | Test Estate 2 | + | Test Merchant 5 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant5.co.uk | Test Estate 2 | + + When I assign the following operator to the merchants + | OperatorName | MerchantName | MerchantNumber | TerminalNumber | EstateName | + | Test Operator 1 | Test Merchant 1 | 00000001 | 10000001 | Test Estate 1 | + | Test Operator 1 | Test Merchant 2 | 00000001 | 10000001 | Test Estate 1 | + | Test Operator 1 | Test Merchant 3 | 00000001 | 10000001 | Test Estate 1 | + | Test Operator 1 | Test Merchant 4 | 00000001 | 10000001 | Test Estate 2 | + | Test Operator 1 | Test Merchant 5 | 00000001 | 10000001 | Test Estate 2 | + + When I create the following security users + | EmailAddress | Password | GivenName | FamilyName | MerchantName | EstateName | + | merchantuser1@testmerchant1.co.uk | 123456 | TestMerchant | User1 | Test Merchant 1 | Test Estate 1 | + | merchantuser1@testmerchant2.co.uk | 123456 | TestMerchant | User1 | Test Merchant 2 | Test Estate 1 | + | merchantuser1@testmerchant3.co.uk | 123456 | TestMerchant | User1 | Test Merchant 3 | Test Estate 1 | + | merchantuser1@testmerchant4.co.uk | 123456 | TestMerchant | User1 | Test Merchant 4 | Test Estate 2 | + | merchantuser1@testmerchant5.co.uk | 123456 | TestMerchant | User1 | Test Merchant 5 | Test Estate 2 | + + When I add the following devices to the merchant + | DeviceIdentifier | MerchantName | EstateName | + | TestDevice1 | Test Merchant 1 | Test Estate 1 | + | TestDevice2 | Test Merchant 2 | Test Estate 1 | + | TestDevice3 | Test Merchant 3 | Test Estate 1 | + | TestDevice4 | Test Merchant 4 | Test Estate 2 | + | TestDevice5 | Test Merchant 5 | Test Estate 2 | + + When I get the merchants for 'Test Estate 1' then 3 merchants will be returned + + When I get the merchants for 'Test Estate 2' then 2 merchants will be returned + +@PRTest +Scenario: Get Merchats for Estate - Estate Login + Given I create the following merchants + | MerchantName | AddressLine1 | Town | Region | Country | ContactName | EmailAddress | EstateName | + | Test Merchant 1 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant1.co.uk | Test Estate 1 | + | Test Merchant 2 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant2.co.uk | Test Estate 1 | + | Test Merchant 3 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant3.co.uk | Test Estate 1 | + | Test Merchant 4 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant4.co.uk | Test Estate 2 | + | Test Merchant 5 | Address Line 1 | TestTown | Test Region | United Kingdom | Test Contact 1 | testcontact1@merchant5.co.uk | Test Estate 2 | + + When I assign the following operator to the merchants + | OperatorName | MerchantName | MerchantNumber | TerminalNumber | EstateName | + | Test Operator 1 | Test Merchant 1 | 00000001 | 10000001 | Test Estate 1 | + | Test Operator 1 | Test Merchant 2 | 00000001 | 10000001 | Test Estate 1 | + | Test Operator 1 | Test Merchant 3 | 00000001 | 10000001 | Test Estate 1 | + | Test Operator 1 | Test Merchant 4 | 00000001 | 10000001 | Test Estate 2 | + | Test Operator 1 | Test Merchant 5 | 00000001 | 10000001 | Test Estate 2 | + + When I create the following security users + | EmailAddress | Password | GivenName | FamilyName | MerchantName | EstateName | + | merchantuser1@testmerchant1.co.uk | 123456 | TestMerchant | User1 | Test Merchant 1 | Test Estate 1 | + | merchantuser1@testmerchant2.co.uk | 123456 | TestMerchant | User1 | Test Merchant 2 | Test Estate 1 | + | merchantuser1@testmerchant3.co.uk | 123456 | TestMerchant | User1 | Test Merchant 3 | Test Estate 1 | + | merchantuser1@testmerchant4.co.uk | 123456 | TestMerchant | User1 | Test Merchant 4 | Test Estate 2 | + | merchantuser1@testmerchant5.co.uk | 123456 | TestMerchant | User1 | Test Merchant 5 | Test Estate 2 | + + When I add the following devices to the merchant + | DeviceIdentifier | MerchantName | EstateName | + | TestDevice1 | Test Merchant 1 | Test Estate 1 | + | TestDevice2 | Test Merchant 2 | Test Estate 1 | + | TestDevice3 | Test Merchant 3 | Test Estate 1 | + | TestDevice4 | Test Merchant 4 | Test Estate 2 | + | TestDevice5 | Test Merchant 5 | Test Estate 2 | + + Given I am logged in as "estateuser1@testestate1.co.uk" with password "123456" for Estate "Test Estate 1" with client "estateClient" + + When I get the merchants for 'Test Estate 1' then 3 merchants will be returned + + Given I am logged in as "estateuser1@testestate2.co.uk" with password "123456" for Estate "Test Estate 2" with client "estateClient" + + When I get the merchants for 'Test Estate 2' then 2 merchants will be returned + + diff --git a/EstateManagement.IntegrationTests/Merchant/Merchant.feature.cs b/EstateManagement.IntegrationTests/Merchant/Merchant.feature.cs index c899c122..c39fe611 100644 --- a/EstateManagement.IntegrationTests/Merchant/Merchant.feature.cs +++ b/EstateManagement.IntegrationTests/Merchant/Merchant.feature.cs @@ -1,4 +1,4 @@ -// ------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // // This code was generated by SpecFlow (http://www.specflow.org/). // SpecFlow Version:3.1.0.0 @@ -21,7 +21,7 @@ namespace EstateManagement.IntegrationTests.Merchant [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [Xunit.TraitAttribute("Category", "base")] [Xunit.TraitAttribute("Category", "shared")] - public partial class MerchantFeature : Xunit.IClassFixture, System.IDisposable + public partial class MerchantFeature : object, Xunit.IClassFixture, System.IDisposable { private static TechTalk.SpecFlow.ITestRunner testRunner; @@ -141,6 +141,8 @@ public virtual void FeatureBackground() "EstateName"}); table26.AddRow(new string[] { "Test Estate 1"}); + table26.AddRow(new string[] { + "Test Estate 2"}); #line 24 testRunner.Given("I have created the following estates", ((string)(null)), table26, "Given "); #line hidden @@ -154,7 +156,12 @@ public virtual void FeatureBackground() "Test Operator 1", "True", "True"}); -#line 28 + table27.AddRow(new string[] { + "Test Estate 2", + "Test Operator 1", + "True", + "True"}); +#line 29 testRunner.Given("I have created the following operators", ((string)(null)), table27, "Given "); #line hidden TechTalk.SpecFlow.Table table28 = new TechTalk.SpecFlow.Table(new string[] { @@ -169,7 +176,13 @@ public virtual void FeatureBackground() "TestEstate", "User1", "Test Estate 1"}); -#line 32 + table28.AddRow(new string[] { + "estateuser1@testestate2.co.uk", + "123456", + "TestEstate", + "User1", + "Test Estate 2"}); +#line 34 testRunner.Given("I have created the following security users", ((string)(null)), table28, "Given "); #line hidden } @@ -186,7 +199,7 @@ public virtual void CreateMerchant_SystemLogin() { string[] tagsOfScenario = ((string[])(null)); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create Merchant - System Login", null, ((string[])(null))); -#line 36 +#line 39 this.ScenarioInitialize(scenarioInfo); #line hidden bool isScenarioIgnored = default(bool); @@ -227,7 +240,7 @@ public virtual void CreateMerchant_SystemLogin() "Test Contact 1", "testcontact1@merchant1.co.uk", "Test Estate 1"}); -#line 37 +#line 40 testRunner.When("I create the following merchants", ((string)(null)), table29, "When "); #line hidden } @@ -241,7 +254,7 @@ public virtual void CreateMerchant_EstateUser() { string[] tagsOfScenario = ((string[])(null)); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create Merchant - Estate User", null, ((string[])(null))); -#line 41 +#line 44 this.ScenarioInitialize(scenarioInfo); #line hidden bool isScenarioIgnored = default(bool); @@ -264,7 +277,7 @@ public virtual void CreateMerchant_EstateUser() #line 4 this.FeatureBackground(); #line hidden -#line 42 +#line 45 testRunner.Given("I am logged in as \"estateuser1@testestate1.co.uk\" with password \"123456\" for Esta" + "te \"Test Estate 1\" with client \"estateClient\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden @@ -286,7 +299,7 @@ public virtual void CreateMerchant_EstateUser() "Test Contact 1", "testcontact1@merchant1.co.uk", "Test Estate 1"}); -#line 43 +#line 46 testRunner.When("I create the following merchants", ((string)(null)), table30, "When "); #line hidden } @@ -296,14 +309,11 @@ public virtual void CreateMerchant_EstateUser() [Xunit.SkippableFactAttribute(DisplayName="Assign Operator To Merchant - System Login")] [Xunit.TraitAttribute("FeatureTitle", "Merchant")] [Xunit.TraitAttribute("Description", "Assign Operator To Merchant - System Login")] - [Xunit.TraitAttribute("Category", "PRTest")] public virtual void AssignOperatorToMerchant_SystemLogin() { - string[] tagsOfScenario = new string[] { - "PRTest"}; - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Assign Operator To Merchant - System Login", null, new string[] { - "PRTest"}); -#line 48 + string[] tagsOfScenario = ((string[])(null)); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Assign Operator To Merchant - System Login", null, ((string[])(null))); +#line 50 this.ScenarioInitialize(scenarioInfo); #line hidden bool isScenarioIgnored = default(bool); @@ -344,7 +354,7 @@ public virtual void AssignOperatorToMerchant_SystemLogin() "Test Contact 1", "testcontact1@merchant1.co.uk", "Test Estate 1"}); -#line 49 +#line 51 testRunner.Given("I create the following merchants", ((string)(null)), table31, "Given "); #line hidden TechTalk.SpecFlow.Table table32 = new TechTalk.SpecFlow.Table(new string[] { @@ -359,7 +369,7 @@ public virtual void AssignOperatorToMerchant_SystemLogin() "00000001", "10000001", "Test Estate 1"}); -#line 53 +#line 55 testRunner.When("I assign the following operator to the merchants", ((string)(null)), table32, "When "); #line hidden } @@ -373,7 +383,7 @@ public virtual void AssignOperatorToMerchant_EstateUser() { string[] tagsOfScenario = ((string[])(null)); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Assign Operator To Merchant - Estate User", null, ((string[])(null))); -#line 57 +#line 59 this.ScenarioInitialize(scenarioInfo); #line hidden bool isScenarioIgnored = default(bool); @@ -396,7 +406,7 @@ public virtual void AssignOperatorToMerchant_EstateUser() #line 4 this.FeatureBackground(); #line hidden -#line 58 +#line 60 testRunner.Given("I am logged in as \"estateuser1@testestate1.co.uk\" with password \"123456\" for Esta" + "te \"Test Estate 1\" with client \"estateClient\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden @@ -418,7 +428,7 @@ public virtual void AssignOperatorToMerchant_EstateUser() "Test Contact 1", "testcontact1@merchant1.co.uk", "Test Estate 1"}); -#line 60 +#line 62 testRunner.Given("I create the following merchants", ((string)(null)), table33, "Given "); #line hidden TechTalk.SpecFlow.Table table34 = new TechTalk.SpecFlow.Table(new string[] { @@ -433,7 +443,7 @@ public virtual void AssignOperatorToMerchant_EstateUser() "00000001", "10000001", "Test Estate 1"}); -#line 64 +#line 66 testRunner.When("I assign the following operator to the merchants", ((string)(null)), table34, "When "); #line hidden } @@ -443,14 +453,11 @@ public virtual void AssignOperatorToMerchant_EstateUser() [Xunit.SkippableFactAttribute(DisplayName="Create Security User - System Login")] [Xunit.TraitAttribute("FeatureTitle", "Merchant")] [Xunit.TraitAttribute("Description", "Create Security User - System Login")] - [Xunit.TraitAttribute("Category", "PRTest")] public virtual void CreateSecurityUser_SystemLogin() { - string[] tagsOfScenario = new string[] { - "PRTest"}; - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create Security User - System Login", null, new string[] { - "PRTest"}); -#line 69 + string[] tagsOfScenario = ((string[])(null)); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create Security User - System Login", null, ((string[])(null))); +#line 70 this.ScenarioInitialize(scenarioInfo); #line hidden bool isScenarioIgnored = default(bool); @@ -491,7 +498,7 @@ public virtual void CreateSecurityUser_SystemLogin() "Test Contact 1", "testcontact1@merchant1.co.uk", "Test Estate 1"}); -#line 70 +#line 71 testRunner.Given("I create the following merchants", ((string)(null)), table35, "Given "); #line hidden TechTalk.SpecFlow.Table table36 = new TechTalk.SpecFlow.Table(new string[] { @@ -508,7 +515,7 @@ public virtual void CreateSecurityUser_SystemLogin() "User1", "Test Merchant 1", "Test Estate 1"}); -#line 74 +#line 75 testRunner.When("I create the following security users", ((string)(null)), table36, "When "); #line hidden } @@ -518,13 +525,10 @@ public virtual void CreateSecurityUser_SystemLogin() [Xunit.SkippableFactAttribute(DisplayName="Create Security User - Estate User")] [Xunit.TraitAttribute("FeatureTitle", "Merchant")] [Xunit.TraitAttribute("Description", "Create Security User - Estate User")] - [Xunit.TraitAttribute("Category", "PRTest")] public virtual void CreateSecurityUser_EstateUser() { - string[] tagsOfScenario = new string[] { - "PRTest"}; - TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create Security User - Estate User", null, new string[] { - "PRTest"}); + string[] tagsOfScenario = ((string[])(null)); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create Security User - Estate User", null, ((string[])(null))); #line 79 this.ScenarioInitialize(scenarioInfo); #line hidden @@ -730,6 +734,436 @@ public virtual void AddDeviceToMerchant_SystemLogin() this.ScenarioCleanup(); } + [Xunit.SkippableFactAttribute(DisplayName="Get Merchats for Estate - System Login")] + [Xunit.TraitAttribute("FeatureTitle", "Merchant")] + [Xunit.TraitAttribute("Description", "Get Merchats for Estate - System Login")] + [Xunit.TraitAttribute("Category", "PRTest")] + public virtual void GetMerchatsForEstate_SystemLogin() + { + string[] tagsOfScenario = new string[] { + "PRTest"}; + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Get Merchats for Estate - System Login", null, new string[] { + "PRTest"}); +#line 111 +this.ScenarioInitialize(scenarioInfo); +#line hidden + bool isScenarioIgnored = default(bool); + bool isFeatureIgnored = default(bool); + if ((tagsOfScenario != null)) + { + isScenarioIgnored = tagsOfScenario.Where(__entry => __entry != null).Where(__entry => String.Equals(__entry, "ignore", StringComparison.CurrentCultureIgnoreCase)).Any(); + } + if ((this._featureTags != null)) + { + isFeatureIgnored = this._featureTags.Where(__entry => __entry != null).Where(__entry => String.Equals(__entry, "ignore", StringComparison.CurrentCultureIgnoreCase)).Any(); + } + if ((isScenarioIgnored || isFeatureIgnored)) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 4 +this.FeatureBackground(); +#line hidden + TechTalk.SpecFlow.Table table43 = new TechTalk.SpecFlow.Table(new string[] { + "MerchantName", + "AddressLine1", + "Town", + "Region", + "Country", + "ContactName", + "EmailAddress", + "EstateName"}); + table43.AddRow(new string[] { + "Test Merchant 1", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant1.co.uk", + "Test Estate 1"}); + table43.AddRow(new string[] { + "Test Merchant 2", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant2.co.uk", + "Test Estate 1"}); + table43.AddRow(new string[] { + "Test Merchant 3", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant3.co.uk", + "Test Estate 1"}); + table43.AddRow(new string[] { + "Test Merchant 4", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant4.co.uk", + "Test Estate 2"}); + table43.AddRow(new string[] { + "Test Merchant 5", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant5.co.uk", + "Test Estate 2"}); +#line 112 + testRunner.Given("I create the following merchants", ((string)(null)), table43, "Given "); +#line hidden + TechTalk.SpecFlow.Table table44 = new TechTalk.SpecFlow.Table(new string[] { + "OperatorName", + "MerchantName", + "MerchantNumber", + "TerminalNumber", + "EstateName"}); + table44.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 1", + "00000001", + "10000001", + "Test Estate 1"}); + table44.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 2", + "00000001", + "10000001", + "Test Estate 1"}); + table44.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 3", + "00000001", + "10000001", + "Test Estate 1"}); + table44.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 4", + "00000001", + "10000001", + "Test Estate 2"}); + table44.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 5", + "00000001", + "10000001", + "Test Estate 2"}); +#line 120 + testRunner.When("I assign the following operator to the merchants", ((string)(null)), table44, "When "); +#line hidden + TechTalk.SpecFlow.Table table45 = new TechTalk.SpecFlow.Table(new string[] { + "EmailAddress", + "Password", + "GivenName", + "FamilyName", + "MerchantName", + "EstateName"}); + table45.AddRow(new string[] { + "merchantuser1@testmerchant1.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 1", + "Test Estate 1"}); + table45.AddRow(new string[] { + "merchantuser1@testmerchant2.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 2", + "Test Estate 1"}); + table45.AddRow(new string[] { + "merchantuser1@testmerchant3.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 3", + "Test Estate 1"}); + table45.AddRow(new string[] { + "merchantuser1@testmerchant4.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 4", + "Test Estate 2"}); + table45.AddRow(new string[] { + "merchantuser1@testmerchant5.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 5", + "Test Estate 2"}); +#line 128 + testRunner.When("I create the following security users", ((string)(null)), table45, "When "); +#line hidden + TechTalk.SpecFlow.Table table46 = new TechTalk.SpecFlow.Table(new string[] { + "DeviceIdentifier", + "MerchantName", + "EstateName"}); + table46.AddRow(new string[] { + "TestDevice1", + "Test Merchant 1", + "Test Estate 1"}); + table46.AddRow(new string[] { + "TestDevice2", + "Test Merchant 2", + "Test Estate 1"}); + table46.AddRow(new string[] { + "TestDevice3", + "Test Merchant 3", + "Test Estate 1"}); + table46.AddRow(new string[] { + "TestDevice4", + "Test Merchant 4", + "Test Estate 2"}); + table46.AddRow(new string[] { + "TestDevice5", + "Test Merchant 5", + "Test Estate 2"}); +#line 136 + testRunner.When("I add the following devices to the merchant", ((string)(null)), table46, "When "); +#line hidden +#line 144 + testRunner.When("I get the merchants for \'Test Estate 1\' then 3 merchants will be returned", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 146 + testRunner.When("I get the merchants for \'Test Estate 2\' then 2 merchants will be returned", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden + } + this.ScenarioCleanup(); + } + + [Xunit.SkippableFactAttribute(DisplayName="Get Merchats for Estate - Estate Login")] + [Xunit.TraitAttribute("FeatureTitle", "Merchant")] + [Xunit.TraitAttribute("Description", "Get Merchats for Estate - Estate Login")] + [Xunit.TraitAttribute("Category", "PRTest")] + public virtual void GetMerchatsForEstate_EstateLogin() + { + string[] tagsOfScenario = new string[] { + "PRTest"}; + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Get Merchats for Estate - Estate Login", null, new string[] { + "PRTest"}); +#line 149 +this.ScenarioInitialize(scenarioInfo); +#line hidden + bool isScenarioIgnored = default(bool); + bool isFeatureIgnored = default(bool); + if ((tagsOfScenario != null)) + { + isScenarioIgnored = tagsOfScenario.Where(__entry => __entry != null).Where(__entry => String.Equals(__entry, "ignore", StringComparison.CurrentCultureIgnoreCase)).Any(); + } + if ((this._featureTags != null)) + { + isFeatureIgnored = this._featureTags.Where(__entry => __entry != null).Where(__entry => String.Equals(__entry, "ignore", StringComparison.CurrentCultureIgnoreCase)).Any(); + } + if ((isScenarioIgnored || isFeatureIgnored)) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 4 +this.FeatureBackground(); +#line hidden + TechTalk.SpecFlow.Table table47 = new TechTalk.SpecFlow.Table(new string[] { + "MerchantName", + "AddressLine1", + "Town", + "Region", + "Country", + "ContactName", + "EmailAddress", + "EstateName"}); + table47.AddRow(new string[] { + "Test Merchant 1", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant1.co.uk", + "Test Estate 1"}); + table47.AddRow(new string[] { + "Test Merchant 2", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant2.co.uk", + "Test Estate 1"}); + table47.AddRow(new string[] { + "Test Merchant 3", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant3.co.uk", + "Test Estate 1"}); + table47.AddRow(new string[] { + "Test Merchant 4", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant4.co.uk", + "Test Estate 2"}); + table47.AddRow(new string[] { + "Test Merchant 5", + "Address Line 1", + "TestTown", + "Test Region", + "United Kingdom", + "Test Contact 1", + "testcontact1@merchant5.co.uk", + "Test Estate 2"}); +#line 150 + testRunner.Given("I create the following merchants", ((string)(null)), table47, "Given "); +#line hidden + TechTalk.SpecFlow.Table table48 = new TechTalk.SpecFlow.Table(new string[] { + "OperatorName", + "MerchantName", + "MerchantNumber", + "TerminalNumber", + "EstateName"}); + table48.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 1", + "00000001", + "10000001", + "Test Estate 1"}); + table48.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 2", + "00000001", + "10000001", + "Test Estate 1"}); + table48.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 3", + "00000001", + "10000001", + "Test Estate 1"}); + table48.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 4", + "00000001", + "10000001", + "Test Estate 2"}); + table48.AddRow(new string[] { + "Test Operator 1", + "Test Merchant 5", + "00000001", + "10000001", + "Test Estate 2"}); +#line 158 + testRunner.When("I assign the following operator to the merchants", ((string)(null)), table48, "When "); +#line hidden + TechTalk.SpecFlow.Table table49 = new TechTalk.SpecFlow.Table(new string[] { + "EmailAddress", + "Password", + "GivenName", + "FamilyName", + "MerchantName", + "EstateName"}); + table49.AddRow(new string[] { + "merchantuser1@testmerchant1.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 1", + "Test Estate 1"}); + table49.AddRow(new string[] { + "merchantuser1@testmerchant2.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 2", + "Test Estate 1"}); + table49.AddRow(new string[] { + "merchantuser1@testmerchant3.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 3", + "Test Estate 1"}); + table49.AddRow(new string[] { + "merchantuser1@testmerchant4.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 4", + "Test Estate 2"}); + table49.AddRow(new string[] { + "merchantuser1@testmerchant5.co.uk", + "123456", + "TestMerchant", + "User1", + "Test Merchant 5", + "Test Estate 2"}); +#line 166 + testRunner.When("I create the following security users", ((string)(null)), table49, "When "); +#line hidden + TechTalk.SpecFlow.Table table50 = new TechTalk.SpecFlow.Table(new string[] { + "DeviceIdentifier", + "MerchantName", + "EstateName"}); + table50.AddRow(new string[] { + "TestDevice1", + "Test Merchant 1", + "Test Estate 1"}); + table50.AddRow(new string[] { + "TestDevice2", + "Test Merchant 2", + "Test Estate 1"}); + table50.AddRow(new string[] { + "TestDevice3", + "Test Merchant 3", + "Test Estate 1"}); + table50.AddRow(new string[] { + "TestDevice4", + "Test Merchant 4", + "Test Estate 2"}); + table50.AddRow(new string[] { + "TestDevice5", + "Test Merchant 5", + "Test Estate 2"}); +#line 174 + testRunner.When("I add the following devices to the merchant", ((string)(null)), table50, "When "); +#line hidden +#line 182 + testRunner.Given("I am logged in as \"estateuser1@testestate1.co.uk\" with password \"123456\" for Esta" + + "te \"Test Estate 1\" with client \"estateClient\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 184 + testRunner.When("I get the merchants for \'Test Estate 1\' then 3 merchants will be returned", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 186 + testRunner.Given("I am logged in as \"estateuser1@testestate2.co.uk\" with password \"123456\" for Esta" + + "te \"Test Estate 2\" with client \"estateClient\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 188 + testRunner.When("I get the merchants for \'Test Estate 2\' then 2 merchants will be returned", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden + } + this.ScenarioCleanup(); + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.1.0.0")] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class FixtureData : System.IDisposable diff --git a/EstateManagement.IntegrationTests/Shared/SharedSteps.cs b/EstateManagement.IntegrationTests/Shared/SharedSteps.cs index b74a92aa..32a7e1e0 100644 --- a/EstateManagement.IntegrationTests/Shared/SharedSteps.cs +++ b/EstateManagement.IntegrationTests/Shared/SharedSteps.cs @@ -498,7 +498,22 @@ public async Task WhenIAddTheFollowingDevicesToTheMerchant(Table table) } } + [When(@"I get the merchants for '(.*)' then (.*) merchants will be returned")] + public async Task WhenIGetTheMerchantsForThenMerchantsWillBeReturned(String estateName, Int32 expectedMerchantCount) + { + EstateDetails estateDetails = this.TestingContext.GetEstateDetails(estateName); + String token = this.TestingContext.AccessToken; + if (String.IsNullOrEmpty(estateDetails.AccessToken) == false) + { + token = estateDetails.AccessToken; + } + List merchantList= await this.TestingContext.DockerHelper.EstateClient.GetMerchants(token, estateDetails.EstateId, CancellationToken.None).ConfigureAwait(false); + + merchantList.ShouldNotBeNull(); + merchantList.ShouldNotBeEmpty(); + merchantList.Count.ShouldBe(expectedMerchantCount); + } } } diff --git a/EstateManagement.MerchantAggregate.Tests/EstateManagement.MerchantAggregate.Tests.csproj b/EstateManagement.MerchantAggregate.Tests/EstateManagement.MerchantAggregate.Tests.csproj index 0c8b8ca4..e0558633 100644 --- a/EstateManagement.MerchantAggregate.Tests/EstateManagement.MerchantAggregate.Tests.csproj +++ b/EstateManagement.MerchantAggregate.Tests/EstateManagement.MerchantAggregate.Tests.csproj @@ -7,14 +7,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/EstateManagement.MerchantAggregate.Tests/MerchantAggregateTests.cs b/EstateManagement.MerchantAggregate.Tests/MerchantAggregateTests.cs index 8ebf80f1..920d3df0 100644 --- a/EstateManagement.MerchantAggregate.Tests/MerchantAggregateTests.cs +++ b/EstateManagement.MerchantAggregate.Tests/MerchantAggregateTests.cs @@ -6,6 +6,7 @@ namespace EstateManagement.MerchantAggregate.Tests { using System.Linq; using System.Threading.Tasks; + using EstateManagement.Models; using Models.Merchant; using Shouldly; using Testing; @@ -129,7 +130,7 @@ public void MerchantAggregate_AssignOperator_OperatorIsAssigned() Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Operators.ShouldHaveSingleItem(); - Operator operatorModel = merchantModel.Operators.Single(); + Models.Merchant.Operator operatorModel = merchantModel.Operators.Single(); operatorModel.OperatorId.ShouldBe(TestData.OperatorId); operatorModel.Name.ShouldBe(TestData.OperatorName); operatorModel.MerchantNumber.ShouldBe(TestData.OperatorMerchantNumber); diff --git a/EstateManagement.MerchantAggregate/MerchantAggregate.cs b/EstateManagement.MerchantAggregate/MerchantAggregate.cs index 88a3a3c0..dd586890 100644 --- a/EstateManagement.MerchantAggregate/MerchantAggregate.cs +++ b/EstateManagement.MerchantAggregate/MerchantAggregate.cs @@ -139,6 +139,7 @@ public Merchant GetMerchant() if (this.Addresses.Any()) { + merchantModel.Addresses = new List(); this.Addresses.ForEach(a => merchantModel.Addresses.Add(new Models.Merchant.Address { AddressId = a.AddressId, @@ -155,6 +156,7 @@ public Merchant GetMerchant() if (this.Contacts.Any()) { + merchantModel.Contacts = new List(); this.Contacts.ForEach(c => merchantModel.Contacts.Add(new Models.Merchant.Contact { ContactId = c.ContactId, @@ -166,6 +168,7 @@ public Merchant GetMerchant() if (this.Operators.Any()) { + merchantModel.Operators = new List(); this.Operators.ForEach(o => merchantModel.Operators.Add(new Models.Merchant.Operator { OperatorId = o.OperatorId, @@ -177,7 +180,8 @@ public Merchant GetMerchant() if (this.SecurityUsers.Any()) { - this.SecurityUsers.ForEach(s => merchantModel.SecurityUsers.Add(new Models.Merchant.SecurityUser + merchantModel.SecurityUsers = new List(); + this.SecurityUsers.ForEach(s => merchantModel.SecurityUsers.Add(new Models.SecurityUser { SecurityUserId = s.SecurityUserId, EmailAddress = s.EmailAddress @@ -186,6 +190,7 @@ public Merchant GetMerchant() if (this.Devices.Any()) { + merchantModel.Devices = new Dictionary(); foreach ((Guid key, String value) in this.Devices) { merchantModel.Devices.Add(key, value); diff --git a/EstateManagement.Models/Estate/Estate.cs b/EstateManagement.Models/Estate/Estate.cs index 27807753..4236f3b7 100644 --- a/EstateManagement.Models/Estate/Estate.cs +++ b/EstateManagement.Models/Estate/Estate.cs @@ -1,4 +1,4 @@ -namespace EstateManagement.Models +namespace EstateManagement.Models.Estate { using System; using System.Collections.Generic; diff --git a/EstateManagement.Models/Estate/Operator.cs b/EstateManagement.Models/Estate/Operator.cs index 14b685b3..52a76bee 100644 --- a/EstateManagement.Models/Estate/Operator.cs +++ b/EstateManagement.Models/Estate/Operator.cs @@ -1,4 +1,4 @@ -namespace EstateManagement.Models +namespace EstateManagement.Models.Estate { using System; using System.Diagnostics.CodeAnalysis; diff --git a/EstateManagement.Models/Factories/IModelFactory.cs b/EstateManagement.Models/Factories/IModelFactory.cs index dc4554a0..92e0b906 100644 --- a/EstateManagement.Models/Factories/IModelFactory.cs +++ b/EstateManagement.Models/Factories/IModelFactory.cs @@ -1,12 +1,19 @@ -using EstateModel = EstateManagement.Models.Estate; +using EstateModel = EstateManagement.Models.Estate.Estate; using EstateEntity = EstateReporting.Database.Entities.Estate; using EstateOperatorEntity = EstateReporting.Database.Entities.EstateOperator; using EstateSecurityUserEntity = EstateReporting.Database.Entities.EstateSecurityUser; +using MerchantModel = EstateManagement.Models.Merchant.Merchant; +using MerchantEntity = EstateReporting.Database.Entities.Merchant; +using MerchantAddressEntity = EstateReporting.Database.Entities.MerchantAddress; +using MerchantContactEntity = EstateReporting.Database.Entities.MerchantContact; +using MerchantOperatorEntity = EstateReporting.Database.Entities.MerchantOperator; +using MerchantDeviceEntity = EstateReporting.Database.Entities.MerchantDevice; +using MerchantSecurityUserEntity = EstateReporting.Database.Entities.MerchantSecurityUser; namespace EstateManagement.Models.Factories { using System.Collections.Generic; - using EstateReporting.Database.Entities; + /// /// @@ -21,5 +28,19 @@ public interface IModelFactory /// The estate security users. /// EstateModel ConvertFrom(EstateEntity estate, List estateOperators, List estateSecurityUsers); + + /// + /// Converts from. + /// + /// The merchant. + /// The merchant addresses. + /// The merchant contacts. + /// The merchant operators. + /// The merchant devices. + /// The merchant security users. + /// + MerchantModel ConvertFrom(MerchantEntity merchant, List merchantAddresses, List merchantContacts, + List merchantOperators, List merchantDevices, + List merchantSecurityUsers); } } \ No newline at end of file diff --git a/EstateManagement.Models/Factories/ModelFactory.cs b/EstateManagement.Models/Factories/ModelFactory.cs index 97677319..55d1edc1 100644 --- a/EstateManagement.Models/Factories/ModelFactory.cs +++ b/EstateManagement.Models/Factories/ModelFactory.cs @@ -1,11 +1,26 @@ namespace EstateManagement.Models.Factories { + using System; using System.Collections.Generic; + using Merchant; using Microsoft.EntityFrameworkCore.Internal; - using EstateModel = EstateManagement.Models.Estate; + using EstateModel = EstateManagement.Models.Estate.Estate; using EstateEntity = EstateReporting.Database.Entities.Estate; using EstateOperatorEntity = EstateReporting.Database.Entities.EstateOperator; using EstateSecurityUserEntity = EstateReporting.Database.Entities.EstateSecurityUser; + using EstateOperatorModel = Models.Estate.Operator; + using SecurityUserModel = Models.SecurityUser; + using MerchantModel = EstateManagement.Models.Merchant.Merchant; + using MerchantAddressModel = EstateManagement.Models.Merchant.Address; + using MerchantContactModel = EstateManagement.Models.Merchant.Contact; + using MerchantOperatorModel = EstateManagement.Models.Merchant.Operator; + + using MerchantEntity = EstateReporting.Database.Entities.Merchant; + using MerchantAddressEntity = EstateReporting.Database.Entities.MerchantAddress; + using MerchantContactEntity = EstateReporting.Database.Entities.MerchantContact; + using MerchantOperatorEntity = EstateReporting.Database.Entities.MerchantOperator; + using MerchantDeviceEntity = EstateReporting.Database.Entities.MerchantDevice; + using MerchantSecurityUserEntity = EstateReporting.Database.Entities.MerchantSecurityUser; /// /// @@ -28,9 +43,9 @@ public EstateModel ConvertFrom(EstateEntity estate, List e if (estateOperators != null && estateOperators.Any()) { - estateModel.Operators = new List(); - estateOperators.ForEach(eo => estateModel.Operators.Add(new Operator - { + estateModel.Operators = new List(); + estateOperators.ForEach(eo => estateModel.Operators.Add(new EstateOperatorModel + { Name = eo.Name, RequireCustomMerchantNumber = eo.RequireCustomMerchantNumber, RequireCustomTerminalNumber = eo.RequireCustomTerminalNumber, @@ -40,8 +55,8 @@ public EstateModel ConvertFrom(EstateEntity estate, List e if (estateSecurityUsers != null && estateSecurityUsers.Any()) { - estateModel.SecurityUsers = new List(); - estateSecurityUsers.ForEach(esu => estateModel.SecurityUsers.Add(new SecurityUser + estateModel.SecurityUsers = new List(); + estateSecurityUsers.ForEach(esu => estateModel.SecurityUsers.Add(new SecurityUserModel { SecurityUserId = esu.SecurityUserId, EmailAddress = esu.EmailAddress @@ -50,5 +65,74 @@ public EstateModel ConvertFrom(EstateEntity estate, List e return estateModel; } + + public MerchantModel ConvertFrom(MerchantEntity merchant, List merchantAddresses, List merchantContacts, + List merchantOperators, List merchantDevices, + List merchantSecurityUsers) + { + MerchantModel merchantModel = new MerchantModel(); + merchantModel.EstateId = merchant.EstateId; + merchantModel.MerchantId = merchant.MerchantId; + merchantModel.MerchantName = merchant.Name; + + if (merchantAddresses != null && merchantAddresses.Any()) + { + merchantModel.Addresses= new List(); + merchantAddresses.ForEach(ma => merchantModel.Addresses.Add(new MerchantAddressModel + { + AddressId = ma.AddressId, + AddressLine1 = ma.AddressLine1, + AddressLine2 = ma.AddressLine2, + AddressLine3 = ma.AddressLine3, + AddressLine4 = ma.AddressLine4, + Country = ma.Country, + PostalCode = ma.PostalCode, + Region = ma.Region, + Town = ma.Town + })); + } + + if (merchantContacts != null && merchantContacts.Any()) + { + merchantModel.Contacts = new List(); + merchantContacts.ForEach(mc => merchantModel.Contacts.Add(new MerchantContactModel + { + ContactEmailAddress = mc.EmailAddress, + ContactId = mc.ContactId, + ContactName = mc.Name, + ContactPhoneNumber = mc.PhoneNumber + })); + } + + if (merchantOperators != null && merchantOperators.Any()) + { + merchantModel.Operators = new List(); + merchantOperators.ForEach(mo => merchantModel.Operators.Add(new MerchantOperatorModel + { + Name = mo.Name, + MerchantNumber = mo.MerchantNumber, + OperatorId = mo.OperatorId, + TerminalNumber = mo.TerminalNumber + })); + } + + if (merchantDevices != null && merchantDevices.Any()) + { + merchantModel.Devices = new Dictionary(); + merchantDevices.ForEach(md => merchantModel.Devices.Add(md.DeviceId, md.DeviceIdentifier)); + } + + if (merchantSecurityUsers != null && merchantSecurityUsers.Any()) + { + merchantModel.SecurityUsers = new List(); + merchantSecurityUsers.ForEach(msu => merchantModel.SecurityUsers.Add(new SecurityUserModel + { + EmailAddress = msu.EmailAddress, + SecurityUserId = msu.SecurityUserId + })); + } + + return merchantModel; + } } } \ No newline at end of file diff --git a/EstateManagement.Models/Merchant/Merchant.cs b/EstateManagement.Models/Merchant/Merchant.cs index 4703a7ed..ecfe88e7 100644 --- a/EstateManagement.Models/Merchant/Merchant.cs +++ b/EstateManagement.Models/Merchant/Merchant.cs @@ -11,15 +11,15 @@ public class Merchant public Merchant() { - this.Addresses = new List
(); + //this.Addresses = new List
(); - this.Contacts = new List(); + //this.Contacts = new List(); - this.Operators = new List(); + //this.Operators = new List(); - this.SecurityUsers = new List(); + //this.SecurityUsers = new List(); - this.Devices = new Dictionary(); + //this.Devices = new Dictionary(); } #endregion diff --git a/EstateManagement.Models/Merchant/SecurityUser.cs b/EstateManagement.Models/Merchant/SecurityUser.cs deleted file mode 100644 index 3b176d23..00000000 --- a/EstateManagement.Models/Merchant/SecurityUser.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace EstateManagement.Models.Merchant -{ - using System; - using System.Diagnostics.CodeAnalysis; - - /// - /// - /// - [ExcludeFromCodeCoverage] - public class SecurityUser - { - #region Properties - - /// - /// Gets or sets the email address. - /// - /// - /// The email address. - /// - public String EmailAddress { get; set; } - - /// - /// Gets or sets the security user identifier. - /// - /// - /// The security user identifier. - /// - public Guid SecurityUserId { get; set; } - - #endregion - } -} \ No newline at end of file diff --git a/EstateManagement.Models/Estate/SecurityUser.cs b/EstateManagement.Models/SecurityUser.cs similarity index 100% rename from EstateManagement.Models/Estate/SecurityUser.cs rename to EstateManagement.Models/SecurityUser.cs diff --git a/EstateManagement.Repository.Tests/EstateManagement.Repository.Tests.csproj b/EstateManagement.Repository.Tests/EstateManagement.Repository.Tests.csproj index 528705b7..6bbb3e5e 100644 --- a/EstateManagement.Repository.Tests/EstateManagement.Repository.Tests.csproj +++ b/EstateManagement.Repository.Tests/EstateManagement.Repository.Tests.csproj @@ -8,14 +8,14 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/EstateManagement.Repository.Tests/EstateManagementRepositoryTests.cs b/EstateManagement.Repository.Tests/EstateManagementRepositoryTests.cs index 07dda667..e5464bc2 100644 --- a/EstateManagement.Repository.Tests/EstateManagementRepositoryTests.cs +++ b/EstateManagement.Repository.Tests/EstateManagementRepositoryTests.cs @@ -17,6 +17,7 @@ namespace EstateManagement.Repository.Tests using Shouldly; using Testing; using Xunit; + using Merchant = Models.Merchant.Merchant; public class EstateManagementRepositoryTests { @@ -41,28 +42,19 @@ public void EstateManagementRepository_CanBeCreated_IsCreated() public async Task EstateManagementRepository_GetEstate_EstateRetrieved(TestDatabaseType testDatabaseType) { EstateReportingContext context = await EstateManagementRepositoryTests.GetContext(Guid.NewGuid().ToString("N"), testDatabaseType); - context.Estates.Add(new Estate - { - EstateId = TestData.EstateId - }); - context.EstateOperators.Add(new EstateOperator - { - EstateId = TestData.EstateId - }); - context.EstateSecurityUsers.Add(new EstateSecurityUser - { - EstateId = TestData.EstateId - }); + context.Estates.Add(TestData.EstateEntity); + context.EstateOperators.Add(TestData.EstateOperatorEntity); + context.EstateSecurityUsers.Add(TestData.EstateSecurityUserEntity); await context.SaveChangesAsync(); Mock> dbContextFactory = new Mock>(); Mock modelFactory = new Mock(); dbContextFactory.Setup(d => d.GetContext(It.IsAny(), It.IsAny())).ReturnsAsync(context); - modelFactory.Setup(m => m.ConvertFrom(It.IsAny(), It.IsAny>(), It.IsAny>())).Returns(new Models.Estate()); + modelFactory.Setup(m => m.ConvertFrom(It.IsAny(), It.IsAny>(), It.IsAny>())).Returns(new Models.Estate.Estate()); EstateManagementRepository estateManagementRepository = new EstateManagementRepository(dbContextFactory.Object, modelFactory.Object); - Models.Estate estateModel = await estateManagementRepository.GetEstate(TestData.EstateId, CancellationToken.None); + Models.Estate.Estate estateModel = await estateManagementRepository.GetEstate(TestData.EstateId, CancellationToken.None); estateModel.ShouldNotBeNull(); } @@ -78,7 +70,7 @@ public async Task EstateManagementRepository_GetEstate_EstateNotFound_ErrorThrow Mock modelFactory = new Mock(); dbContextFactory.Setup(d => d.GetContext(It.IsAny(), It.IsAny())).ReturnsAsync(context); - modelFactory.Setup(m => m.ConvertFrom(It.IsAny(), It.IsAny>(), It.IsAny>())).Returns(new Models.Estate()); + modelFactory.Setup(m => m.ConvertFrom(It.IsAny(), It.IsAny>(), It.IsAny>())).Returns(new Models.Estate.Estate()); EstateManagementRepository estateManagementRepository = new EstateManagementRepository(dbContextFactory.Object, modelFactory.Object); Should.Throw(async () => @@ -87,6 +79,65 @@ public async Task EstateManagementRepository_GetEstate_EstateNotFound_ErrorThrow }); } + + [Theory] + [InlineData(TestDatabaseType.InMemory)] + [InlineData(TestDatabaseType.SqliteInMemory)] + public async Task EstateManagementRepository_GetMerchants_MerchantRetrieved(TestDatabaseType testDatabaseType) + { + EstateReportingContext context = await EstateManagementRepositoryTests.GetContext(Guid.NewGuid().ToString("N"), testDatabaseType); + context.Merchants.Add(TestData.MerchantEntity); + context.MerchantContacts.Add(TestData.MerchantContactEntity); + context.MerchantAddresses.Add(TestData.MerchantAddressEntity); + context.MerchantDevices.Add(TestData.MerchantDeviceEntity); + context.MerchantOperators.Add(TestData.MerchantOperatorEntity); + + await context.SaveChangesAsync(); + + Mock> dbContextFactory = new Mock>(); + Mock modelFactory = new Mock(); + + dbContextFactory.Setup(d => d.GetContext(It.IsAny(), It.IsAny())).ReturnsAsync(context); + modelFactory.Setup(m => m.ConvertFrom(It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>())); + EstateManagementRepository estateManagementRepository = new EstateManagementRepository(dbContextFactory.Object, modelFactory.Object); + + List merchantListModel = await estateManagementRepository.GetMerchants(TestData.EstateId, CancellationToken.None); + + merchantListModel.ShouldNotBeNull(); + merchantListModel.ShouldNotBeEmpty(); + merchantListModel.ShouldHaveSingleItem(); + } + + [Theory] + [InlineData(TestDatabaseType.InMemory)] + [InlineData(TestDatabaseType.SqliteInMemory)] + public async Task EstateManagementRepository_GetMerchants_NoMerchantsFound_NullMerchantsReturned(TestDatabaseType testDatabaseType) + { + EstateReportingContext context = await EstateManagementRepositoryTests.GetContext(Guid.NewGuid().ToString("N"), testDatabaseType); + //await context.SaveChangesAsync(); + + Mock> dbContextFactory = new Mock>(); + Mock modelFactory = new Mock(); + + dbContextFactory.Setup(d => d.GetContext(It.IsAny(), It.IsAny())).ReturnsAsync(context); + modelFactory.Setup(m => m.ConvertFrom(It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>())); + EstateManagementRepository estateManagementRepository = new EstateManagementRepository(dbContextFactory.Object, modelFactory.Object); + + List merchantListModel = await estateManagementRepository.GetMerchants(TestData.EstateId, CancellationToken.None); + + merchantListModel.ShouldBeNull(); + } + private static async Task GetContext(String databaseName, TestDatabaseType databaseType = TestDatabaseType.InMemory) { EstateReportingContext context = null; diff --git a/EstateManagement.Repository/EstateManagementRepository.cs b/EstateManagement.Repository/EstateManagementRepository.cs index 8abbcc57..97f8a087 100644 --- a/EstateManagement.Repository/EstateManagementRepository.cs +++ b/EstateManagement.Repository/EstateManagementRepository.cs @@ -8,10 +8,12 @@ using EstateReporting.Database; using EstateReporting.Database.Entities; using Microsoft.EntityFrameworkCore; + using Microsoft.EntityFrameworkCore.Query.SqlExpressions; using Models.Factories; using Shared.EntityFramework; using Shared.Exceptions; - using EstateModel = Models.Estate; + using EstateModel = Models.Estate.Estate; + using MerchantModel = Models.Merchant.Merchant; /// /// @@ -29,6 +31,15 @@ public interface IEstateManagementRepository Task GetEstate(Guid estateId, CancellationToken cancellationToken); + /// + /// Gets the merchants. + /// + /// The estate identifier. + /// The cancellation token. + /// + Task> GetMerchants(Guid estateId, + CancellationToken cancellationToken); + #endregion } @@ -95,6 +106,46 @@ public async Task GetEstate(Guid estateId, return this.ModelFactory.ConvertFrom(estate, estateOperators, estateSecurityUsers); } + /// + /// Gets the merchants. + /// + /// The estate identifier. + /// The cancellation token. + /// + public async Task> GetMerchants(Guid estateId, + CancellationToken cancellationToken) + { + EstateReportingContext context = await this.ContextFactory.GetContext(estateId, cancellationToken); + + List merchants = await (from m in context.Merchants where m.EstateId == estateId select m).ToListAsync(cancellationToken); + + List merchantAddresses = await (from a in context.MerchantAddresses where a.EstateId == estateId select a).ToListAsync(cancellationToken); + List merchantContacts = await (from c in context.MerchantContacts where c.EstateId == estateId select c).ToListAsync(cancellationToken); + List merchantDevices = await (from d in context.MerchantDevices where d.EstateId == estateId select d).ToListAsync(cancellationToken); + List merchantSecurityUsers = await (from u in context.MerchantSecurityUsers where u.EstateId == estateId select u).ToListAsync(cancellationToken); + List merchantOperators = await (from o in context.MerchantOperators where o.EstateId == estateId select o).ToListAsync(cancellationToken); + + if (merchants.Any() == false) + { + return null; + } + + List models = new List(); + + foreach (Merchant merchant in merchants) + { + List addresses = merchantAddresses.Where(a => a.MerchantId == merchant.MerchantId).ToList(); + List contacts = merchantContacts.Where(c => c.MerchantId == merchant.MerchantId).ToList(); + List devices = merchantDevices.Where(d => d.MerchantId == merchant.MerchantId).ToList(); + List securityUsers = merchantSecurityUsers.Where(s => s.MerchantId == merchant.MerchantId).ToList(); + List operators = merchantOperators.Where(o => o.MerchantId == merchant.MerchantId).ToList(); + + models.Add(this.ModelFactory.ConvertFrom(merchant, addresses, contacts, operators, devices, securityUsers)); + } + + return models; + } + #endregion } } \ No newline at end of file diff --git a/EstateManagement.Testing/TestData.cs b/EstateManagement.Testing/TestData.cs index ca1c8a48..1dd5f604 100644 --- a/EstateManagement.Testing/TestData.cs +++ b/EstateManagement.Testing/TestData.cs @@ -13,7 +13,7 @@ using CreateMerchantRequest = BusinessLogic.Requests.CreateMerchantRequest; using Estate = Models.Estate; using Merchant = Models.Merchant.Merchant; - using Operator = Models.Operator; + using Operator = Models.Estate.Operator; using SecurityUser = Models.SecurityUser; public class TestData @@ -75,7 +75,7 @@ public class TestData public static EstateAggregate EmptyEstateAggregate = EstateAggregate.Create(TestData.EstateId); - public static Estate EstateModel = new Estate + public static Estate.Estate EstateModel = new Estate.Estate { EstateId = TestData.EstateId, Name = TestData.EstateName, @@ -83,13 +83,13 @@ public class TestData SecurityUsers = null }; - public static Estate EstateModelWithOperators = new Estate + public static Estate.Estate EstateModelWithOperators = new Estate.Estate { EstateId = TestData.EstateId, Name = TestData.EstateName, - Operators = new List + Operators = new List { - new Operator + new Estate.Operator { RequireCustomMerchantNumber = TestData.RequireCustomMerchantNumberTrue, Name = TestData.OperatorName, @@ -100,44 +100,44 @@ public class TestData SecurityUsers = null }; - public static Estate EstateModelWithSecurityUsers = new Estate - { - EstateId = TestData.EstateId, - Name = TestData.EstateName, - Operators = null, - SecurityUsers = new List - { - new SecurityUser - { - EmailAddress = TestData.EstateUserEmailAddress, - SecurityUserId = TestData.SecurityUserId - } - } - }; - - public static Estate EstateModelWithOperatorsAndSecurityUsers = new Estate - { - EstateId = TestData.EstateId, - Name = TestData.EstateName, - Operators = new List - { - new Operator - { - RequireCustomMerchantNumber = TestData.RequireCustomMerchantNumberTrue, - Name = TestData.OperatorName, - OperatorId = TestData.OperatorId, - RequireCustomTerminalNumber = TestData.RequireCustomTerminalNumberTrue - } - }, - SecurityUsers = new List - { - new SecurityUser - { - EmailAddress = TestData.EstateUserEmailAddress, - SecurityUserId = TestData.SecurityUserId - } - } - }; + public static Estate.Estate EstateModelWithSecurityUsers = new Estate.Estate + { + EstateId = TestData.EstateId, + Name = TestData.EstateName, + Operators = null, + SecurityUsers = new List + { + new SecurityUser + { + EmailAddress = TestData.EstateUserEmailAddress, + SecurityUserId = TestData.SecurityUserId + } + } + }; + + public static Estate.Estate EstateModelWithOperatorsAndSecurityUsers = new Estate.Estate + { + EstateId = TestData.EstateId, + Name = TestData.EstateName, + Operators = new List + { + new Estate.Operator + { + RequireCustomMerchantNumber = TestData.RequireCustomMerchantNumberTrue, + Name = TestData.OperatorName, + OperatorId = TestData.OperatorId, + RequireCustomTerminalNumber = TestData.RequireCustomTerminalNumberTrue + } + }, + SecurityUsers = new List + { + new SecurityUser + { + EmailAddress = TestData.EstateUserEmailAddress, + SecurityUserId = TestData.SecurityUserId + } + } + }; public static DateTime DateMerchantCreated = new DateTime(2019,11,16); @@ -497,5 +497,69 @@ public static MerchantAggregate MerchantAggregateWithOperator() EmailAddress = TestData.EstateUserEmailAddress, SecurityUserId = TestData.SecurityUserId }; + + public static EstateReporting.Database.Entities.Merchant MerchantEntity = new EstateReporting.Database.Entities.Merchant + { + MerchantId = TestData.MerchantId, + EstateId = TestData.EstateId, + CreatedDateTime= TestData.DateMerchantCreated, + Name = TestData.MerchantName + + }; + + public static EstateReporting.Database.Entities.MerchantContact MerchantContactEntity = new MerchantContact + { + ContactId = TestData.MerchantContactId, + EstateId = TestData.EstateId, + Name = TestData.MerchantContactName, + MerchantId = TestData.MerchantId, + EmailAddress = TestData.MerchantContactEmailAddress, + PhoneNumber = TestData.MerchantContactPhoneNumber, + CreatedDateTime = TestData.DateMerchantCreated + }; + + public static EstateReporting.Database.Entities.MerchantAddress MerchantAddressEntity = new MerchantAddress + { + AddressLine1 = TestData.MerchantAddressLine1, + MerchantId = TestData.MerchantId, + EstateId = TestData.EstateId, + CreatedDateTime = TestData.DateMerchantCreated, + AddressLine2 = TestData.MerchantAddressLine2, + AddressLine3 = TestData.MerchantAddressLine3, + AddressLine4 = TestData.MerchantAddressLine4, + Country = TestData.MerchantCountry, + PostalCode = TestData.MerchantPostalCode, + Region = TestData.MerchantRegion, + Town = TestData.MerchantTown, + AddressId = TestData.MerchantAddressId + }; + + public static EstateReporting.Database.Entities.MerchantOperator MerchantOperatorEntity = new MerchantOperator + { + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + Name = TestData.OperatorName, + OperatorId = TestData.OperatorId, + TerminalNumber = TestData.OperatorTerminalNumber, + MerchantNumber = TestData.OperatorMerchantNumber + }; + + public static EstateReporting.Database.Entities.MerchantDevice MerchantDeviceEntity = new MerchantDevice + { + MerchantId = TestData.MerchantId, + EstateId = TestData.EstateId, + DeviceId = TestData.DeviceId, + DeviceIdentifier = TestData.DeviceIdentifier, + CreatedDateTime = TestData.DateMerchantCreated + }; + + public static EstateReporting.Database.Entities.MerchantSecurityUser MerchantSecurityUserEntity = new MerchantSecurityUser + { + MerchantId = TestData.MerchantId, + EstateId = TestData.EstateId, + SecurityUserId = TestData.SecurityUserId, + EmailAddress = TestData.MerchantUserEmailAddress, + CreatedDateTime = TestData.DateMerchantCreated + }; } } \ No newline at end of file diff --git a/EstateManagement.Tests/EstateManagement.Tests.csproj b/EstateManagement.Tests/EstateManagement.Tests.csproj index 59955968..f2dec9eb 100644 --- a/EstateManagement.Tests/EstateManagement.Tests.csproj +++ b/EstateManagement.Tests/EstateManagement.Tests.csproj @@ -7,16 +7,16 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/EstateManagement.Tests/Factories/ModelFactoryTests.cs b/EstateManagement.Tests/Factories/ModelFactoryTests.cs index 0cbf5b4a..93032e14 100644 --- a/EstateManagement.Tests/Factories/ModelFactoryTests.cs +++ b/EstateManagement.Tests/Factories/ModelFactoryTests.cs @@ -9,6 +9,7 @@ namespace EstateManagement.Tests.Factories using EstateAggregate; using EstateManagement.Factories; using Models; + using Models.Estate; using Models.Merchant; using Shouldly; using Testing; @@ -17,7 +18,7 @@ namespace EstateManagement.Tests.Factories public class ModelFactoryTests { [Fact] - public void ModelFactory_EstateAggregate_WithNoOperatorsOrSecurityUsers_IsConverted() + public void ModelFactory_Estate_WithNoOperatorsOrSecurityUsers_IsConverted() { Estate estateModel = TestData.EstateModel; @@ -31,7 +32,7 @@ public void ModelFactory_EstateAggregate_WithNoOperatorsOrSecurityUsers_IsConver } [Fact] - public void ModelFactory_EstateAggregate_WithOperators_IsConverted() + public void ModelFactory_Estate_WithOperators_IsConverted() { Estate estateModel = TestData.EstateModelWithOperators; @@ -48,7 +49,7 @@ public void ModelFactory_EstateAggregate_WithOperators_IsConverted() } [Fact] - public void ModelFactory_EstateAggregate_WithSecurityUsers_IsConverted() + public void ModelFactory_Estate_WithSecurityUsers_IsConverted() { Estate estateModel = TestData.EstateModelWithSecurityUsers; @@ -65,7 +66,7 @@ public void ModelFactory_EstateAggregate_WithSecurityUsers_IsConverted() } [Fact] - public void ModelFactory_EstateAggregate_WithOperatorsAndSecurityUsers_IsConverted() + public void ModelFactory_Estate_WithOperatorsAndSecurityUsers_IsConverted() { Estate estateModel = TestData.EstateModelWithOperatorsAndSecurityUsers; @@ -83,7 +84,7 @@ public void ModelFactory_EstateAggregate_WithOperatorsAndSecurityUsers_IsConvert } [Fact] - public void ModelFactory_EstateAggregate_NullInput_IsConverted() + public void ModelFactory_Estate_NullInput_IsConverted() { Estate estateModel = null; @@ -300,5 +301,22 @@ public void ModelFactory_Merchant_NullOperators_IsConverted() merchantResponse.Operators.ShouldBeNull(); } + + [Fact] + public void ModelFactory_MerchantList_IsConverted() + { + List merchantModelList = new List + { + TestData.MerchantModelWithAddressesContactsDevicesAndOperators + }; + + ModelFactory modelFactory = new ModelFactory(); + + var merchantResponseList = modelFactory.ConvertFrom(merchantModelList); + + merchantResponseList.ShouldNotBeNull(); + merchantResponseList.ShouldNotBeEmpty(); + merchantResponseList.Count.ShouldBe(merchantModelList.Count); + } } } diff --git a/EstateManagement/Controllers/EstateController.cs b/EstateManagement/Controllers/EstateController.cs index 453e1c63..6b16156d 100644 --- a/EstateManagement/Controllers/EstateController.cs +++ b/EstateManagement/Controllers/EstateController.cs @@ -18,6 +18,7 @@ using Shared.Exceptions; using EstateManagement.BusinessLogic.Requests; using Microsoft.AspNetCore.Authorization; + using Models.Estate; using CreateEstateRequest = BusinessLogic.Requests.CreateEstateRequest; using CreateEstateRequestDTO = DataTransferObjects.Requests.CreateEstateRequest; using CreateEstateUserRequest = BusinessLogic.Requests.CreateEstateUserRequest; diff --git a/EstateManagement/Controllers/MerchantController.cs b/EstateManagement/Controllers/MerchantController.cs index 07a464c9..d8d4a9d7 100644 --- a/EstateManagement/Controllers/MerchantController.cs +++ b/EstateManagement/Controllers/MerchantController.cs @@ -1,7 +1,9 @@ namespace EstateManagement.Controllers { using System; + using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; + using System.Linq; using System.Threading; using System.Threading.Tasks; using BusinessLogic.Manger; @@ -135,6 +137,40 @@ public async Task CreateMerchant([FromRoute] Guid estateId, }); } + /// + /// Gets the merchant. + /// + /// The estate identifier. + /// The cancellation token. + /// + /// Merchant not found with estate Id {estateId} and merchant Id {merchantId} + [HttpGet] + [Route("")] + public async Task GetMerchants([FromRoute] Guid estateId, CancellationToken cancellationToken) + { + // Get the Estate Id claim from the user + Claim estateIdClaim = ClaimsHelper.GetUserClaim(this.User, "EstateId", estateId.ToString()); + + if (ClaimsHelper.IsUserRolesValid(this.User, new[] { "Estate" }) == false) + { + return this.Forbid(); + } + + if (ClaimsHelper.ValidateRouteParameter(estateId, estateIdClaim) == false) + { + return this.Forbid(); + } + + List merchants = await this.EstateManagementManager.GetMerchants(estateId, cancellationToken); + + if (merchants == null || merchants.Any() == false) + { + throw new NotFoundException($"No Merchants found for estate Id {estateId}"); + } + + return this.Ok(this.ModelFactory.ConvertFrom(merchants)); + } + /// /// Gets the merchant. /// diff --git a/EstateManagement/EstateManagement.csproj b/EstateManagement/EstateManagement.csproj index 8effe904..db26d860 100644 --- a/EstateManagement/EstateManagement.csproj +++ b/EstateManagement/EstateManagement.csproj @@ -7,24 +7,24 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + + + + + + + + + + diff --git a/EstateManagement/Factories/IModelFactory.cs b/EstateManagement/Factories/IModelFactory.cs index 396b6d5c..4994ebc9 100644 --- a/EstateManagement/Factories/IModelFactory.cs +++ b/EstateManagement/Factories/IModelFactory.cs @@ -1,7 +1,8 @@ namespace EstateManagement.Factories { + using System.Collections.Generic; using DataTransferObjects.Responses; - using Models; + using Models.Estate; using Models.Merchant; /// @@ -25,6 +26,13 @@ public interface IModelFactory /// MerchantResponse ConvertFrom(Merchant merchant); + /// + /// Converts from. + /// + /// The merchants. + /// + List ConvertFrom(List merchants); + #endregion } } \ No newline at end of file diff --git a/EstateManagement/Factories/ModelFactory.cs b/EstateManagement/Factories/ModelFactory.cs index 8b4de5af..d1ef6295 100644 --- a/EstateManagement/Factories/ModelFactory.cs +++ b/EstateManagement/Factories/ModelFactory.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using DataTransferObjects.Responses; - using Models; + using Models.Estate; using Models.Merchant; /// @@ -13,6 +13,8 @@ /// public class ModelFactory : IModelFactory { + #region Methods + /// /// Converts from. /// @@ -47,15 +49,20 @@ public EstateResponse ConvertFrom(Estate estate) if (estate.SecurityUsers != null && estate.SecurityUsers.Any()) { estate.SecurityUsers.ForEach(s => estateResponse.SecurityUsers.Add(new SecurityUserResponse - { - EmailAddress = s.EmailAddress, - SecurityUserId = s.SecurityUserId - })); + { + EmailAddress = s.EmailAddress, + SecurityUserId = s.SecurityUserId + })); } return estateResponse; } + /// + /// Converts from. + /// + /// The merchant. + /// public MerchantResponse ConvertFrom(Merchant merchant) { if (merchant == null) @@ -92,13 +99,13 @@ public MerchantResponse ConvertFrom(Merchant merchant) { merchantResponse.Contacts = new List(); - merchant.Contacts.ForEach(c => merchantResponse.Contacts.Add(new ContactResponse() - { - ContactId = c.ContactId, - ContactPhoneNumber = c.ContactPhoneNumber, - ContactEmailAddress = c.ContactEmailAddress, - ContactName = c.ContactName - })); + merchant.Contacts.ForEach(c => merchantResponse.Contacts.Add(new ContactResponse + { + ContactId = c.ContactId, + ContactPhoneNumber = c.ContactPhoneNumber, + ContactEmailAddress = c.ContactEmailAddress, + ContactName = c.ContactName + })); } if (merchant.Devices != null && merchant.Devices.Any()) @@ -126,5 +133,21 @@ public MerchantResponse ConvertFrom(Merchant merchant) return merchantResponse; } + + /// + /// Converts from. + /// + /// The merchants. + /// + public List ConvertFrom(List merchants) + { + List result = new List(); + + merchants.ForEach(m => result.Add(this.ConvertFrom(m))); + + return result; + } + + #endregion } } \ No newline at end of file diff --git a/EstateManagement/appsettings.development.json b/EstateManagement/appsettings.development.json index 5e609155..14c0ec12 100644 --- a/EstateManagement/appsettings.development.json +++ b/EstateManagement/appsettings.development.json @@ -15,7 +15,7 @@ }, "ConnectionStrings": { //"ConnectionStringConfiguration": "server=localhost;database=ConnectionStringConfiguration;user id=sa;password=sp1ttal", - "EstateReportingReadModel": "server=localhost;user id=sa;password=sp1ttal;database=EstateReportingReadModel" + //"EstateReportingReadModel": "server=localhost;user id=sa;password=sp1ttal;database=EstateReportingReadModel" }, "AppSettings": { "HandlerEventTypesToSilentlyHandle": { diff --git a/EstateManagement/appsettings.json b/EstateManagement/appsettings.json index e234798f..7e0e9d1e 100644 --- a/EstateManagement/appsettings.json +++ b/EstateManagement/appsettings.json @@ -15,7 +15,7 @@ }, "ConnectionStrings": { "ConnectionStringConfiguration": "server=192.168.1.133;database=ConnectionStringConfiguration;user id=sa;password=Sc0tland", - "EstateReportingReadModel": "server=localhost;user id=sa;password=sp1ttal;database=EstateReportingReadModel" + "EstateReportingReadModel": "server=192.168.1.133;user id=sa;password=Sc0tland;database=EstateReportingReadModel" }, "AppSettings": { "HandlerEventTypesToSilentlyHandle": {