public void TestMatchesStatsInvalidHostname()
        {
            var request = new HttpRequest(HttpMethod.Get, Stream.Null);
            var urlArgs = new Dictionary <string, string> {
                { "endpoint", "test.com" }
            };
            var response = StatsRoutes.GetServerStatsByEndpoint(urlArgs, request);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public void TestPlayerStatsEmpty()
        {
            var urlArgs = new Dictionary <string, string> {
                { "name", "two" }
            };
            var request  = new HttpRequest(HttpMethod.Get, Stream.Null);
            var response = StatsRoutes.GetPlayerStatsByName(urlArgs, request);
            var expected = new PlayerStats
            {
                LastMatchPlayed = DateTime.MinValue
            };
            var actual = JsonConvert.DeserializeObject <PlayerStats>(response.Content);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.AreEqual(expected, actual);
        }
        public void TestMatchesStatsEmpty()
        {
            var request = new HttpRequest(HttpMethod.Get, Stream.Null);
            var urlArgs = new Dictionary <string, string> {
                { "endpoint", "test.com-8080" }
            };
            var response = StatsRoutes.GetServerStatsByEndpoint(urlArgs, request);
            var actual   = JsonConvert.DeserializeObject <MatchesStats>(response.Content);
            var expected = new MatchesStats
            {
                Top5Maps      = new List <string>(),
                Top5GameModes = new List <string>()
            };

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.AreEqual(actual, expected);
        }
        public void TestMatchesStatsNormal()
        {
            var server = new GameServer
            {
                Endpoint  = "test.com-8080",
                GameModes = new List <GameMode>(),
                Name      = "test"
            };
            var expected       = new MatchesStats();
            var modes          = new[] { "DM", "TDM", "DE", "DB", "KL", "MN" };
            var modesFrequency = new Dictionary <string, int>();
            var maps           = new[] { "Dust", "Mirage", "Nuke", "Assault", "Mansion" };
            var mapsFrequency  = new Dictionary <string, int>();
            var daysFrequency  = new Dictionary <DateTime, int>();
            var timestamp      = DateTime.Now;
            var rand           = new Random();

            using (var db = new ServerDatabase())
            {
                db.GameServers.Add(server);
                db.SaveChanges();

                var count = rand.Next(99, 170);
                for (var j = 0; j < count; j++)
                {
                    var timespan   = new TimeSpan(rand.Next(0, 17), 0, 0, 0);
                    var day        = timestamp.Add(timespan);
                    var mode       = modes[rand.Next(0, modes.Length - 1)];
                    var map        = maps[rand.Next(0, maps.Length - 1)];
                    var population = rand.Next(1, 50);
                    var match      = new GameMatch
                    {
                        Timestamp = day, Server = server, GameMode = mode,
                        Map       = map, TotalPlayers = population
                    };
                    db.GameMatches.Add(match);

                    if (modesFrequency.ContainsKey(mode))
                    {
                        modesFrequency[mode]++;
                    }
                    else
                    {
                        modesFrequency[mode] = 1;
                    }
                    if (mapsFrequency.ContainsKey(map))
                    {
                        mapsFrequency[map]++;
                    }
                    else
                    {
                        mapsFrequency[map] = 1;
                    }
                    if (daysFrequency.ContainsKey(day))
                    {
                        daysFrequency[day]++;
                    }
                    else
                    {
                        daysFrequency[day] = 1;
                    }
                    if (population > expected.MaximumPopulation)
                    {
                        expected.MaximumPopulation = population;
                    }
                    expected.AveragePopulation += population;
                }
                expected.AveragePopulation /= count;
                expected.TotalMatchesPlayed = count;
                db.SaveChanges();
            }
            expected.AverageMatchesPerDay = (double)daysFrequency.Sum(x => x.Value) / daysFrequency.Count;
            expected.MaximumMatchesPerDay = daysFrequency.Max(x => x.Value);
            expected.Top5GameModes        = modesFrequency
                                            .OrderByDescending(x => x.Value)
                                            .Select(x => x.Key);
            expected.Top5Maps = mapsFrequency
                                .OrderByDescending(x => x.Value)
                                .Select(x => x.Key);

            var request = new HttpRequest(HttpMethod.Get, Stream.Null);
            var urlArgs = new Dictionary <string, string> {
                { "endpoint", "test.com-8080" }
            };
            var response = StatsRoutes.GetServerStatsByEndpoint(urlArgs, request);
            var actual   = JsonConvert.DeserializeObject <MatchesStats>(response.Content);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.AreEqual(actual, expected);
        }
        public void TestPlayerStatsNormal()
        {
            var server1 = new GameServer
            {
                Endpoint  = "test1.com",
                GameModes = new List <GameMode>(),
                Name      = "test1"
            };
            var server2 = new GameServer
            {
                Endpoint  = "test2.com",
                GameModes = new List <GameMode>(),
                Name      = "test2"
            };
            var date    = DateTime.MinValue;
            var matches = new List <GameMatch>
            {
                new GameMatch
                {
                    GameMode = "DM", Map = "Dust", Timestamp = date,
                    Server   = server1, TotalPlayers = 3
                },
                new GameMatch
                {
                    GameMode = "DM", Map = "Dust", Timestamp = date.AddDays(1),
                    Server   = server2, TotalPlayers = 3
                },
                new GameMatch
                {
                    GameMode = "TDM", Map = "Mirage", Timestamp = date,
                    Server   = server2, TotalPlayers = 3
                },
            };

            matches[0].Scoreboard = new List <PlayerScore>
            {
                new PlayerScore {
                    Deaths = 4, Kills = 5, Match = matches[0], Name = "one", Place = 1
                },
                new PlayerScore {
                    Deaths = 5, Kills = 4, Match = matches[0], Name = "two", Place = 2
                },
                new PlayerScore {
                    Deaths = 6, Kills = 3, Match = matches[0], Name = "three", Place = 3
                }
            };
            matches[1].Scoreboard = new List <PlayerScore>
            {
                new PlayerScore {
                    Deaths = 40, Kills = 5, Match = matches[1], Name = "two", Place = 1
                },
                new PlayerScore {
                    Deaths = 5, Kills = 52, Match = matches[1], Name = "one", Place = 2
                },
                new PlayerScore {
                    Deaths = 4, Kills = 12, Match = matches[1], Name = "three", Place = 3
                }
            };
            matches[2].Scoreboard = new List <PlayerScore>
            {
                new PlayerScore {
                    Deaths = 1, Kills = 0, Match = matches[2], Name = "three", Place = 1
                },
                new PlayerScore {
                    Deaths = 10, Kills = 22, Match = matches[2], Name = "two", Place = 2
                },
                new PlayerScore {
                    Deaths = 47, Kills = 14, Match = matches[2], Name = "one", Place = 3
                }
            };

            using (var db = new ServerDatabase())
            {
                db.GameServers.Add(server1);
                db.GameServers.Add(server2);
                db.GameMatches.AddRange(matches);
                db.SaveChanges();
            }

            var urlArgs = new Dictionary <string, string> {
                { "name", "two" }
            };
            var request  = new HttpRequest(HttpMethod.Get, Stream.Null);
            var response = StatsRoutes.GetPlayerStatsByName(urlArgs, request);
            var expected = new PlayerStats
            {
                AverageMatchesPerDay = 1.5, AverageScoreboardPercent = (double)200 / 3,
                FavoriteGameMode     = "DM", FavoriteServer = "test2.com",
                KillToDeathRatio     = (double)(22 + 5 + 4) / (10 + 40 + 5),
                LastMatchPlayed      = date.AddDays(1), MaximumMatchesPerDay = 2,
                TotalMatchesPlayed   = 3, TotalMatchesWon = 1, UniqueServers = 2
            };
            var actual = JsonConvert.DeserializeObject <PlayerStats>(response.Content);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.AreEqual(expected, actual);
        }