Give each school its own people seed so composition no longer follows create order.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
using System.Net.Http.Json;
|
||||
|
||||
namespace HSchool.AppHost.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// The people seed is a school field of its own, not the school id. These tests share the
|
||||
/// AppHost, so each one starts by clearing the list.
|
||||
/// </summary>
|
||||
[Collection(AppHostCollection.Name)]
|
||||
public class SchoolSeedTests(AppHostFixture fixture)
|
||||
{
|
||||
private static readonly DateTime Start = new(2012, 4, 3, 6, 0, 0, DateTimeKind.Utc);
|
||||
|
||||
[Fact]
|
||||
public async Task SameSeed_PopulatesTheSamePeople_DifferentSeedsDoNot()
|
||||
{
|
||||
using var client = fixture.App.CreateHttpClient("server");
|
||||
await SchoolApiTests.ResetAsync(client);
|
||||
|
||||
var first = await SchoolApiTests.CreateAsync(client, "Сид одинаковый А", Start, seed: 42);
|
||||
var second = await SchoolApiTests.CreateAsync(client, "Сид одинаковый Б", Start, seed: 42);
|
||||
var other = await SchoolApiTests.CreateAsync(client, "Сид другой", Start, seed: 7);
|
||||
|
||||
var firstYearFive = await YearFiveAsync(client, first.Id);
|
||||
var secondYearFive = await YearFiveAsync(client, second.Id);
|
||||
var otherYearFive = await YearFiveAsync(client, other.Id);
|
||||
|
||||
Assert.Equal(firstYearFive, secondYearFive);
|
||||
Assert.NotEqual(firstYearFive, otherYearFive);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task UnseededSchool_KeepsItsPeopleAfterReload()
|
||||
{
|
||||
using var client = fixture.App.CreateHttpClient("server");
|
||||
await SchoolApiTests.ResetAsync(client);
|
||||
|
||||
var created = await SchoolApiTests.CreateAsync(client, "Сид брошен", Start);
|
||||
|
||||
var before = await YearFiveAsync(client, created.Id);
|
||||
|
||||
using var reload = await client.PostAsync("/api/dev/reload-schools", content: null, TestContext.Current.CancellationToken);
|
||||
reload.EnsureSuccessStatusCode();
|
||||
|
||||
var restored = (await SchoolApiTests.GetSchoolsAsync(client)).Schools.Single(school => school.Id == created.Id);
|
||||
Assert.Equal(created.Seed, restored.Seed);
|
||||
Assert.Equal(before, await YearFiveAsync(client, created.Id));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task PassedSeed_IsVisibleInTheSchoolList()
|
||||
{
|
||||
using var client = fixture.App.CreateHttpClient("server");
|
||||
await SchoolApiTests.ResetAsync(client);
|
||||
|
||||
var created = await SchoolApiTests.CreateAsync(client, "Сид в списке", Start, seed: 20260819);
|
||||
|
||||
Assert.Equal(20260819, created.Seed);
|
||||
|
||||
var listed = (await SchoolApiTests.GetSchoolsAsync(client)).Schools.Single(school => school.Id == created.Id);
|
||||
Assert.Equal(20260819, listed.Seed);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TwoUnseededSchools_ArePopulatedDifferently()
|
||||
{
|
||||
using var client = fixture.App.CreateHttpClient("server");
|
||||
await SchoolApiTests.ResetAsync(client);
|
||||
|
||||
var first = await SchoolApiTests.CreateAsync(client, "Без сида А", Start);
|
||||
var second = await SchoolApiTests.CreateAsync(client, "Без сида Б", Start);
|
||||
|
||||
Assert.NotEqual(first.Seed, second.Seed);
|
||||
Assert.NotEqual(await YearFiveAsync(client, first.Id), await YearFiveAsync(client, second.Id));
|
||||
}
|
||||
|
||||
private static async Task<(string Id, string FullName)[]> YearFiveAsync(HttpClient client, int schoolId)
|
||||
{
|
||||
var page = await client.GetFromJsonAsync<PeoplePage>(
|
||||
$"/api/schools/{schoolId}/people?role=student&year=5&sort=surname&pageSize=100",
|
||||
TestContext.Current.CancellationToken);
|
||||
Assert.NotNull(page);
|
||||
Assert.NotEmpty(page.People);
|
||||
return [.. page.People.Select(person => (person.Id, person.FullName))];
|
||||
}
|
||||
|
||||
private sealed record PeoplePage(IReadOnlyList<PersonRow> People);
|
||||
|
||||
private sealed record PersonRow(string Id, string FullName);
|
||||
}
|
||||
Reference in New Issue
Block a user