Implement people management features by adding API endpoints for retrieving school rosters and individual person cards. Enhance the UI to support a people browser with filtering and pagination capabilities. Update localization strings for improved user experience and ensure robust handling of person data. Revise documentation to reflect new API functionalities and update tests to validate the new features.
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user