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(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( $"/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( $"/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( $"/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)); } [Fact] public async Task UnknownForm_Returns400() { using var client = fixture.App.CreateHttpClient("server"); await SchoolApiTests.ResetAsync(client); var school = await SchoolApiTests.CreateAsync(client, "Плохая форма", Start, seed: 35); using var response = await client.PostAsJsonAsync( $"/api/schools/{school.Id}/dress-rules", new { students = new { form = "tuxedo", color = "noBright" } }, TestContext.Current.CancellationToken); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); Assert.Equal("unknown-form", await SchoolApiTests.ProblemCodeAsync(response)); } [Fact] public async Task UnknownColor_Returns400() { using var client = fixture.App.CreateHttpClient("server"); await SchoolApiTests.ResetAsync(client); var school = await SchoolApiTests.CreateAsync(client, "Плохой цвет", Start, seed: 35); using var response = await client.PostAsJsonAsync( $"/api/schools/{school.Id}/dress-rules", new { students = new { form = "regular", color = "neon" } }, TestContext.Current.CancellationToken); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); Assert.Equal("unknown-color", await SchoolApiTests.ProblemCodeAsync(response)); } private sealed record DressRulesDto(DressRulePairDto Students, DressRulePairDto Staff); private sealed record DressRulePairDto(string Form, string Color); private sealed record PeopleListResponse(IReadOnlyList People); private sealed record PersonListItemResponse(string Id, IReadOnlyList Roles); private sealed record PersonCardResponse(IReadOnlyList Worn); private sealed record WornItemResponse(string DefName); }