public async Task NotReserveLimitWhenHasLimitAvailable() { //arrange var amountUsed = 80000; var limitType = LimitType.CashIn; var featureType = FeatureType.TED; var cycleType = CycleType.Monthly; var levelType = LevelType.Account; var limitLevel = LimitLevel.Create(levelType, amountUsed - 1, 6000); var customer = Fixture.CreateLimitCustomer(limitType, featureType, cycleType, limitLevel); var command = new ReserveLimitCommand() { CompanyKey = customer.CompanyKey, DocumentNumber = customer.DocumentNumber, LimitType = limitType, FeatureType = featureType, CycleType = cycleType, LevelType = levelType, Amount = amountUsed }; _limitService.GetLimitAsync(Arg.Any <string>(), Arg.Any <string>()).Returns(customer); //act var result = await _handle.Handle(command, CancellationToken.None); //assert Assert.False(result.IsValid); await _repository.DidNotReceive().SaveAsync(Arg.Any <LimitUsed>()); }
public async Task <ResultOfCommandData <LimitAvaliableDto> > Handle(ReserveLimitCommand request, CancellationToken cancellationToken) { var result = new ResultOfCommandData <LimitAvaliableDto>(); var limitCustomer = await _limitService.GetLimitAsync(request.CompanyKey, request.DocumentNumber); var limitLevel = limitCustomer.GetLimitLevel(request.LimitType, request.FeatureType, request.CycleType, request.LevelType); if (limitLevel.MaxValue >= request.Amount) { var limitUsed = LimitUsed.Create(request.CompanyKey, request.DocumentNumber, request.LimitType, request.FeatureType, request.CycleType, request.LevelType, request.Amount); await _limitUsedCommand.SaveAsync(limitUsed); result.Data = new LimitAvaliableDto { AmountUsed = request.Amount, LimitAvaliable = limitLevel.MaxValue - request.Amount }; } else { result.AddErrorMessage(MessageOfDomain.DontHaveLimit); } return(result); }
public async Task <IActionResult> ReserveLimit([FromBody] ReserveLimitCommand command) { var result = await _mediator.Send(command); return(Ok(result)); }