public async Task PlayerHeroStats_PlayerAgainstEnemyAndPlayerLosses_EnemyShouldHaveCorrectHeroStats(Race enemyRace)
        {
            var playerRepository       = new PlayerStatsRepository(MongoClient);
            var playerHeroStatsHandler = new PlayerHeroStatsHandler(playerRepository);

            var player       = CreatePlayer("player#123", Race.HU, won: false);
            var playerHeroes = CreateHeroes("playerhero");

            var enemyPlayer   = CreatePlayer("enemy#567", enemyRace, won: true);
            var enemyUdHeroes = CreateHeroes("enemyhero");

            MatchFinishedEvent match1 = CreateMatchEvent(player, playerHeroes, enemyPlayer, enemyUdHeroes);
            await playerHeroStatsHandler.Update(match1);

            var enemyHerosStats = await playerRepository.LoadHeroStat(enemyPlayer.battleTag, 0);

            Assert.AreEqual(enemyPlayer.battleTag, enemyHerosStats.BattleTag);
            Assert.AreEqual(1, enemyHerosStats.HeroStatsItemList.Count);

            var enemyHeroStats = GetHeroStatsForRaceAndMap(enemyHerosStats, "enemyhero", enemyRace, "Overall");

            var enemyStatsVsPlayerRace = enemyHeroStats.WinLosses.Single(x => x.Race == Race.HU);

            Assert.AreEqual(1, enemyStatsVsPlayerRace.Wins);
            Assert.AreEqual(0, enemyStatsVsPlayerRace.Losses);
        }
        public async Task PlayerHeroStats_PlayerAgainstTwoEnemies_PlayerShouldHaveCorrectHeroStats()
        {
            var playerRepository       = new PlayerStatsRepository(MongoClient);
            var playerHeroStatsHandler = new PlayerHeroStatsHandler(playerRepository);

            var player       = CreatePlayer("player#123", Race.HU, won: true);
            var playerHeroes = CreateHeroes("archmage", "mountainking");

            var enemyUdPlayer = CreatePlayer("enemyUd#567", Race.UD);
            var enemyUdHeroes = CreateHeroes("deathknight", "lich");

            // Match 1 Hu vs UD
            MatchFinishedEvent match1 = CreateMatchEvent(player, playerHeroes, enemyUdPlayer, enemyUdHeroes);
            await playerHeroStatsHandler.Update(match1);

            // Match 2 Hu vs NE
            var enemyNePlayer         = CreatePlayer("enemyNe#89", Race.NE);
            var enemyNeHeroes         = CreateHeroes("deamonhunter");
            MatchFinishedEvent match2 = CreateMatchEvent(player, playerHeroes, enemyNePlayer, enemyNeHeroes);
            await playerHeroStatsHandler.Update(match2);

            var playerHeroStats = await playerRepository.LoadHeroStat(player.battleTag, 0);

            var enemyUdHeroStats = await playerRepository.LoadHeroStat(enemyUdPlayer.battleTag, 0);

            var enemyNeHeroStats = await playerRepository.LoadHeroStat(enemyNePlayer.battleTag, 0);

            // *** Player hero stats
            Assert.AreEqual(player.battleTag, playerHeroStats.BattleTag);
            Assert.AreEqual(2, playerHeroStats.HeroStatsItemList.Count);

            // Archmage Stats
            var playerAmStats = GetHeroStatsForRaceAndMap(playerHeroStats, "archmage", Race.HU, "Overall");

            var playerAmVsUd = playerAmStats.WinLosses.Single(x => x.Race == Race.UD);

            Assert.AreEqual(1, playerAmVsUd.Wins);
            Assert.AreEqual(0, playerAmVsUd.Losses);

            var playerAmVsNe = playerAmStats.WinLosses.Single(x => x.Race == Race.UD);

            Assert.AreEqual(1, playerAmVsNe.Wins);
            Assert.AreEqual(0, playerAmVsNe.Losses);

            // Mountain king Stats
            var playerMKStats = GetHeroStatsForRaceAndMap(playerHeroStats, "mountainking", Race.HU, "Overall");

            var playerMKVsUd = playerMKStats.WinLosses.Single(x => x.Race == Race.UD);

            Assert.AreEqual(1, playerMKVsUd.Wins);
            Assert.AreEqual(0, playerMKVsUd.Losses);

            var playerMKVsNe = playerMKStats.WinLosses.Single(x => x.Race == Race.UD);

            Assert.AreEqual(1, playerMKVsNe.Wins);
            Assert.AreEqual(0, playerMKVsNe.Losses);
        }
        public async Task LoadAndSaveMapAndRace()
        {
            var playerRepository = new PlayerStatsRepository(MongoClient);

            var player = PlayerRaceOnMapVersusRaceRatio.Create("peter#123", 0);
            await playerRepository.UpsertMapAndRaceStat(player);

            var playerLoaded = await playerRepository.LoadMapAndRaceStat(player.BattleTag, 0);

            Assert.AreEqual(player.BattleTag, playerLoaded.BattleTag);
        }
        public void Setup()
        {
            var cache = new RedisCacheRepository(
                connectionString: "localhost,abortConnect=false",
                environment: "local",
                functionalArea: "bts",
                serializer: new JsonSerialiser(),
                logger: new FakeCacheLogger(),
                expire: false);
            var normalPlayerStatsRepository = new PlayerStatsRepository();

            _sut = new CachedPlayerStatsRepository(
                decoratedComponent: normalPlayerStatsRepository,
                cache: cache);
        }
        public async Task MapWinsAsTotalRace()
        {
            var playerRepository = new PlayerStatsRepository(MongoClient);

            var player = PlayerRaceOnMapVersusRaceRatio.Create("peter#123", 0);
            var patch  = "1.32.5";

            player.AddMapWin(Race.HU, Race.UD, "TM", true, patch);
            player.AddMapWin(Race.NE, Race.UD, "TM", true, patch);
            player.AddMapWin(Race.OC, Race.UD, "TM", true, patch);

            await playerRepository.UpsertMapAndRaceStat(player);

            var playerLoaded = await playerRepository.LoadMapAndRaceStat(player.BattleTag, 0);

            Assert.AreEqual(3, playerLoaded.GetWinLoss(Race.Total, Race.UD, "TM", patch).Wins);
        }