public async Task Read_competitions_sorts_by_most_recently_active_then_no_seasons_then_inactive()
        {
            var routeNormaliser       = new Mock <IRouteNormaliser>();
            var competitionDataSource = new SqlServerCompetitionDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var result = await competitionDataSource.ReadCompetitions(new CompetitionFilter { Paging = new Paging {
                                                                                                  PageSize = _databaseFixture.Competitions.Count
                                                                                              } }).ConfigureAwait(false);

            var expectedActiveStatus = true;
            var hasSeasonsIfActive   = true;

            foreach (var competition in result)
            {
                // The first time an active competition with no seasons is seen, set a flag to say they must all have no seasons if active
                if (hasSeasonsIfActive && !competition.UntilYear.HasValue && competition.Seasons.Count == 0)
                {
                    hasSeasonsIfActive = false;
                }
                if (!competition.UntilYear.HasValue)
                {
                    Assert.Equal(hasSeasonsIfActive, competition.Seasons.Any());
                }

                // The first time an inactive competition is seen, set a flag to say they must all be inactive
                if (expectedActiveStatus && competition.UntilYear.HasValue)
                {
                    expectedActiveStatus = false;
                }
                Assert.Equal(expectedActiveStatus, !competition.UntilYear.HasValue);
            }
        }
        public async Task Read_competitions_returns_latest_season_with_route_and_teams()
        {
            var routeNormaliser       = new Mock <IRouteNormaliser>();
            var competitionDataSource = new SqlServerCompetitionDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var results = await competitionDataSource.ReadCompetitions(new CompetitionFilter { Paging = new Paging {
                                                                                                   PageSize = _databaseFixture.Competitions.Count
                                                                                               } }).ConfigureAwait(false);

            foreach (var competition in _databaseFixture.Competitions)
            {
                var result = results.SingleOrDefault(x => x.CompetitionId == competition.CompetitionId);
                Assert.NotNull(result);

                var expectedSeason = competition.Seasons.OrderByDescending(x => x.FromYear).FirstOrDefault();
                if (expectedSeason != null)
                {
                    var resultSeason = result.Seasons.SingleOrDefault(x => x.SeasonId == expectedSeason.SeasonId);
                    Assert.NotNull(resultSeason);
                    Assert.Equal(expectedSeason.SeasonRoute, resultSeason.SeasonRoute);

                    foreach (var team in expectedSeason.Teams)
                    {
                        var resultTeam = resultSeason.Teams.SingleOrDefault(x => x.Team.TeamId == team.Team.TeamId);

                        Assert.NotNull(resultTeam);
                    }
                }
                else
                {
                    Assert.Empty(result.Seasons);
                }
            }
        }
        public async Task Read_competitions_supports_no_filter()
        {
            var routeNormaliser       = new Mock <IRouteNormaliser>();
            var competitionDataSource = new SqlServerCompetitionDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var result = await competitionDataSource.ReadCompetitions(new CompetitionFilter { Paging = new Paging {
                                                                                                  PageSize = _databaseFixture.Competitions.Count
                                                                                              } }).ConfigureAwait(false);

            foreach (var competition in _databaseFixture.Competitions)
            {
                Assert.NotNull(result.Single(x => x.CompetitionId == competition.CompetitionId));
            }
        }
        public async Task Read_competitions_supports_case_insensitive_filter_by_partial_player_type()
        {
            var routeNormaliser       = new Mock <IRouteNormaliser>();
            var competitionDataSource = new SqlServerCompetitionDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);
            var query = new CompetitionFilter {
                Query = "JuNioR", Paging = new Paging {
                    PageSize = _databaseFixture.Competitions.Count
                }
            };

            var result = await competitionDataSource.ReadCompetitions(query).ConfigureAwait(false);

            foreach (var competition in _databaseFixture.Competitions.Where(x => x.PlayerType.ToString().Contains(query.Query, StringComparison.OrdinalIgnoreCase)))
            {
                Assert.NotNull(result.Single(x => x.CompetitionId == competition.CompetitionId));
            }
        }
        public async Task Read_competitions_returns_basic_fields()
        {
            var routeNormaliser       = new Mock <IRouteNormaliser>();
            var competitionDataSource = new SqlServerCompetitionDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var results = await competitionDataSource.ReadCompetitions(new CompetitionFilter { Paging = new Paging {
                                                                                                   PageSize = _databaseFixture.Competitions.Count
                                                                                               } }).ConfigureAwait(false);

            foreach (var competition in _databaseFixture.Competitions)
            {
                var result = results.SingleOrDefault(x => x.CompetitionId == competition.CompetitionId);

                Assert.NotNull(result);
                Assert.Equal(competition.CompetitionName, result.CompetitionName);
                Assert.Equal(competition.CompetitionRoute, result.CompetitionRoute);
                Assert.Equal(competition.UntilYear, result.UntilYear);
                Assert.Equal(competition.PlayerType, result.PlayerType);
            }
        }
        public async Task Read_competitions_pages_results()
        {
            var routeNormaliser       = new Mock <IRouteNormaliser>();
            var competitionDataSource = new SqlServerCompetitionDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            const int pageSize   = 10;
            var       pageNumber = 1;
            var       remaining  = _databaseFixture.Competitions.Count;

            while (remaining > 0)
            {
                var result = await competitionDataSource.ReadCompetitions(new CompetitionFilter { Paging = new Paging {
                                                                                                      PageNumber = pageNumber, PageSize = pageSize
                                                                                                  } }).ConfigureAwait(false);

                var expected = pageSize > remaining ? remaining : pageSize;
                Assert.Equal(expected, result.Count);

                pageNumber++;
                remaining -= pageSize;
            }
        }