diff --git a/Directory.Packages.props b/Directory.Packages.props index 9b41764b..1c2b84fa 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -8,22 +8,22 @@ - - + + - - - + + + - - + + @@ -38,23 +38,23 @@ - - - - + + + + - + - - - - + + + + @@ -62,15 +62,15 @@ - - - - - - - - - + + + + + + + + + @@ -88,7 +88,7 @@ - + diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs index 3ab71d32..b5aa4563 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs @@ -1,8 +1,11 @@ +using Microsoft.Extensions.Configuration; using Imposter.Abstractions; using SecurityService.Client; using SecurityService.DataTransferObjects; using Shared.DomainDrivenDesign.EventSourcing; using Shared.EventStore.Aggregate; +using Shared.General; +using Shared.Logger; using Shared.Serialisation; using Shouldly; using SimpleResults; @@ -26,8 +29,15 @@ public class EstateDomainServiceTests { private ISecurityServiceClientImposter SecurityServiceClient; public EstateDomainServiceTests() { StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions())); + IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build(); + ConfigurationReader.Initialise(configurationRoot); + Logger.Initialise(NullLogger.Instance); + this.AggregateService= new IAggregateServiceImposter(); this.SecurityServiceClient = new ISecurityServiceClientImposter(); + this.SecurityServiceClient + .GetToken(Arg.Any(), Arg.Any(), Arg.Any()) + .ReturnsAsync(Result.Success(TestData.GetTokenResponse())); IAggregateService AggregateServiceResolver() => this.AggregateService.Instance(); this.DomainService = new EstateDomainService(AggregateServiceResolver, this.SecurityServiceClient.Instance()); } @@ -77,10 +87,10 @@ public async Task EstateDomainService_CreateEstateUser_EstateUserIsCreated() { .ReturnsAsync(SimpleResults.Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(),Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(),Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -105,11 +115,11 @@ public async Task EstateDomainService_CreateEstateUser_EstateRoleOverrideIsUsedI .ReturnsAsync(SimpleResults.Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()) - .Callback((request, _) => { capturedRequest = request; return Task.CompletedTask; }); + .Callback((token, request, _) => { capturedRequest = request; return Task.CompletedTask; }); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -137,10 +147,10 @@ public async Task EstateDomainService_CreateEstateUser_UserCreateFailed_ResultIs .ReturnsAsync(SimpleResults.Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -160,10 +170,10 @@ public async Task EstateDomainService_CreateEstateUser_GetUsersFailed_ResultIsFa .ReturnsAsync(SimpleResults.Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); Result result = await this.DomainService.CreateEstateUser(TestData.Commands.CreateEstateUserCommand, TestContext.Current.CancellationToken); @@ -179,10 +189,10 @@ public async Task EstateDomainService_CreateEstateUser_NullUserReturned_ResultIs .ReturnsAsync(SimpleResults.Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { null })); @@ -198,10 +208,10 @@ public async Task EstateDomainService_CreateEstateUser_GetEstateFailed_ResultIsF .ReturnsAsync(Result.Failure()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -221,10 +231,10 @@ public async Task EstateDomainService_CreateEstateUser_EstateNotCreated_ResultIs .ReturnsAsync(SimpleResults.Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -244,10 +254,10 @@ public async Task EstateDomainService_CreateEstateUser_SaveFailed_ResultIsFailed .ReturnsAsync(Result.Failure()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -410,7 +420,7 @@ public async Task EstateDomainService_AddOperatorToEstate_ExceptionThrown_Result public async Task EstateDomainService_CreateEstateUser_ExceptionThrown_ResultIsFailed() { this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ThrowsAsync(new Exception()); Result result = await this.DomainService.CreateEstateUser(TestData.Commands.CreateEstateUserCommand, TestContext.Current.CancellationToken); diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs index 8ba557a2..542e6a98 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs @@ -49,6 +49,9 @@ public MerchantDomainServiceTests() { this.AggregateService = new(); this.SecurityServiceClient = new(); + this.SecurityServiceClient + .GetToken(Arg.Any(), Arg.Any(), Arg.Any()) + .ReturnsAsync(Result.Success(TestData.GetTokenResponse())); this.EventStoreContext = new(); Func aggregateServiceResolver = () => this.AggregateService.Instance(); this.DomainService = new MerchantDomainService(aggregateServiceResolver, @@ -266,10 +269,10 @@ public async Task MerchantDomainService_CreateMerchantUser_MerchantUserIsCreated .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List() { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" @@ -292,7 +295,7 @@ public async Task MerchantDomainService_CreateMerchantUser_EstateNotCreated_Erro .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); var result = await this.DomainService.CreateMerchantUser(TestData.Commands.CreateMerchantUserCommand, TestContext.Current.CancellationToken); @@ -311,7 +314,7 @@ public async Task MerchantDomainService_CreateMerchantUser_MerchantNotCreated_Er .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); var result = await this.DomainService.CreateMerchantUser(TestData.Commands.CreateMerchantUserCommand, TestContext.Current.CancellationToken); @@ -330,7 +333,7 @@ public async Task MerchantDomainService_CreateMerchantUser_ErrorCreatingUser_Err .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); var result = await this.DomainService.CreateMerchantUser(TestData.Commands.CreateMerchantUserCommand, TestContext.Current.CancellationToken); @@ -350,10 +353,10 @@ public async Task MerchantDomainService_CreateMerchantUser_ErrorGettingUsers_Err .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); var result = await this.DomainService.CreateMerchantUser(TestData.Commands.CreateMerchantUserCommand, TestContext.Current.CancellationToken); @@ -373,10 +376,10 @@ public async Task MerchantDomainService_CreateMerchantUser_UserInListIsNull_Erro .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .CreateUser(Arg.Any(), Arg.Any()) + .CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); this.SecurityServiceClient - .GetUsers(Arg.Any(), Arg.Any()) + .GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List { null })); @@ -1423,9 +1426,9 @@ public async Task MerchantDomainService_CreateMerchantUser_SaveFailed_ResultIsFa .ReturnsAsync(TestData.Aggregates.CreatedEstateAggregate()); this.AggregateService.GetLatest(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(TestData.Aggregates.CreatedMerchantAggregate())); - this.SecurityServiceClient.CreateUser(Arg.Any(), Arg.Any()) + this.SecurityServiceClient.CreateUser(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - this.SecurityServiceClient.GetUsers(Arg.Any(), Arg.Any()) + this.SecurityServiceClient.GetUsers(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List { new UserResponse { UserId = "FA077CE3-B915-4048-88E3-9B500699317F" } })); this.AggregateService.Save(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); diff --git a/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs b/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs index 9ef5804e..0e42945f 100644 --- a/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs @@ -38,10 +38,12 @@ public class EstateDomainService : IEstateDomainService private readonly IAggregateService AggregateService; private readonly ISecurityServiceClient SecurityServiceClient; + private TokenResponse TokenResponse; + #endregion #region Constructors - + public EstateDomainService(Func aggregateService, ISecurityServiceClient securityServiceClient) { this.AggregateService = aggregateService(); @@ -160,11 +162,16 @@ private CreateUserRequest BuildEstateUserRequest(EstateCommands.CreateEstateUser private async Task> CreateEstateSecurityUser(CreateUserRequest createUserRequest, CancellationToken cancellationToken) { - Result createUserResult = await this.SecurityServiceClient.CreateUser(createUserRequest, cancellationToken); + Result getTokenResult = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + if (getTokenResult.IsFailed) + return ResultHelpers.CreateFailure(getTokenResult); + this.TokenResponse = getTokenResult.Data; + + Result createUserResult = await this.SecurityServiceClient.CreateUser(this.TokenResponse.AccessToken, createUserRequest, cancellationToken); if (createUserResult.IsFailed) return ResultHelpers.CreateFailure(createUserResult); - Result> userDetailsResult = await this.SecurityServiceClient.GetUsers(createUserRequest.EmailAddress, cancellationToken); + Result> userDetailsResult = await this.SecurityServiceClient.GetUsers(this.TokenResponse.AccessToken, createUserRequest.EmailAddress, cancellationToken); if (userDetailsResult.IsFailed) return ResultHelpers.CreateFailure(userDetailsResult); diff --git a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs index 744b7bfd..04ff132f 100644 --- a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs @@ -59,6 +59,7 @@ public class MerchantDomainService : IMerchantDomainService private readonly IAggregateService AggregateService; private readonly ISecurityServiceClient SecurityServiceClient; private readonly IEventStoreContext EventStoreContext; + private TokenResponse TokenResponse; #endregion @@ -296,11 +297,16 @@ private CreateUserRequest BuildMerchantUserRequest(MerchantCommands.CreateMercha private async Task> CreateMerchantSecurityUser(CreateUserRequest createUserRequest, CancellationToken cancellationToken) { - Result createUserResult = await this.SecurityServiceClient.CreateUser(createUserRequest, cancellationToken); + Result getTokenResult = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + if (getTokenResult.IsFailed) + return ResultHelpers.CreateFailure(getTokenResult); + this.TokenResponse = getTokenResult.Data; + + Result createUserResult = await this.SecurityServiceClient.CreateUser(this.TokenResponse.AccessToken, createUserRequest, cancellationToken); if (createUserResult.IsFailed) return ResultHelpers.CreateFailure(createUserResult); - Result> userDetailsResult = await this.SecurityServiceClient.GetUsers(createUserRequest.EmailAddress, cancellationToken); + Result> userDetailsResult = await this.SecurityServiceClient.GetUsers(this.TokenResponse.AccessToken, createUserRequest.EmailAddress, cancellationToken); if (userDetailsResult.IsFailed) return ResultHelpers.CreateFailure(userDetailsResult); diff --git a/TransactionProcessor.IntegrationTests/Common/DockerHelper.cs b/TransactionProcessor.IntegrationTests/Common/DockerHelper.cs index 42a94317..f443f205 100644 --- a/TransactionProcessor.IntegrationTests/Common/DockerHelper.cs +++ b/TransactionProcessor.IntegrationTests/Common/DockerHelper.cs @@ -92,17 +92,6 @@ await Retry.For(async () => responseMessage.IsSuccessStatusCode.ShouldBeTrue(); }); } - - //public override ContainerBuilder SetupTestHostContainer() - //{ - // var variables = new Dictionary(); - // variables.Add("ConnectionStrings:AgencyBankingReadModel", $"server={this.SqlServerContainerName};user id={this.SqlCredentials.usename};password={this.SqlCredentials.password};database=AgencyBankingReadModel;Encrypt=false"); - // variables.Add("ASPNETCORE_ENVIRONMENT", $"PRODUCTION"); - // this.AdditionalVariables.Add(ContainerType.TestHost, variables); - - // return base.SetupTestHostContainer(); - //} - public override ContainerBuilder SetupTransactionProcessorContainer() { Dictionary additionalVariables = new(); additionalVariables.Add("OperatorConfiguration:AgencyBanking:Url",$"http://{this.TestHostContainerName}:{DockerPorts.TestHostPort}/api/agencybanking"); @@ -112,6 +101,16 @@ public override ContainerBuilder SetupTransactionProcessorContainer() { return base.SetupTransactionProcessorContainer(); } + public override ContainerBuilder SetupSecurityServiceContainer() + { + Dictionary additionalVariables = new(); + additionalVariables.Add("ServiceOptions:OAuth:LegacyGrantTypeClients:password:1", "estateClient"); + + this.AdditionalVariables.Add(ContainerType.SecurityService, additionalVariables); + + return base.SetupSecurityServiceContainer(); + } + public override ContainerBuilder SetupTestHostContainer() { this.Trace("About to Start Test Hosts Container"); @@ -153,56 +152,6 @@ public override async Task CreateSubscriptions(){ } } - //public override ContainerBuilder SetupSecurityServiceContainer() - //{ - // this.Trace("About to Start Security Container"); - - // List environmentVariables = this.GetCommonEnvironmentVariables(); - // environmentVariables.Add($"ServiceOptions:PublicOrigin=https://{this.SecurityServiceContainerName}:{DockerPorts.SecurityServiceDockerPort}"); - // environmentVariables.Add($"ServiceOptions:IssuerUrl=https://{this.SecurityServiceContainerName}:{DockerPorts.SecurityServiceDockerPort}"); - // //environmentVariables.Add("ASPNETCORE_ENVIRONMENT=IntegrationTest"); - // environmentVariables.Add($"urls=https://*:{DockerPorts.SecurityServiceDockerPort}"); - - // environmentVariables.Add("ServiceOptions:PasswordOptions:RequiredLength=6"); - // environmentVariables.Add("ServiceOptions:PasswordOptions:RequireDigit=false"); - // environmentVariables.Add("ServiceOptions:PasswordOptions:RequireUpperCase=false"); - // environmentVariables.Add("ServiceOptions:UserOptions:RequireUniqueEmail=false"); - // environmentVariables.Add("ServiceOptions:SignInOptions:RequireConfirmedEmail=false"); - - // environmentVariables.Add(this.SetConnectionString("ConnectionStrings:PersistedGrantDbContext", $"PersistedGrantStore-{this.TestId}", this.UseSecureSqlServerDatabase)); - // environmentVariables.Add(this.SetConnectionString("ConnectionStrings:ConfigurationDbContext", $"Configuration-{this.TestId}", this.UseSecureSqlServerDatabase)); - // environmentVariables.Add(this.SetConnectionString("ConnectionStrings:AuthenticationDbContext", $"Authentication-{this.TestId}", this.UseSecureSqlServerDatabase)); - - // List additionalEnvironmentVariables = this.GetAdditionalVariables(ContainerType.SecurityService); - - // if (additionalEnvironmentVariables != null) - // { - // environmentVariables.AddRange(additionalEnvironmentVariables); - // } - - // var imageDetails = this.GetImageDetails(ContainerType.SecurityService); - // if (imageDetails.IsFailed) - // throw new Exception(imageDetails.Message); - // ContainerBuilder securityServiceContainer = new Builder().UseContainer().WithName(this.SecurityServiceContainerName) - // .WithEnvironment(environmentVariables.ToArray()) - // .UseImageDetails(imageDetails.Data) - // .MountHostFolder(this.DockerPlatform, this.HostTraceFolder) - // .SetDockerCredentials(this.DockerCredentials); - - // Int32? hostPort = this.GetHostPort(ContainerType.SecurityService); - // if (hostPort == null) - // { - // securityServiceContainer = securityServiceContainer.ExposePort(DockerPorts.SecurityServiceDockerPort); - // } - // else - // { - // securityServiceContainer = securityServiceContainer.ExposePort(hostPort.Value, DockerPorts.SecurityServiceDockerPort); - // } - - // // Now build and return the container - // return securityServiceContainer; - //} - String Serialise(Object arg) { return StringSerialiser.Serialise(arg, new SerialiserOptions(SerialiserPropertyFormat.SnakeCase)); @@ -223,6 +172,8 @@ Object Deserialise_CamelCase(String arg, Type type) return StringSerialiser.DeserializeObject(arg, type, new SerialiserOptions(SerialiserPropertyFormat.CamelCase)); } + public String AccessToken; + /// /// Starts the containers for scenario run. /// @@ -259,6 +210,13 @@ public override async Task StartContainersForScenarioRun(String scenarioName, Do this.Trace("Test Bank Configured"); this.ProjectionManagementClient = new EventStoreProjectionManagementClient(ConfigureEventStoreSettings()); + + SimpleResults.Result bootstrapToken = await this.SecurityServiceClient.GetToken("management-bootstrap", "management-bootstrap-secret", CancellationToken.None); + if (bootstrapToken.IsFailed || String.IsNullOrWhiteSpace(bootstrapToken.Data?.AccessToken)) + { + throw new InvalidOperationException("Unable to obtain the integration-test management bootstrap token."); + } + this.AccessToken = bootstrapToken.Data.AccessToken; } /// diff --git a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs index 872bb47a..24563626 100644 --- a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs +++ b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs @@ -38,7 +38,8 @@ public partial class SharedSteps private readonly TestingContext TestingContext; - private readonly SecurityServiceSteps SecurityServiceSteps; + private SecurityServiceSteps SecurityServiceSteps => new SecurityServiceSteps(this.TestingContext.DockerHelper.SecurityServiceClient, + this.TestingContext.DockerHelper.AccessToken); private readonly TransactionProcessorSteps TransactionProcessorSteps; @@ -46,7 +47,6 @@ public SharedSteps(ScenarioContext scenarioContext, TestingContext testingContext) { this.ScenarioContext = scenarioContext; this.TestingContext = testingContext; - this.SecurityServiceSteps = new SecurityServiceSteps(testingContext.DockerHelper.SecurityServiceClient); this.TransactionProcessorSteps = new TransactionProcessorSteps(testingContext.DockerHelper.TransactionProcessorClient, testingContext.DockerHelper.TestHostHttpClient, testingContext.DockerHelper.ProjectionManagementClient, testingContext.DockerHelper.AgencyBankingClient); }