public async Task GetBets_Should_Map_Bet_To_ViewModel()
        {
            var betService = new Mock <ICustomerBetService>();

            betService.Setup(t => t.GetCustomersAsync())
            .ReturnsAsync(new[] { new CustomerDto {
                                      Id = 1, Name = "name1"
                                  } });

            betService.Setup(t => t.GetBetsAsync()).ReturnsAsync(new[]
            {
                new BetDto
                {
                    CustomerId  = 1,
                    RaceId      = 100,
                    ReturnStake = 500,
                    Won         = true
                }
            });

            var target = new BetViewService(betService.Object);
            var result = (await target.GetBets()).ToArray();

            Assert.That(result, Has.Length.EqualTo(1));
            Assert.That(result[0].RaceId, Is.EqualTo(100));
            Assert.That(result[0].CustomerId, Is.EqualTo(1));
            Assert.That(result[0].ReturnStake, Is.EqualTo(500));
            Assert.That(result[0].Won, Is.True);
        }
        public async Task GetBets_Should_Return_ViewModel_Per_Bet()
        {
            var betService = new Mock <ICustomerBetService>();

            betService.Setup(t => t.GetCustomersAsync())
            .ReturnsAsync(new[] { new CustomerDto {
                                      Id = 1, Name = "name1"
                                  } });

            betService.Setup(t => t.GetBetsAsync())
            .ReturnsAsync(new[]
            {
                new BetDto {
                    CustomerId = 1, RaceId = 100
                },
                new BetDto {
                    CustomerId = 1, RaceId = 200
                }
            });


            var target = new BetViewService(betService.Object);

            var result = (await target.GetBets()).ToArray();

            Assert.That(result, Has.Length.EqualTo(2));
            Assert.That(result[0].RaceId, Is.EqualTo(100));
            Assert.That(result[1].RaceId, Is.EqualTo(200));
        }
        public async Task GetBets_Should_Calculate_TotalReturnStake()
        {
            var betService = new Mock <ICustomerBetService>();

            betService.Setup(t => t.GetCustomersAsync())
            .ReturnsAsync(new[]
            {
                new CustomerDto {
                    Id = 1, Name = "name1"
                },
                new CustomerDto {
                    Id = 2, Name = "name2"
                }
            });

            betService.Setup(t => t.GetBetsAsync())
            .ReturnsAsync(new[]
            {
                new BetDto {
                    CustomerId = 1, ReturnStake = 100, Won = true
                },
                new BetDto {
                    CustomerId = 1, ReturnStake = 200, Won = true
                },
                new BetDto {
                    CustomerId = 1, ReturnStake = 50, Won = false
                },

                new BetDto {
                    CustomerId = 2, ReturnStake = 200, Won = true
                },
                new BetDto {
                    CustomerId = 2, ReturnStake = 300, Won = true
                },
                new BetDto {
                    CustomerId = 2, ReturnStake = 25, Won = false
                },
            });

            var target = new BetViewService(betService.Object);
            var result = (await target.GetBets()).ToArray();

            var cust1Bet = result.First(t => t.CustomerId == 1);

            Assert.That(cust1Bet.TotalReturnStake, Is.EqualTo(250));

            var cust2Bet = result.First(t => t.CustomerId == 2);

            Assert.That(cust2Bet.TotalReturnStake, Is.EqualTo(475));
        }