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);
        }
Beispiel #3
0
        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));
        }
Beispiel #6
0
        //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);
        }
Beispiel #7
0
        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);
            }
        }