public void ReturnsPlayersSortParams()
            {
                // Arrange -> Act
                var sort = new PlayersSortParams();

                // Assert
                Assert.IsAssignableFrom <PlayersSortParams>(sort);
            }
            public void ReturnsDefaults()
            {
                // Arrange
                var sort = new PlayersSortParams();

                // Act
                sort.AddDefaults();

                // Assert
                Assert.Equal(new[] { "-entries", "display_name", "id" }, sort);
            }
            public void PropertyIsValid_AddsProperty(string property)
            {
                // Arrange
                var sort = new PlayersSortParams();

                // Act
                sort.Add(property);

                // Assert
                Assert.Equal(property, sort.Last());
            }
            public void PropertyIsInvalid_ThrowsArgumentException()
            {
                // Arrange
                var sort     = new PlayersSortParams();
                var property = "myInvalidProperty";

                // Act -> Assert
                var ex = Assert.Throws <ArgumentException>(() =>
                {
                    sort.Add(property);
                });

                Assert.Null(ex.ParamName);
            }
        public async Task <IHttpActionResult> GetPlayers(
            PlayersPagination pagination,
            PlayersSortParams sort,
            string q = null,
            CancellationToken cancellationToken = default)
        {
            IQueryable <Player> query = db.Players.AsNoTracking();

            // Filtering
            if (q != null)
            {
                query = query.Where(p => p.Name.StartsWith(q));
            }
            // Sorting
            query = query.OrderBy(SortKeySelectorMap, sort);

            var total = await query.CountAsync(cancellationToken);

            var players = await(from p in query
                                select new PlayerDTO
            {
                Id          = p.SteamId.ToString(),
                UpdatedAt   = p.LastUpdate,
                DisplayName = p.Name,
                Avatar      = p.Avatar,
            })
                          .Page(pagination)
                          .ToListAsync(cancellationToken);

            var content = new PlayersEnvelope
            {
                Total   = total,
                Players = players,
            };

            return(Ok(content));
        }