Files
h-school/tests/HSchool.AppHost.Tests/DressRulesApiTests.cs
T
Leonid Pershin 6a0d5a9886 Implement phase 35 dress appropriateness and school rules.
Adds outfit evaluation, morning home dressing, locker-room ChangeClothes with day-log events, PE/weather AI goals, dress-rules API, and tests.
2026-08-20 05:16:52 +03:00

69 lines
3.1 KiB
C#

using System.Net;
using System.Net.Http.Json;
namespace HSchool.AppHost.Tests;
[Collection(AppHostCollection.Name)]
public class DressRulesApiTests(AppHostFixture fixture)
{
private static readonly DateTime Start = new(2012, 4, 3, 6, 0, 0, DateTimeKind.Utc);
[Fact]
public async Task NewSchool_DefaultRules_AreRegularNoBright()
{
using var client = fixture.App.CreateHttpClient("server");
await SchoolApiTests.ResetAsync(client);
var school = await SchoolApiTests.CreateAsync(client, "Правила дефолт", Start, seed: 35);
var response = await client.GetAsync($"/api/schools/{school.Id}/dress-rules", TestContext.Current.CancellationToken);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var rules = await response.Content.ReadFromJsonAsync<DressRulesDto>(TestContext.Current.CancellationToken);
Assert.NotNull(rules);
Assert.Equal("regular", rules.Students.Form);
Assert.Equal("noBright", rules.Students.Color);
Assert.Equal("regular", rules.Staff.Form);
Assert.Equal("noBright", rules.Staff.Color);
}
[Fact]
public async Task PostStrictToday_DoesNotChangeWornUntilNextMorning()
{
using var client = fixture.App.CreateHttpClient("server");
await SchoolApiTests.ResetAsync(client);
var school = await SchoolApiTests.CreateAsync(client, "Правила завтра", Start, seed: 35);
var people = await client.GetFromJsonAsync<PeopleListResponse>(
$"/api/schools/{school.Id}/people?role=student&pageSize=100",
TestContext.Current.CancellationToken);
Assert.NotNull(people);
var pupil = people.People.First(row => row.Roles.Contains("student"));
var before = await client.GetFromJsonAsync<PersonCardResponse>(
$"/api/schools/{school.Id}/people/{Uri.EscapeDataString(pupil.Id)}?lang=ru",
TestContext.Current.CancellationToken);
Assert.NotNull(before);
var post = await client.PostAsJsonAsync(
$"/api/schools/{school.Id}/dress-rules",
new { students = new { form = "strict", color = "noBright" } },
TestContext.Current.CancellationToken);
Assert.Equal(HttpStatusCode.OK, post.StatusCode);
var after = await client.GetFromJsonAsync<PersonCardResponse>(
$"/api/schools/{school.Id}/people/{Uri.EscapeDataString(pupil.Id)}?lang=ru",
TestContext.Current.CancellationToken);
Assert.NotNull(after);
Assert.Equal(before.Worn.Select(row => row.DefName), after.Worn.Select(row => row.DefName));
}
private sealed record DressRulesDto(DressRulePairDto Students, DressRulePairDto Staff);
private sealed record DressRulePairDto(string Form, string Color);
private sealed record PeopleListResponse(IReadOnlyList<PersonListItemResponse> People);
private sealed record PersonListItemResponse(string Id, IReadOnlyList<string> Roles);
private sealed record PersonCardResponse(IReadOnlyList<WornItemResponse> Worn);
private sealed record WornItemResponse(string DefName);
}