public void Init() { _log = Substitute.For<ILog>(); _dateCalculator = Substitute.For<IDateCalculator>(); _powerService = Substitute.For<IPowerService>(); _positionAggregator = Substitute.For<IPositionAggregator>(); _fileNameGenerator = Substitute.For<IFileNameGenerator>(); _reportContentWriter = Substitute.For<IReportContentWriter>(); _file = Substitute.For<IFile>(); _reportGenerator = new ReportGenerator(_log, _dateCalculator, _powerService, _positionAggregator, _fileNameGenerator, _reportContentWriter, _file); _reportFolder = @"C:\Temp\"; _dates = new DateResult { ExtractDateTime = new DateTime(2015, 10, 5, 23, 34, 0), RequestDate = new DateTime(2015, 10, 6) }; _powerTradeOne = new PowerTrade(); _powerTradeTwo = new PowerTrade(); _powerTrades = new[] { _powerTradeOne, _powerTradeTwo }; _powerPosition = new PowerPosition(); _fileName = "PowerPositions.csv"; _content = "Local time, Volume etc"; _dateCalculator.Calculate().Returns(_dates); _powerService.GetTrades(_dates.RequestDate).Returns(_powerTrades); _positionAggregator.Aggregate(_dates.RequestDate, Arg.Is<List<PowerTrade>>(x => x[0] == _powerTradeOne && x[1] == _powerTradeTwo)).Returns(_powerPosition); _fileNameGenerator.Generate(_dates.ExtractDateTime).Returns(_fileName); _reportContentWriter.Write(_powerPosition).Returns(_content); }
public void Init() { _log = Substitute.For <ILog>(); _dateCalculator = Substitute.For <IDateCalculator>(); _powerService = Substitute.For <IPowerService>(); _positionAggregator = Substitute.For <IPositionAggregator>(); _fileNameGenerator = Substitute.For <IFileNameGenerator>(); _reportContentWriter = Substitute.For <IReportContentWriter>(); _file = Substitute.For <IFile>(); _reportGenerator = new ReportGenerator(_log, _dateCalculator, _powerService, _positionAggregator, _fileNameGenerator, _reportContentWriter, _file); _reportFolder = @"C:\Temp\"; _dates = new DateResult { ExtractDateTime = new DateTime(2015, 10, 5, 23, 34, 0), RequestDate = new DateTime(2015, 10, 6) }; _powerTradeOne = new PowerTrade(); _powerTradeTwo = new PowerTrade(); _powerTrades = new[] { _powerTradeOne, _powerTradeTwo }; _powerPosition = new PowerPosition(_dates.RequestDate); _fileName = "PowerPositions.csv"; _content = "Local time, Volume etc"; _dateCalculator.Calculate().Returns(_dates); _powerService.GetTrades(_dates.RequestDate).Returns(_powerTrades); _positionAggregator.Aggregate(_dates.RequestDate, Arg.Is <List <PowerTrade> >(x => x[0] == _powerTradeOne && x[1] == _powerTradeTwo)).Returns(_powerPosition); _fileNameGenerator.Generate(_dates.ExtractDateTime).Returns(_fileName); _reportContentWriter.Write(_powerPosition).Returns(_content); }
public void Generate(string reportFolder) { _log.Info("ReportGenerator started"); var dates = _dateCalculator.Calculate(); _log.InfoFormat("Report ExtractDateTime: {0}, PowerService request date: {1}", dates.ExtractDateTime, dates.RequestDate); // added a retry to the power service as this is an external call and not something we have control over // retry could be changed to catch specific exceptions var trades = new RetryBlock <IList <PowerTrade> >(() => _powerService.GetTrades(dates.RequestDate).ToList()) .WithMaxRetries(3) .WithWaitBetweenRetries(1000) .WithActionBetweenRetries(ex => _log.Warn(($"Retrying after error during GetTrades, exception: {ex}"))) .Execute(); _log.InfoFormat("{0} trade returned", trades.Count); var position = _positionAggregator.Aggregate(dates.RequestDate, trades); var fileName = _fileNameGenerator.Generate(dates.ExtractDateTime); var content = _reportContentWriter.Write(position); var fullFilePath = Path.Combine(reportFolder, fileName); _file.WriteAllText(fullFilePath, content); _log.InfoFormat("ReportGenerator complete: {0}", fullFilePath); }
public void WillRetryAndContinueLoggingAWarningIfPowerServiceThrowsException() { var exception = new Exception("Error on 1st call"); _powerService.GetTrades(_dates.RequestDate).Returns(x => { throw exception; }, x => _powerTrades); _reportGenerator.Generate(_reportFolder); _log.Received(1).Warn($"Retrying after error during GetTrades, exception: {exception}"); _file.Received(1).WriteAllText(_reportFolder + _fileName, _content); }
public void Property_HourlyPositions_constructs_from_powertrades_correctly() { var trades = _powerService.GetTrades(_testDateTime); var position = new Position(trades, _testDateTime); var expectedForDate = _testDateTime; var expectedHourlyPosition = new Dictionary <int, HourlyPosition>(); expectedHourlyPosition.Add(1, new HourlyPosition(1, 1000 * 3)); expectedHourlyPosition.Add(2, new HourlyPosition(2, 2000 * 3)); expectedHourlyPosition.Add(3, new HourlyPosition(3, 3000 * 3)); expectedHourlyPosition.Add(4, new HourlyPosition(4, 4000 * 3)); expectedHourlyPosition.Add(5, new HourlyPosition(5, 5000 * 3)); expectedHourlyPosition.Add(6, new HourlyPosition(6, 6000 * 3)); expectedHourlyPosition.Add(7, new HourlyPosition(7, 7000 * 3)); expectedHourlyPosition.Add(8, new HourlyPosition(8, 8000 * 3)); expectedHourlyPosition.Add(9, new HourlyPosition(9, 9000 * 3)); expectedHourlyPosition.Add(10, new HourlyPosition(10, 10000 * 3)); expectedHourlyPosition.Add(11, new HourlyPosition(11, 11000 * 3)); expectedHourlyPosition.Add(12, new HourlyPosition(12, 12000 * 3)); expectedHourlyPosition.Add(13, new HourlyPosition(13, 13000 * 3)); expectedHourlyPosition.Add(14, new HourlyPosition(14, 14000 * 3)); expectedHourlyPosition.Add(15, new HourlyPosition(15, 15000 * 3)); expectedHourlyPosition.Add(16, new HourlyPosition(16, 16000 * 3)); expectedHourlyPosition.Add(17, new HourlyPosition(17, 17000 * 3)); expectedHourlyPosition.Add(18, new HourlyPosition(18, 18000 * 3)); expectedHourlyPosition.Add(19, new HourlyPosition(19, 19000 * 3)); expectedHourlyPosition.Add(20, new HourlyPosition(20, 20000 * 3)); expectedHourlyPosition.Add(21, new HourlyPosition(21, 21000 * 3)); expectedHourlyPosition.Add(22, new HourlyPosition(22, 22000 * 3)); expectedHourlyPosition.Add(23, new HourlyPosition(23, 23000 * 3)); expectedHourlyPosition.Add(24, new HourlyPosition(24, 24000 * 3)); var actualHourlyPosition = position.HourlyPositions; Assert.IsTrue(expectedHourlyPosition.ContentEquals(actualHourlyPosition)); }
//Run the report. //Capture the elapsed time for logging purposes. //I would also split the elapsed time by time taken to get the trades //aggregation time and time to write out the results. //Bool required for the routine that generates missing extracts public bool RunReport(DateTime reportTime) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Boolean success = false; var trades = _powerService.GetTrades(reportTime); var aggregated = _aggregate.GetAggregatedVolumes(trades); _fileManager.WriteToFile(aggregated, reportTime); _fileManager.WriteLastRunDate(reportTime); success = true; stopWatch.Stop(); _log.Information(String.Format("Report took {0} miliseconds to run", stopWatch.ElapsedMilliseconds)); return(success); }
public static Dictionary <int, double> GetHourlyVolume(IPowerService powerService, ILogService logService, DateTime localDateTime) { Dictionary <int, double> periodVolume = new Dictionary <int, double>(); try { foreach (PowerTrade p in powerService.GetTrades(localDateTime)) { foreach (PowerPeriod pp in p.Periods) { if (periodVolume.ContainsKey(pp.Period)) { periodVolume[pp.Period] = periodVolume[pp.Period] + pp.Volume; } else { periodVolume.Add(pp.Period, pp.Volume); } } } } catch (Services.PowerServiceException seExp) { logService.Log(string.Format("Power service issue: {0} \n occured while getting data for {1}.csv file ", seExp.ToString(), GetFormattedFileName(localDateTime))); } catch (Exception exp) { logService.Log(string.Format("Unknow error: {0} \n occured while getting data for {1}.csv file ", exp.ToString(), GetFormattedFileName(localDateTime))); } if (periodVolume.Count == 0) { logService.Log(string.Format("No trade data found for {0}.csv", GetFormattedFileName(localDateTime))); } return(periodVolume); }
/// <summary> /// Retrieves all of the power trades for a given day from the PowerService. /// </summary> /// <param name="powerService">The source of power trades.</param> /// <param name="day">The day to get trades for.</param> /// <returns>Returns all of the power trades for the given day.</returns> public static PowerTrades GetTrades(IPowerService powerService, DateTimeOffset day) { return(new PowerTrades { Day = day, Trades = powerService.GetTrades(day.DateTime).ToArray() }); }
public void Setup() { var testPeriods = new PowerPeriod[] { new PowerPeriod() { Period = 1, Volume = 1000 }, new PowerPeriod() { Period = 2, Volume = 2000 }, new PowerPeriod() { Period = 3, Volume = 3000 }, new PowerPeriod() { Period = 4, Volume = 4000 }, new PowerPeriod() { Period = 5, Volume = 5000 }, new PowerPeriod() { Period = 6, Volume = 6000 }, new PowerPeriod() { Period = 7, Volume = 7000 }, new PowerPeriod() { Period = 8, Volume = 8000 }, new PowerPeriod() { Period = 9, Volume = 9000 }, new PowerPeriod() { Period = 10, Volume = 10000 }, new PowerPeriod() { Period = 11, Volume = 11000 }, new PowerPeriod() { Period = 12, Volume = 12000 }, new PowerPeriod() { Period = 13, Volume = 13000 }, new PowerPeriod() { Period = 14, Volume = 14000 }, new PowerPeriod() { Period = 15, Volume = 15000 }, new PowerPeriod() { Period = 16, Volume = 16000 }, new PowerPeriod() { Period = 17, Volume = 17000 }, new PowerPeriod() { Period = 18, Volume = 18000 }, new PowerPeriod() { Period = 19, Volume = 19000 }, new PowerPeriod() { Period = 20, Volume = 20000 }, new PowerPeriod() { Period = 21, Volume = 21000 }, new PowerPeriod() { Period = 22, Volume = 22000 }, new PowerPeriod() { Period = 23, Volume = 23000 }, new PowerPeriod() { Period = 24, Volume = 24000 }, }; var tradeOne = Mock.Create <PowerTrade>(); Mock.Arrange(() => tradeOne.Date).Returns(_testDateTime); Mock.Arrange(() => tradeOne.Periods).Returns(testPeriods); var tradeTwo = Mock.Create <PowerTrade>(); Mock.Arrange(() => tradeTwo.Date).Returns(_testDateTime.AddHours(1)); Mock.Arrange(() => tradeTwo.Periods).Returns(testPeriods); var tradeThree = Mock.Create <PowerTrade>(); Mock.Arrange(() => tradeThree.Date).Returns(_testDateTime.AddHours(2)); Mock.Arrange(() => tradeThree.Periods).Returns(testPeriods); _powerService = Mock.Create <IPowerService>(); Mock.Arrange(() => _powerService.GetTrades(_testDateTime)).Returns(new PowerTrade[] { tradeOne, tradeTwo, tradeThree }); }
public void Setup() { //Set up the power service var testPeriods = new PowerPeriod[] { new PowerPeriod() { Period = 1, Volume = 1000 }, new PowerPeriod() { Period = 2, Volume = 2000 }, new PowerPeriod() { Period = 3, Volume = 3000 }, new PowerPeriod() { Period = 4, Volume = 4000 }, new PowerPeriod() { Period = 5, Volume = 5000 }, new PowerPeriod() { Period = 6, Volume = 6000 }, new PowerPeriod() { Period = 7, Volume = 7000 }, new PowerPeriod() { Period = 8, Volume = 8000 }, new PowerPeriod() { Period = 9, Volume = 9000 }, new PowerPeriod() { Period = 10, Volume = 10000 }, new PowerPeriod() { Period = 11, Volume = 11000 }, new PowerPeriod() { Period = 12, Volume = 12000 }, new PowerPeriod() { Period = 13, Volume = 13000 }, new PowerPeriod() { Period = 14, Volume = 14000 }, new PowerPeriod() { Period = 15, Volume = 15000 }, new PowerPeriod() { Period = 16, Volume = 16000 }, new PowerPeriod() { Period = 17, Volume = 17000 }, new PowerPeriod() { Period = 18, Volume = 18000 }, new PowerPeriod() { Period = 19, Volume = 19000 }, new PowerPeriod() { Period = 20, Volume = 20000 }, new PowerPeriod() { Period = 21, Volume = 21000 }, new PowerPeriod() { Period = 22, Volume = 22000 }, new PowerPeriod() { Period = 23, Volume = 23000 }, new PowerPeriod() { Period = 24, Volume = 24000 }, }; var tradeOne = Mock.Create <PowerTrade>(); Mock.Arrange(() => tradeOne.Date).Returns(_testDateTime); Mock.Arrange(() => tradeOne.Periods).Returns(testPeriods); var tradeTwo = Mock.Create <PowerTrade>(); Mock.Arrange(() => tradeTwo.Date).Returns(_testDateTime.AddHours(1)); Mock.Arrange(() => tradeTwo.Periods).Returns(testPeriods); var tradeThree = Mock.Create <PowerTrade>(); Mock.Arrange(() => tradeThree.Date).Returns(_testDateTime.AddHours(2)); Mock.Arrange(() => tradeThree.Periods).Returns(testPeriods); _powerTrades = new List <PowerTrade>() { tradeOne, tradeTwo, tradeThree }; //simulate a short call time on the PowerService.GetTradesAsync var powerTradesTask = new Task <IEnumerable <PowerTrade> >(() => _powerTrades); powerTradesTask.Start(); powerTradesTask.Wait(); Mock.Arrange(() => _powerService.GetTradesAsync(_testDateTime)).Returns(powerTradesTask); Mock.Arrange(() => _powerService.GetTrades(_testDateTime)).Returns(_powerTrades); //set up the expected data to be written by the csv writer var assembly = Assembly.GetExecutingAssembly(); var resourceName = "TDomain.PositionExample.csv"; using (StreamReader reader = new StreamReader(assembly.GetManifestResourceStream(resourceName))) { _csvExampleText = reader.ReadToEnd(); } if (!System.IO.Directory.Exists(_fileFolder)) { Directory.CreateDirectory(_fileFolder); } }