diff --git a/src/InvestProvider.Backend/Services/DefaultServiceProvider.cs b/src/InvestProvider.Backend/Services/DefaultServiceProvider.cs index 6fc0c55..ec63313 100644 --- a/src/InvestProvider.Backend/Services/DefaultServiceProvider.cs +++ b/src/InvestProvider.Backend/Services/DefaultServiceProvider.cs @@ -10,6 +10,8 @@ using poolz.finance.csharp.contracts.InvestProvider; using InvestProvider.Backend.Services.Web3.Contracts; using System.Reflection; +using MediatR; +using InvestProvider.Backend.Services.Handlers.ContextBuilders; using MediatR.Extensions.FluentValidation.AspNetCore; namespace InvestProvider.Backend.Services; @@ -25,6 +27,8 @@ public static class DefaultServiceProvider #endif .AddMediatR(x => x.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly())) .AddFluentValidation([Assembly.GetExecutingAssembly()]) + .AddTransient(typeof(IPipelineBehavior<,>), typeof(ContextBuilderBehavior<,>)) + .AddTransient(typeof(IRequestContextBuilder<>), typeof(PhaseContextBuilder<>)) .AddSingleton() .AddSingleton, ChainProvider>() .AddSingleton() diff --git a/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdValidator.cs b/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdValidator.cs index 834b354..764d5b2 100644 --- a/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdValidator.cs +++ b/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdValidator.cs @@ -1,7 +1,5 @@ using FluentValidation; using Net.Utils.ErrorHandler.Extensions; -using InvestProvider.Backend.Services.Strapi; -using Amazon.DynamoDBv2.DataModel; using InvestProvider.Backend.Services.Web3.Contracts; using poolz.finance.csharp.contracts.LockDealNFT; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId.Models; @@ -14,10 +12,8 @@ public class AdminCreatePoolzBackIdValidator : BasePhaseValidator _lockDealNFT; public AdminCreatePoolzBackIdValidator( - IStrapiClient strapi, - IDynamoDBContext dynamoDb, ILockDealNFTService lockDealNFT - ) : base(strapi, dynamoDb) + ) { _lockDealNFT = lockDealNFT; @@ -25,7 +21,7 @@ ILockDealNFTService lockDealNFT RuleFor(x => x) .Cascade(CascadeMode.Stop) - .Must(NotNullCurrentPhase) + .Must(HasCurrentPhase) .WithError(Error.NOT_FOUND_ACTIVE_PHASE, x => (new { x.ProjectId })) .MustAsync(CorrectProviders) .WithError(Error.INVALID_POOL_TYPE); diff --git a/src/InvestProvider.Backend/Services/Handlers/AdminWriteAllocation/AdminWriteAllocationValidator.cs b/src/InvestProvider.Backend/Services/Handlers/AdminWriteAllocation/AdminWriteAllocationValidator.cs index 57607dc..4fa1bed 100644 --- a/src/InvestProvider.Backend/Services/Handlers/AdminWriteAllocation/AdminWriteAllocationValidator.cs +++ b/src/InvestProvider.Backend/Services/Handlers/AdminWriteAllocation/AdminWriteAllocationValidator.cs @@ -1,6 +1,4 @@ using FluentValidation; -using Amazon.DynamoDBv2.DataModel; -using InvestProvider.Backend.Services.Strapi; using InvestProvider.Backend.Services.Handlers.AdminWriteAllocation.Models; namespace InvestProvider.Backend.Services.Handlers.AdminWriteAllocation; @@ -8,8 +6,7 @@ namespace InvestProvider.Backend.Services.Handlers.AdminWriteAllocation; public class AdminWriteAllocationValidator : BasePhaseValidator { - public AdminWriteAllocationValidator(IStrapiClient strapi, IDynamoDBContext dynamoDb) - : base(strapi, dynamoDb) + public AdminWriteAllocationValidator() { ClassLevelCascadeMode = CascadeMode.Stop; diff --git a/src/InvestProvider.Backend/Services/Handlers/BasePhaseValidator.cs b/src/InvestProvider.Backend/Services/Handlers/BasePhaseValidator.cs index e46c2e4..acda149 100644 --- a/src/InvestProvider.Backend/Services/Handlers/BasePhaseValidator.cs +++ b/src/InvestProvider.Backend/Services/Handlers/BasePhaseValidator.cs @@ -1,32 +1,18 @@ using FluentValidation; using Net.Utils.ErrorHandler.Extensions; -using Amazon.DynamoDBv2.DataModel; -using InvestProvider.Backend.Services.Strapi; using InvestProvider.Backend.Services.DynamoDb.Models; using InvestProvider.Backend.Services.Validators.Models; namespace InvestProvider.Backend.Services.Handlers; -public abstract class BasePhaseValidator(IStrapiClient strapi, IDynamoDBContext dynamoDb) : AbstractValidator +public abstract class BasePhaseValidator : AbstractValidator where T : IExistActivePhase { - protected readonly IStrapiClient _strapi = strapi; - protected readonly IDynamoDBContext _dynamoDb = dynamoDb; + protected static bool HasCurrentPhase(IExistActivePhase model) => + model.StrapiProjectInfo.CurrentPhase != null; - protected bool NotNullCurrentPhase(IExistActivePhase model) - { - model.StrapiProjectInfo = _strapi.ReceiveProjectInfoAsync(model.ProjectId, filterPhases: model.FilterPhases) - .GetAwaiter() - .GetResult(); - return model.StrapiProjectInfo.CurrentPhase != null; - } - - protected async Task NotNullProjectsInformationAsync(TModel model, CancellationToken token) - where TModel : IValidatedDynamoDbProjectInfo - { - model.DynamoDbProjectsInfo = await _dynamoDb.LoadAsync(model.ProjectId, token); - return model.DynamoDbProjectsInfo != null; - } + protected static bool HasProjectsInformation(IValidatedDynamoDbProjectInfo model) => + model.DynamoDbProjectsInfo != null; protected static bool SetPhase(IExistPhase model) { @@ -35,25 +21,17 @@ protected static bool SetPhase(IExistPhase model) return phase != null; } - protected async Task NotNullWhiteListAsync(TModel model, CancellationToken token) - where TModel : IWhiteListUser - { - model.WhiteList = await _dynamoDb.LoadAsync( - hashKey: WhiteList.CalculateHashId(model.ProjectId, model.StrapiProjectInfo.CurrentPhase!.Start!.Value), - rangeKey: model.UserAddress.Address, - token - ); - return model.WhiteList != null; - } + protected static bool HasWhiteList(IWhiteListUser model) => + model.WhiteList != null; protected static IRuleBuilderOptions WhiteListPhaseRules(BasePhaseValidator validator) where TModel : IExistPhase, IValidatedDynamoDbProjectInfo { return validator.RuleFor(x => x) .Cascade(CascadeMode.Stop) - .MustAsync((m, ct) => validator.NotNullProjectsInformationAsync(m, ct)) + .Must(m => HasProjectsInformation(m)) .WithError(Error.POOLZ_BACK_ID_NOT_FOUND, x => new { x.ProjectId }) - .Must(m => validator.NotNullCurrentPhase(m)) + .Must(m => HasCurrentPhase(m)) .WithError(Error.NOT_FOUND_ACTIVE_PHASE, x => new { x.ProjectId }) .Must(m => SetPhase(m)) .WithError(Error.PHASE_IN_PROJECT_NOT_FOUND, x => new { x.ProjectId, x.PhaseId }) diff --git a/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/ContextBuilderBehavior.cs b/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/ContextBuilderBehavior.cs new file mode 100644 index 0000000..eff2348 --- /dev/null +++ b/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/ContextBuilderBehavior.cs @@ -0,0 +1,16 @@ +using MediatR; + +namespace InvestProvider.Backend.Services.Handlers.ContextBuilders; + +public class ContextBuilderBehavior(IRequestContextBuilder? builder) + : IPipelineBehavior + where TRequest : notnull +{ + public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) + { + if (builder is not null) + await builder.BuildAsync(request, cancellationToken); + + return await next(); + } +} diff --git a/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/IRequestContextBuilder.cs b/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/IRequestContextBuilder.cs new file mode 100644 index 0000000..f921cb3 --- /dev/null +++ b/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/IRequestContextBuilder.cs @@ -0,0 +1,9 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace InvestProvider.Backend.Services.Handlers.ContextBuilders; + +public interface IRequestContextBuilder +{ + Task BuildAsync(TRequest request, CancellationToken cancellationToken); +} diff --git a/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/PhaseContextBuilder.cs b/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/PhaseContextBuilder.cs new file mode 100644 index 0000000..e2a00e4 --- /dev/null +++ b/src/InvestProvider.Backend/Services/Handlers/ContextBuilders/PhaseContextBuilder.cs @@ -0,0 +1,33 @@ +using Amazon.DynamoDBv2.DataModel; +using InvestProvider.Backend.Services.DynamoDb.Models; +using InvestProvider.Backend.Services.Strapi; +using InvestProvider.Backend.Services.Validators.Models; + +namespace InvestProvider.Backend.Services.Handlers.ContextBuilders; + +public class PhaseContextBuilder(IStrapiClient strapi, IDynamoDBContext dynamoDb) + : IRequestContextBuilder + where T : IExistActivePhase +{ + public async Task BuildAsync(T request, CancellationToken cancellationToken) + { + request.StrapiProjectInfo = await strapi.ReceiveProjectInfoAsync( + request.ProjectId, + request.FilterPhases); + + if (request is IValidatedDynamoDbProjectInfo validated) + { + validated.DynamoDbProjectsInfo = await dynamoDb.LoadAsync( + request.ProjectId, + cancellationToken); + } + + if (request is IWhiteListUser whiteListUser && request.StrapiProjectInfo.CurrentPhase != null) + { + whiteListUser.WhiteList = await dynamoDb.LoadAsync( + WhiteList.CalculateHashId(request.ProjectId, request.StrapiProjectInfo.CurrentPhase.Start!.Value), + whiteListUser.UserAddress.Address, + cancellationToken); + } + } +} diff --git a/src/InvestProvider.Backend/Services/Handlers/GenerateSignature/GenerateSignatureValidator.cs b/src/InvestProvider.Backend/Services/Handlers/GenerateSignature/GenerateSignatureValidator.cs index c696ba8..fd7df08 100644 --- a/src/InvestProvider.Backend/Services/Handlers/GenerateSignature/GenerateSignatureValidator.cs +++ b/src/InvestProvider.Backend/Services/Handlers/GenerateSignature/GenerateSignatureValidator.cs @@ -1,8 +1,6 @@ using FluentValidation; using Net.Utils.ErrorHandler.Extensions; -using Amazon.DynamoDBv2.DataModel; using Net.Cache.DynamoDb.ERC20; -using InvestProvider.Backend.Services.Strapi; using InvestProvider.Backend.Services.Web3; using InvestProvider.Backend.Services.Web3.Contracts; using poolz.finance.csharp.contracts.LockDealNFT; @@ -19,13 +17,11 @@ public partial class GenerateSignatureRequestValidator : BasePhaseValidator _investProvider; public GenerateSignatureRequestValidator( - IStrapiClient strapi, - IDynamoDBContext dynamoDb, IRpcProvider rpcProvider, ERC20CacheProvider erc20Cache, ILockDealNFTService lockDealNFT, IInvestProviderService investProvider - ) : base(strapi, dynamoDb) + ) { _rpcProvider = rpcProvider; _erc20Cache = erc20Cache; @@ -39,9 +35,9 @@ IInvestProviderService investProvider RuleFor(x => x) .Cascade(CascadeMode.Stop) - .Must(NotNullCurrentPhase) + .Must(HasCurrentPhase) .WithError(Error.NOT_FOUND_ACTIVE_PHASE, x => new { x.ProjectId }) - .MustAsync(NotNullProjectsInformationAsync) + .Must(HasProjectsInformation) .WithError(Error.POOLZ_BACK_ID_NOT_FOUND, x => new { x.ProjectId }) .MustAsync(MustMoreThanAllowedMinimumAsync) .WithError(Error.INVEST_AMOUNT_IS_LESS_THAN_ALLOWED, x => new @@ -61,7 +57,7 @@ IInvestProviderService investProvider RuleFor(x => x) .Cascade(CascadeMode.Stop) - .MustAsync(NotNullWhiteListAsync) + .Must(HasWhiteList) .WithError(Error.NOT_IN_WHITE_LIST, x => new { x.ProjectId, PhaseId = x.StrapiProjectInfo.CurrentPhase!.Id, UserAddress = x.UserAddress.Address }) .Must(x => x.Amount + x.InvestedAmount <= x.WhiteList.Amount) .WithError(Error.AMOUNT_EXCEED_MAX_WHITE_LIST_AMOUNT, x => new diff --git a/src/InvestProvider.Backend/Services/Handlers/MyAllocation/MyAllocationValidator.cs b/src/InvestProvider.Backend/Services/Handlers/MyAllocation/MyAllocationValidator.cs index d84d155..736dc4b 100644 --- a/src/InvestProvider.Backend/Services/Handlers/MyAllocation/MyAllocationValidator.cs +++ b/src/InvestProvider.Backend/Services/Handlers/MyAllocation/MyAllocationValidator.cs @@ -1,20 +1,17 @@ using FluentValidation; -using Amazon.DynamoDBv2.DataModel; using Net.Utils.ErrorHandler.Extensions; -using InvestProvider.Backend.Services.Strapi; using InvestProvider.Backend.Services.Handlers.MyAllocation.Models; namespace InvestProvider.Backend.Services.Handlers.MyAllocation; public class MyAllocationValidator : BasePhaseValidator { - public MyAllocationValidator(IStrapiClient strapi, IDynamoDBContext dynamoDb) - : base(strapi, dynamoDb) + public MyAllocationValidator() { ClassLevelCascadeMode = CascadeMode.Stop; WhiteListPhaseRules(this) - .MustAsync(NotNullWhiteListAsync) + .Must(HasWhiteList) .When(x => x.StrapiProjectInfo.CurrentPhase!.MaxInvest == 0, ApplyConditionTo.CurrentValidator) .WithError(Error.NOT_IN_WHITE_LIST, x => new { x.ProjectId, PhaseId = x.StrapiProjectInfo.CurrentPhase!.Id, UserAddress = x.UserAddress.Address }); } diff --git a/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdValidatorTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdValidatorTests.cs index f774bf9..b33a9ab 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdValidatorTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdValidatorTests.cs @@ -1,19 +1,21 @@ using System; using System.Collections.Generic; using System.Numerics; +using System.Threading; using System.Threading.Tasks; -using Amazon.DynamoDBv2.DataModel; using Nethereum.RPC.Eth.DTOs; using Moq; using Xunit; using FluentValidation; using InvestProvider.Backend.Services.Strapi; +using Amazon.DynamoDBv2.DataModel; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId.Models; using InvestProvider.Backend.Services.Web3.Contracts; using poolz.finance.csharp.contracts.LockDealNFT; using poolz.finance.csharp.contracts.LockDealNFT.ContractDefinition; using InvestProvider.Backend.Tests; +using InvestProvider.Backend.Services.Handlers.ContextBuilders; namespace InvestProvider.Backend.Tests.Handlers; @@ -39,7 +41,8 @@ public async Task Validate_Succeeds_ForInvestProviderPool() .ReturnsAsync(fullData); var dynamoDb = new Mock(); - var validator = new AdminCreatePoolzBackIdValidator(strapi.Object, dynamoDb.Object, lockDealNFT.Object); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new AdminCreatePoolzBackIdValidator(lockDealNFT.Object); var request = new AdminCreatePoolzBackIdRequest { ProjectId = "pid", @@ -47,6 +50,7 @@ public async Task Validate_Succeeds_ForInvestProviderPool() ChainId = 1 }; + await builder.BuildAsync(request, CancellationToken.None); await validator.ValidateAndThrowAsync(request); } @@ -69,7 +73,8 @@ public async Task Validate_Throws_WhenPoolTypeInvalid() .ReturnsAsync(fullData); var dynamoDb = new Mock(); - var validator = new AdminCreatePoolzBackIdValidator(strapi.Object, dynamoDb.Object, lockDealNFT.Object); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new AdminCreatePoolzBackIdValidator(lockDealNFT.Object); var request = new AdminCreatePoolzBackIdRequest { ProjectId = "pid", @@ -77,6 +82,7 @@ public async Task Validate_Throws_WhenPoolTypeInvalid() ChainId = 1 }; + await builder.BuildAsync(request, CancellationToken.None); await Assert.ThrowsAsync(() => validator.ValidateAndThrowAsync(request)); } } diff --git a/tests/InvestProvider.Backend.Tests/Handlers/AdminWriteAllocationValidatorTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/AdminWriteAllocationValidatorTests.cs index 8e7a7d4..080a28a 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/AdminWriteAllocationValidatorTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/AdminWriteAllocationValidatorTests.cs @@ -12,6 +12,7 @@ using InvestProvider.Backend.Services.Handlers.AdminWriteAllocation.Models; using Net.Web3.EthereumWallet; using FluentValidation; +using InvestProvider.Backend.Services.Handlers.ContextBuilders; namespace InvestProvider.Backend.Tests.Handlers; @@ -33,9 +34,11 @@ public async Task Validate_Succeeds_ForWhitelistPhase() dynamoDb.Setup(x => x.LoadAsync("pid", It.IsAny())) .ReturnsAsync(new ProjectsInformation { ProjectId = "pid", PoolzBackId = 5 }); - var validator = new AdminWriteAllocationValidator(strapi.Object, dynamoDb.Object); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new AdminWriteAllocationValidator(); var request = new AdminWriteAllocationRequest("pid", "1", new[] { new UserWithAmount(new EthereumAddress("0x0000000000000000000000000000000000000001"), 10) }); + await builder.BuildAsync(request, CancellationToken.None); await validator.ValidateAndThrowAsync(request); } @@ -53,9 +56,11 @@ public async Task Validate_Throws_WhenActivePhaseMissing() dynamoDb.Setup(x => x.LoadAsync("pid", It.IsAny())) .ReturnsAsync(new ProjectsInformation { ProjectId = "pid", PoolzBackId = 5 }); - var validator = new AdminWriteAllocationValidator(strapi.Object, dynamoDb.Object); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new AdminWriteAllocationValidator(); var request = new AdminWriteAllocationRequest("pid", "1", Array.Empty()); + await builder.BuildAsync(request, CancellationToken.None); await Assert.ThrowsAsync(() => validator.ValidateAndThrowAsync(request)); } } diff --git a/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs index 161f191..6afe2d1 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs @@ -20,19 +20,12 @@ using poolz.finance.csharp.contracts.InvestProvider.ContractDefinition; using InvestProvider.Backend.Services.Handlers.GenerateSignature; using InvestProvider.Backend.Services.Handlers.GenerateSignature.Models; +using InvestProvider.Backend.Services.Handlers.ContextBuilders; namespace InvestProvider.Backend.Tests.Handlers; public class GenerateSignatureValidatorTests { - private static GenerateSignatureRequest CreateRequest(ProjectInfo projectInfo) - { - return new GenerateSignatureRequest("pid", new EthereumAddress("0x0000000000000000000000000000000000000123"), "1000000000000000000") - { - StrapiProjectInfo = projectInfo, - DynamoDbProjectsInfo = new ProjectsInformation { ProjectId = "pid", PoolzBackId = 5 } - }; - } private static void SetupCommonMocks(Mock> lockDealNFT, Mock erc20, Mock rpcProvider, Mock> investProvider) @@ -78,9 +71,11 @@ public async Task Validate_Succeeds_ForWhitelistPhase() var investProvider = new Mock>(); SetupCommonMocks(lockDealNFT, erc20, rpcProvider, investProvider); - var validator = new GenerateSignatureRequestValidator(strapi.Object, dynamoDb.Object, rpcProvider.Object, erc20.Object, lockDealNFT.Object, investProvider.Object); - var request = CreateRequest(projectInfo); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new GenerateSignatureRequestValidator(rpcProvider.Object, erc20.Object, lockDealNFT.Object, investProvider.Object); + var request = new GenerateSignatureRequest("pid", new EthereumAddress("0x0000000000000000000000000000000000000123"), "1000000000000000000"); + await builder.BuildAsync(request, CancellationToken.None); await validator.ValidateAndThrowAsync(request); } @@ -107,13 +102,11 @@ public async Task Validate_Throws_WhenAmountLessThanMinimum() var investProvider = new Mock>(); SetupCommonMocks(lockDealNFT, erc20, rpcProvider, investProvider); - var validator = new GenerateSignatureRequestValidator(strapi.Object, dynamoDb.Object, rpcProvider.Object, erc20.Object, lockDealNFT.Object, investProvider.Object); - var request = new GenerateSignatureRequest("pid", new EthereumAddress("0x0000000000000000000000000000000000000123"), "500000000000000000") - { - StrapiProjectInfo = projectInfo, - DynamoDbProjectsInfo = new ProjectsInformation { ProjectId = "pid", PoolzBackId = 5 } - }; + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new GenerateSignatureRequestValidator(rpcProvider.Object, erc20.Object, lockDealNFT.Object, investProvider.Object); + var request = new GenerateSignatureRequest("pid", new EthereumAddress("0x0000000000000000000000000000000000000123"), "500000000000000000"); + await builder.BuildAsync(request, CancellationToken.None); await Assert.ThrowsAsync(() => validator.ValidateAndThrowAsync(request)); } } diff --git a/tests/InvestProvider.Backend.Tests/Handlers/MyAllocationHandlerTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/MyAllocationHandlerTests.cs index 06317de..0580c4c 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/MyAllocationHandlerTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/MyAllocationHandlerTests.cs @@ -12,6 +12,7 @@ using Net.Web3.EthereumWallet; using FluentValidation; using InvestProvider.Backend.Tests; +using InvestProvider.Backend.Services.Handlers.ContextBuilders; namespace InvestProvider.Backend.Tests.Handlers; @@ -38,10 +39,12 @@ public async Task Handle_ReturnsResponse_WhenDataExists() dynamoDb.Setup(x => x.LoadAsync(WhiteList.CalculateHashId("pid", startTime), address.Address, It.IsAny())) .ReturnsAsync(whiteList); - var validator = new MyAllocationValidator(strapi.Object, dynamoDb.Object); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new MyAllocationValidator(); var handler = new MyAllocationHandler(); var request = new MyAllocationRequest("pid", address); + await builder.BuildAsync(request, CancellationToken.None); await validator.ValidateAndThrowAsync(request); var result = await handler.Handle(request, CancellationToken.None); @@ -67,10 +70,12 @@ public async Task Handle_Throws_WhenWhiteListMissing() dynamoDb.Setup(x => x.LoadAsync(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(Task.FromResult(null!)); - var validator = new MyAllocationValidator(strapi.Object, dynamoDb.Object); + var builder = new PhaseContextBuilder(strapi.Object, dynamoDb.Object); + var validator = new MyAllocationValidator(); var handler = new MyAllocationHandler(); var request = new MyAllocationRequest("pid", new EthereumAddress("0x0000000000000000000000000000000000000123")); + await builder.BuildAsync(request, CancellationToken.None); var ex = await Assert.ThrowsAsync(async () => { await validator.ValidateAndThrowAsync(request);