public async Task Read_total_schools_supports_case_insensitive_filter_by_administrative_area()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());

            var schoolWithAdministrativeArea = _databaseFixture.TestData.Schools.First(x => x.Teams.Any(t => t.MatchLocations.Any(ml => !string.IsNullOrEmpty(ml.AdministrativeArea))));
            var locality = schoolWithAdministrativeArea.Teams.First(x => x.MatchLocations.Any(ml => !string.IsNullOrEmpty(ml.AdministrativeArea))).MatchLocations.First(ml => !string.IsNullOrEmpty(ml.AdministrativeArea)).AdministrativeArea;

            var query = new SchoolFilter {
                Query = locality.ToLower(CultureInfo.CurrentCulture)
            };

            var result = await schoolDataSource.ReadTotalSchools(query).ConfigureAwait(false);

            Assert.Equal(SchoolsMatchingQuery(query.Query).Count, result);
        }
        public async Task Read_schools_returns_basic_fields()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());

            var results = await schoolDataSource.ReadSchools(null).ConfigureAwait(false);

            foreach (var school in _databaseFixture.TestData.Schools)
            {
                var result = results.SingleOrDefault(x => x.SchoolId == school.SchoolId);

                Assert.NotNull(result);
                Assert.Equal(school.SchoolName, result.SchoolName);
                Assert.Equal(school.SchoolRoute, result.SchoolRoute);
                Assert.Equal(school.UntilYear, result.UntilYear);
            }
        }
        public async Task Read_schools_sorts_inactive_last()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());

            var results = await schoolDataSource.ReadSchools(null).ConfigureAwait(false);

            var expectedActiveStatus = true;

            foreach (var school in results)
            {
                // The first time a school that is not active is seen, set a flag to say they must all be inactive
                if (expectedActiveStatus && !school.IsActive())
                {
                    expectedActiveStatus = false;
                }
                Assert.Equal(expectedActiveStatus, school.IsActive());
            }
            Assert.False(expectedActiveStatus);
        }
        public async Task Read_schools_supports_case_insensitive_filter_by_partial_name()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());
            var schoolName       = PartialNameOfAnySchool();
            var query            = new SchoolFilter
            {
                Query  = schoolName.ToLower(CultureInfo.CurrentCulture),
                Paging = new Paging {
                    PageSize = _databaseFixture.TestData.Schools.Count
                }
            };

            var result = await schoolDataSource.ReadSchools(query).ConfigureAwait(false);

            foreach (var school in SchoolsMatchingQuery(query.Query))
            {
                Assert.NotNull(result.Single(x => x.SchoolId == school.SchoolId));
            }
        }
        public async Task Read_schools_supports_case_insensitive_filter_by_administrative_area()
        {
            var schoolDataSource   = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());
            var schoolWithLocality = _databaseFixture.TestData.Schools.First(x => x.Teams.Any(t => t.MatchLocations.Any(ml => !string.IsNullOrEmpty(ml.AdministrativeArea))));
            var administrativeArea = schoolWithLocality.Teams.First(x => x.MatchLocations.Any(ml => !string.IsNullOrEmpty(ml.AdministrativeArea))).MatchLocations.First(ml => !string.IsNullOrEmpty(ml.AdministrativeArea)).AdministrativeArea;
            var query = new SchoolFilter
            {
                Query  = administrativeArea.ToLower(CultureInfo.CurrentCulture),
                Paging = new Paging {
                    PageSize = _databaseFixture.TestData.Schools.Count
                }
            };

            var result = await schoolDataSource.ReadSchools(query).ConfigureAwait(false);

            foreach (var school in SchoolsMatchingQuery(query.Query))
            {
                Assert.NotNull(result.Single(x => x.SchoolId == school.SchoolId));
            }
        }
        public async Task Read_schools_pages_results()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());

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

            while (remaining > 0)
            {
                var result = await schoolDataSource.ReadSchools(new SchoolFilter { Paging = new Paging {
                                                                                       PageNumber = pageNumber, PageSize = pageSize
                                                                                   } }).ConfigureAwait(false);

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

                pageNumber++;
                remaining -= pageSize;
            }
        }
        public async Task Read_schools_returns_basic_fields_for_teams()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());

            var results = await schoolDataSource.ReadSchools(null).ConfigureAwait(false);

            foreach (var school in _databaseFixture.TestData.Schools)
            {
                var schoolResult = results.SingleOrDefault(x => x.SchoolId == school.SchoolId);
                Assert.NotNull(schoolResult);
                Assert.Equal(school.Teams.Count, schoolResult.Teams.Count);

                foreach (var team in school.Teams)
                {
                    var schoolTeamResult = schoolResult.Teams.SingleOrDefault(x => x.TeamId == team.TeamId);
                    Assert.NotNull(schoolTeamResult);

                    Assert.Equal(team.TeamType, schoolTeamResult.TeamType);
                    Assert.Equal(team.UntilYear, schoolTeamResult.UntilYear);
                    Assert.Equal(team.PlayerType, schoolTeamResult.PlayerType);
                }
            }
        }
        public async Task Read_schools_subsorts_by_name()
        {
            var schoolDataSource = new SqlServerSchoolDataSource(_databaseFixture.ConnectionFactory, Mock.Of <IRouteNormaliser>());

            var results = await schoolDataSource.ReadSchools(null).ConfigureAwait(false);

            // Active teams
            var sortedResults = new List <string>(results.Where(x => x.IsActive()).Select(x => x.SchoolName));

            sortedResults.Sort();
            var queue = new Queue <string>(sortedResults);

            foreach (var result in results)
            {
                if (!result.IsActive())
                {
                    continue;
                }

                Assert.Equal(queue.Dequeue(), result.SchoolName);
            }

            // Then inactive teams
            sortedResults = new List <string>(results.Where(x => !x.IsActive()).Select(x => x.SchoolName));
            sortedResults.Sort();
            queue = new Queue <string>(sortedResults);

            foreach (var result in results)
            {
                if (result.IsActive())
                {
                    continue;
                }

                Assert.Equal(queue.Dequeue(), result.SchoolName);
            }
        }