public void DateTimeToTimeSlotShouldReturnCorrectTimeSlot1() { // Arrange var dateTime = new DateTime(2018, 1, 1, 0, 0, 0); // Act var interval = _converter.DateTimeToTimeSlot(dateTime); // Assert interval.ShouldBe(0); }
public async Task <ApiPriceModel> Handle(BenchmarkRequest request, CancellationToken cancellationToken) { var date = request.Date.Parse(); var timeSlot = _converter.DateTimeToTimeSlot(date); var isPortfolioEmpty = string.IsNullOrEmpty(request.Portfolio); if (isPortfolioEmpty) { throw new ArgumentNullException(nameof(request.Portfolio)); } var benchmark = await _priceModelService.GetBenchmark(timeSlot, portfolio : request.Portfolio); return(new ApiPriceModel(benchmark.Start, benchmark.Price)); }
public async Task <ApiPriceModel> Handle(AveragePriceRequest request, CancellationToken cancellationToken) { var date = request.Date.Parse(); var timeSlot = _converter.DateTimeToTimeSlot(date); var isInstrumentOwnerEmpty = string.IsNullOrEmpty(request.InstrumentOwner); var isInstrumentEmpty = string.IsNullOrEmpty(request.Instrument); var isPortfolioEmpty = string.IsNullOrEmpty(request.Portfolio); if (isInstrumentOwnerEmpty && isInstrumentEmpty && isPortfolioEmpty) { throw new ArgumentNullException(nameof(request), "Provide at least one filter"); } var average = await _priceModelService.GetAverage(timeSlot, request.InstrumentOwner, request.Instrument, request.Portfolio); return(new ApiPriceModel(average.Start, average.Price)); }
public async Task <ApiPriceModel[]> Handle(AggregateRequest request, CancellationToken cancellationToken) { var startDate = request.StartDate.Parse(); var endDate = request.EndDate.Parse(); var isPortfolioEmpty = string.IsNullOrEmpty(request.Portfolio); if (isPortfolioEmpty) { throw new ArgumentNullException(nameof(request.Portfolio)); } if (request.ResultPoints <= 0) { throw new ArgumentOutOfRangeException(nameof(request.ResultPoints), request.ResultPoints, "Provide positive value"); } if (endDate < startDate) { throw new ArgumentOutOfRangeException(nameof(request.EndDate), request.EndDate, $"Provide end date after {request.StartDate}"); } var startTimeSlot = _converter.DateTimeToTimeSlot(startDate); var endTimeSlot = _converter.DateTimeToTimeSlot(endDate); var timeSlotsCount = endTimeSlot - startTimeSlot + 1; if (timeSlotsCount < request.ResultPoints) { throw new ArgumentException("Time slots between start and end date less than " + "result points requested." + $"Time slots - {timeSlotsCount}, " + $"Result points - {request.ResultPoints}"); } if (timeSlotsCount == 1) { throw new ArgumentException("Time interval is too short. " + "Use instead 'benchmark' endpoint"); } var frame = timeSlotsCount / request.ResultPoints; var rest = timeSlotsCount % request.ResultPoints; var result = new List <ApiPriceModel>(); var leftTimeSlot = startTimeSlot; for (var i = 0; i < request.ResultPoints; i++) { var rightTimeSlot = leftTimeSlot + frame; if (rest > 0) { ++rightTimeSlot; --rest; } var benchmarks = new List <decimal>(); for (var j = leftTimeSlot; j < rightTimeSlot; j++) { try { var benchmark = await _priceModelService.GetBenchmark(j, portfolio : request.Portfolio); benchmarks.Add(benchmark.Price); } catch (PriceModelAbsentException) { // just ignore } } var date = _converter.GetTimeSlotStartDate(rightTimeSlot - 1); if (!benchmarks.Any()) { throw new PriceModelAbsentException(date); } var priceModel = new ApiPriceModel(date, benchmarks.Average()); result.Add(priceModel); leftTimeSlot = rightTimeSlot; } return(result.ToArray()); }