namespace HSchool.People.Tests; public class RosterBrowserTests { [Fact] public void FilterByRoleAndYear_KeepsOnlyThosePupils() { var roster = Fixtures.Generate(Fixtures.Classrooms(4)); var page = RosterBrowser.Apply( roster, Fixtures.AsOf, Query(role: PersonRoles.Student, year: 1, pageSize: RosterBrowser.MaxPageSize)); Assert.NotEmpty(page.People); Assert.Equal(page.People.Count, page.Total); Assert.All(page.People, person => { Assert.True(person.IsStudent); var schoolClass = roster.Classes.Single(candidate => candidate.Id == person.ClassId); Assert.Equal(1, schoolClass.Year); }); } [Fact] public void SortBySurname_IsAscendingOrdinal() { var roster = Fixtures.Generate(Fixtures.Classrooms(4)); var page = RosterBrowser.Apply(roster, Fixtures.AsOf, Query(pageSize: 20)); var surnames = page.People.Select(person => person.Name.Surname).ToArray(); var expected = surnames.OrderBy(name => name, StringComparer.Ordinal).ToArray(); Assert.Equal(expected, surnames); } [Fact] public void PagePastTheEnd_IsEmptyButKeepsTheTotal() { var roster = Fixtures.Generate(Fixtures.Classrooms(2)); var first = RosterBrowser.Apply(roster, Fixtures.AsOf, Query(page: 1, pageSize: 10)); var past = RosterBrowser.Apply(roster, Fixtures.AsOf, Query(page: 999, pageSize: 10)); Assert.True(first.Total > 10); Assert.Equal(10, first.People.Count); Assert.Equal(first.Total, past.Total); Assert.Empty(past.People); } [Fact] public void ParentFilter_IncludesStaffWhoAreAlsoParents() { var roster = Fixtures.Generate(Fixtures.Classrooms(4)); var page = RosterBrowser.Apply( roster, Fixtures.AsOf, Query(role: PersonRoles.Parent, pageSize: RosterBrowser.MaxPageSize)); Assert.Contains(page.People, person => person.IsStaff && person.IsParent); Assert.All(page.People, person => Assert.True(person.IsParent)); } private static RosterQuery Query( string? role = null, int? year = null, int page = 1, int pageSize = RosterBrowser.DefaultPageSize) => new(role, year, Letter: null, Position: null, Female: null, AgeMin: null, AgeMax: null, PersonSort.Surname, Descending: false, page, pageSize); }