public async Task HappyPath_MoreGames_DtoHasCorrectSums()
        {
            var w3StatsRepo = new W3StatsRepo(MongoClient);
            var handler     = new OverallHeroWinRatePerHeroModelHandler(w3StatsRepo);

            var matchFinishedEvent1 = CreatFakeEvent(new [] { "deathknight", "lich" }, new [] { "archmage" });
            var matchFinishedEvent2 = CreatFakeEvent(new [] { "lich", }, new [] { "archmage" });
            var matchFinishedEvent3 = CreatFakeEvent(new [] { "deathknight", "lich" }, new [] { "archmage", "moutainking" });
            var matchFinishedEvent4 = CreatFakeEvent(new [] { "archmage", "bloodmage" }, new [] { "deathknight", "lich" });
            var matchFinishedEvent5 = CreatFakeEvent(new [] { "bloodmage" }, new [] { "deathknight", "lich" });

            await handler.Update(matchFinishedEvent1);

            await handler.Update(matchFinishedEvent2);

            await handler.Update(matchFinishedEvent3);

            await handler.Update(matchFinishedEvent4);

            await handler.Update(matchFinishedEvent5);

            var heroStatsQueryHandler = new HeroStatsQueryHandler(new W3StatsRepo(MongoClient));
            var heroWinrateDto        = await heroStatsQueryHandler.GetStats("deathknight", "lich", "all", "archmage", "all", "all");

            Assert.AreEqual(2, heroWinrateDto.Wins);
            Assert.AreEqual(1, heroWinrateDto.Losses);
        }
        public async Task HappyPath_MoreGames()
        {
            var w3StatsRepo = new W3StatsRepo(MongoClient);
            var handler     = new OverallHeroWinRatePerHeroModelHandler(w3StatsRepo);

            var matchFinishedEvent1 = CreatFakeEvent(new [] { "deathknight", "lich" }, new [] { "archmage" });
            var matchFinishedEvent2 = CreatFakeEvent(new [] { "lich", }, new [] { "archmage" });
            var matchFinishedEvent3 = CreatFakeEvent(new [] { "deathknight", "lich" }, new [] { "moutainking" });
            var matchFinishedEvent4 = CreatFakeEvent(new [] { "moutainking" }, new [] { "deathknight", "lich" });

            await handler.Update(matchFinishedEvent1);

            await handler.Update(matchFinishedEvent2);

            await handler.Update(matchFinishedEvent3);

            await handler.Update(matchFinishedEvent4);

            var dkStats = await w3StatsRepo.LoadHeroWinrate("deathknight_lich");

            var lichStats = await w3StatsRepo.LoadHeroWinrate("lich");

            Assert.AreEqual(0, dkStats.WinRates[0].WinLoss.Losses);
            Assert.AreEqual(1, dkStats.WinRates[0].WinLoss.Wins);
            Assert.AreEqual("archmage", dkStats.WinRates[0].HeroCombo);

            Assert.AreEqual(1, dkStats.WinRates[1].WinLoss.Losses);
            Assert.AreEqual(1, dkStats.WinRates[1].WinLoss.Wins);
            Assert.AreEqual("moutainking", dkStats.WinRates[1].HeroCombo);

            Assert.AreEqual(0, lichStats.WinRates[0].WinLoss.Losses);
            Assert.AreEqual(1, lichStats.WinRates[0].WinLoss.Wins);
            Assert.AreEqual("archmage", lichStats.WinRates[0].HeroCombo);
        }
        public async Task MoreGames_MirrorBug()
        {
            var w3StatsRepo = new W3StatsRepo(MongoClient);
            var handler     = new OverallHeroWinRatePerHeroModelHandler(w3StatsRepo);

            await handler.Update(CreatFakeEvent(new [] { "archmage", "mountainking", "paladin" }, new [] { "archmage", "mountainking", "paladin" }));

            await handler.Update(CreatFakeEvent(new [] { "archmage", "mountainking", "paladin" }, new [] { "archmage", "mountainking", "paladin" }));

            await handler.Update(CreatFakeEvent(new [] { "archmage", "mountainking", "paladin" }, new [] { "archmage", "mountainking", "paladin" }));

            await handler.Update(CreatFakeEvent(new [] { "archmage", "mountainking", "paladin" }, new [] { "archmage", "mountainking", "paladin" }));

            await handler.Update(CreatFakeEvent(new [] { "archmage", "mountainking", "paladin" }, new [] { "archmage", "mountainking", "paladin" }));

            var heroStatsQueryHandler = new HeroStatsQueryHandler(new W3StatsRepo(MongoClient));
            var heroWinrateDto        = await heroStatsQueryHandler.GetStats("archmage", "all", "all", "archmage", "all", "all");

            Assert.AreEqual(5, heroWinrateDto.Losses);
            Assert.AreEqual(5, heroWinrateDto.Wins);
        }
        public async Task HappyPath()
        {
            var w3StatsRepo = new W3StatsRepo(MongoClient);
            var handler     = new OverallHeroWinRatePerHeroModelHandler(w3StatsRepo);

            var matchFinishedEvent = CreatFakeEvent(new [] { "deathknight", "lich" }, new [] { "archmage" });

            await handler.Update(matchFinishedEvent);

            var amStats = await w3StatsRepo.LoadHeroWinrate("archmage");

            var dkStats = await w3StatsRepo.LoadHeroWinrate("deathknight_lich");

            Assert.AreEqual(1, amStats.WinRates[0].WinLoss.Losses);
            Assert.AreEqual(0, amStats.WinRates[0].WinLoss.Wins);
            Assert.AreEqual("deathknight_lich", amStats.WinRates[0].HeroCombo);

            Assert.AreEqual(0, dkStats.WinRates[0].WinLoss.Losses);
            Assert.AreEqual(1, dkStats.WinRates[0].WinLoss.Wins);
            Assert.AreEqual("archmage", dkStats.WinRates[0].HeroCombo);
        }