public static IPositionService Create(TimeSpan maxTimeOut)
        {
            var policy = CreatePolicy(maxTimeOut);

            var adapter = new PowerServiceAdapter(new PowerService());
            var service = new PositionService(adapter);

            return(new PositionServiceProxy(policy, service));
        }
        public async Task Returns_Empty_Trades_When_Without_Data()
        {
            var mockService = new Mock <IPowerService>();

            mockService.Setup(svc => svc.GetTradesAsync(It.IsAny <DateTime>()))
            .ReturnsAsync(Enumerable.Empty <PowerTrade>());

            var sut = new PowerServiceAdapter(mockService.Object);

            var trades = await sut.GetTradesAsync(It.IsAny <DateTime>());

            trades.Should().BeEmpty();
        }
        public async Task Returns_Correctly_Mapped_Periods_In_Trades()
        {
            var inputDate = DateTime.UtcNow;

            var availableTrade1 = PowerTrade.Create(inputDate, 5);
            var availableTrades = new[]
            {
                availableTrade1,
            };

            var mockService = new Mock <IPowerService>();

            mockService.Setup(svc => svc.GetTradesAsync(inputDate))
            .ReturnsAsync(availableTrades);

            var sut = new PowerServiceAdapter(mockService.Object);

            var trades = await sut.GetTradesAsync(inputDate);

            var actualTrade1 = trades.Single();

            actualTrade1.Date.Should().Be(inputDate, "Service and Adapter DTOs must have the same date.");
            actualTrade1.Periods.Length.Should().Be(5, "Adapter DTO period counter must match Service DTO");

            var actualPeriod1 = actualTrade1.Periods.Select(p => new
            {
                P = p.Period,
                V = p.Volume
            }).ToArray();

            var expectedPeriod1 = availableTrade1.Periods.Select(p => new
            {
                P = p.Period,
                V = p.Volume
            }).ToArray();

            actualPeriod1.ShouldBeEquivalentTo(expectedPeriod1);
        }
        public async Task Returns_All_Available_Trades()
        {
            var inputDate = DateTime.UtcNow;

            var availableTrade1 = PowerTrade.Create(inputDate, 0);
            var availableTrade2 = PowerTrade.Create(inputDate, 5);
            var availableTrades = new[]
            {
                availableTrade1,
                availableTrade2,
            };

            var mockService = new Mock <IPowerService>();

            mockService.Setup(svc => svc.GetTradesAsync(inputDate))
            .ReturnsAsync(availableTrades);

            var sut = new PowerServiceAdapter(mockService.Object);

            var trades = await sut.GetTradesAsync(inputDate);

            trades.Count.Should().Be(availableTrades.Length, "Service and Adapter DTOs count must match.");
        }
        public async Task Returns_Same_Structured_Trades()
        {
            var inputDate = DateTime.UtcNow;

            var availableTrade1 = PowerTrade.Create(inputDate, 0);
            var availableTrades = new[]
            {
                availableTrade1,
            };

            var mockService = new Mock <IPowerService>();

            mockService.Setup(svc => svc.GetTradesAsync(inputDate))
            .ReturnsAsync(availableTrades);

            var sut = new PowerServiceAdapter(mockService.Object);

            var trades = await sut.GetTradesAsync(inputDate);

            var actualTrade1 = trades.Single();

            actualTrade1.Date.Should().Be(inputDate, "Service and Adapter DTOs must have the same date.");
            actualTrade1.Periods.Length.Should().Be(availableTrade1.Periods.Length, "Adapter DTO period counter must match Service DTO");
        }