public async Task Read_teams_returns_match_locations()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();

            routeNormaliser.Setup(x => x.NormaliseRouteToEntity(_databaseFixture.TeamWithFullDetails.TeamRoute, It.IsAny <Dictionary <string, string> >())).Returns(_databaseFixture.TeamWithFullDetails.TeamRoute);
            var teamDataSource = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var results = await teamDataSource.ReadTeams(null).ConfigureAwait(false);

            foreach (var team in _databaseFixture.Teams)
            {
                var result = results.SingleOrDefault(x => x.TeamId == team.TeamId);
                Assert.NotNull(result);

                foreach (var matchLocation in team.MatchLocations)
                {
                    var resultMatchLocation = result.MatchLocations.SingleOrDefault(x => x.MatchLocationId == matchLocation.MatchLocationId);
                    Assert.NotNull(resultMatchLocation);
                    Assert.Equal(matchLocation.SecondaryAddressableObjectName, resultMatchLocation.SecondaryAddressableObjectName);
                    Assert.Equal(matchLocation.PrimaryAddressableObjectName, resultMatchLocation.PrimaryAddressableObjectName);
                    Assert.Equal(matchLocation.StreetDescription, resultMatchLocation.StreetDescription);
                    Assert.Equal(matchLocation.Locality, resultMatchLocation.Locality);
                    Assert.Equal(matchLocation.Town, resultMatchLocation.Town);
                    Assert.Equal(matchLocation.AdministrativeArea, resultMatchLocation.AdministrativeArea);
                    Assert.Equal(matchLocation.Postcode, resultMatchLocation.Postcode);
                    Assert.Equal(matchLocation.Latitude, resultMatchLocation.Latitude);
                    Assert.Equal(matchLocation.Longitude, resultMatchLocation.Longitude);
                }
            }
        }
        public async Task Read_teams_supports_no_filter()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();

            routeNormaliser.Setup(x => x.NormaliseRouteToEntity(_databaseFixture.TeamWithFullDetails.TeamRoute, It.IsAny <Dictionary <string, string> >())).Returns(_databaseFixture.TeamWithFullDetails.TeamRoute);
            var teamDataSource = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var result = await teamDataSource.ReadTeams(null).ConfigureAwait(false);

            Assert.Equal(_databaseFixture.Teams.Count, result.Count);
            foreach (var team in _databaseFixture.Teams)
            {
                Assert.NotNull(result.SingleOrDefault(x => x.TeamId == team.TeamId));
            }
        }
        public async Task Read_teams_supports_filter_by_inactive_teams()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();
            var teamDataSource  = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);
            var query           = new TeamFilter {
                ActiveTeams = false
            };

            var result = await teamDataSource.ReadTeams(query).ConfigureAwait(false);

            Assert.Equal(_databaseFixture.Teams.Count(x => x.UntilYear.HasValue), result.Count);
            foreach (var team in _databaseFixture.Teams.Where(x => x.UntilYear.HasValue))
            {
                Assert.NotNull(result.SingleOrDefault(x => x.TeamId == team.TeamId));
            }
        }
        public async Task Read_teams_supports_case_insensitive_filter_by_administrative_area()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();
            var teamDataSource  = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);
            var query           = new TeamFilter {
                Query = "CoUnTy"
            };

            var result = await teamDataSource.ReadTeams(query).ConfigureAwait(false);

            Assert.Equal(_databaseFixture.Teams.Count(x => x.MatchLocations.Any(ml => ml.AdministrativeArea.Contains(query.Query, StringComparison.OrdinalIgnoreCase))), result.Count);
            foreach (var team in _databaseFixture.Teams.Where(x => x.MatchLocations.Any(ml => ml.AdministrativeArea.Contains(query.Query, StringComparison.OrdinalIgnoreCase))))
            {
                Assert.NotNull(result.SingleOrDefault(x => x.TeamId == team.TeamId));
            }
        }
        public async Task Read_teams_supports_filter_by_team_type()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();
            var teamDataSource  = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);
            var query           = new TeamFilter {
                TeamTypes = new List <TeamType?> {
                    TeamType.Representative
                }
            };

            var result = await teamDataSource.ReadTeams(query).ConfigureAwait(false);

            Assert.Equal(_databaseFixture.Teams.Count(x => x.TeamType == TeamType.Representative), result.Count);
            foreach (var team in _databaseFixture.Teams.Where(x => x.TeamType == TeamType.Representative))
            {
                Assert.NotNull(result.SingleOrDefault(x => x.TeamId == team.TeamId));
            }
        }
        public async Task Read_teams_supports_filter_by_excluded_teams()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();
            var teamDataSource  = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);
            var query           = new TeamFilter {
                ExcludeTeamIds = new List <Guid> {
                    _databaseFixture.TeamWithFullDetails.TeamId.Value
                }
            };

            var result = await teamDataSource.ReadTeams(query).ConfigureAwait(false);

            Assert.Equal(_databaseFixture.Teams.Count(x => x.TeamId != _databaseFixture.TeamWithFullDetails.TeamId.Value), result.Count);
            foreach (var team in _databaseFixture.Teams.Where(x => x.TeamId != _databaseFixture.TeamWithFullDetails.TeamId.Value))
            {
                Assert.NotNull(result.SingleOrDefault(x => x.TeamId == team.TeamId));
            }
        }
        public async Task Read_teams_sorts_inactive_last()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();

            routeNormaliser.Setup(x => x.NormaliseRouteToEntity(_databaseFixture.TeamWithFullDetails.TeamRoute, It.IsAny <Dictionary <string, string> >())).Returns(_databaseFixture.TeamWithFullDetails.TeamRoute);
            var teamDataSource = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var results = await teamDataSource.ReadTeams(null).ConfigureAwait(false);

            var expectedActiveStatus = true;

            foreach (var team in results)
            {
                // The first time an inactive team is seen, set a flag to say they must all be inactive
                if (expectedActiveStatus && team.UntilYear.HasValue)
                {
                    expectedActiveStatus = false;
                }
                Assert.Equal(expectedActiveStatus, !team.UntilYear.HasValue);
            }
            Assert.False(expectedActiveStatus);
        }
        public async Task Read_teams_returns_basic_fields()
        {
            var routeNormaliser = new Mock <IRouteNormaliser>();

            routeNormaliser.Setup(x => x.NormaliseRouteToEntity(_databaseFixture.TeamWithFullDetails.TeamRoute, It.IsAny <Dictionary <string, string> >())).Returns(_databaseFixture.TeamWithFullDetails.TeamRoute);
            var teamDataSource = new SqlServerTeamDataSource(_databaseFixture.ConnectionFactory, routeNormaliser.Object);

            var results = await teamDataSource.ReadTeams(null).ConfigureAwait(false);

            foreach (var team in _databaseFixture.Teams)
            {
                var result = results.SingleOrDefault(x => x.TeamId == team.TeamId);

                Assert.NotNull(result);
                Assert.Equal(team.TeamName, result.TeamName);
                Assert.Equal(team.TeamRoute, result.TeamRoute);
                Assert.Equal(team.PlayerType, result.PlayerType);
                Assert.Equal(team.UntilYear, result.UntilYear);
                Assert.Equal(team.Introduction, result.Introduction);
                Assert.Equal(team.PlayingTimes, result.PlayingTimes);
                Assert.Equal(team.PublicContactDetails, result.PublicContactDetails);
                Assert.Equal(team.Website, result.Website);
            }
        }