From 3485ce8ac4a0d09739b72f640913c658ca0de3b8 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Thu, 20 Aug 2026 05:44:09 +0300 Subject: [PATCH] Close phase 36 apparel-changed log tail. Add simulation and paged day-log tests; mark the log task complete in the phase doc. Co-authored-by: Cursor --- docs/phases/36-person-card-tabs.md | 4 +-- .../AppropriatenessSimulationTests.cs | 32 +++++++++++++++++++ .../PersonDayLogTests.cs | 19 +++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/docs/phases/36-person-card-tabs.md b/docs/phases/36-person-card-tabs.md index 3b9b487..7b8b776 100644 --- a/docs/phases/36-person-card-tabs.md +++ b/docs/phases/36-person-card-tabs.md @@ -25,8 +25,8 @@ - [x] История за сегодня под текущим делом: поиск, сортировка, пейджинг - [x] `GET /api/schools/{id}/people/{personId}/log` — страница и фильтр; не сокет, не лента школы. Граница суток — шесть утра; skip ночи обнуляет вчерашнее -- [ ] Запись в лог: начало/конец действия есть; утренняя выдача одежды — тип - `apparel-replaced` подхватывается, пишет фаза 34; переодевание — после фазы 35 +- [x] Запись в лог: начало/конец действия есть; утренняя выдача одежды — тип + `apparel-replaced` подхватывается, пишет фаза 34; переодевание — `apparel-changed` из фазы 35 - [x] Vitest: переключение вкладок, пейджер лога, «дома» когда activity пустая и человек away - [x] `docs/protocol.md` — HTTP лога в том же коммите diff --git a/tests/HSchool.Simulation.Tests/AppropriatenessSimulationTests.cs b/tests/HSchool.Simulation.Tests/AppropriatenessSimulationTests.cs index 7eec250..9ef4e98 100644 --- a/tests/HSchool.Simulation.Tests/AppropriatenessSimulationTests.cs +++ b/tests/HSchool.Simulation.Tests/AppropriatenessSimulationTests.cs @@ -101,6 +101,38 @@ public class AppropriatenessSimulationTests Assert.Contains(pupil.Items, item => item.Def == "TShirt" && item.Color == "Red" && item.Location == ItemLocations.Bag); } + [Fact] + public void RedressPerson_WritesApparelChangedRows() + { + using var school = Open(TuesdayMorning, seed: 31); + school.DressRules = school.DressRules with + { + Students = new DressRulePair(FormPolicies.Regular, ColorPolicies.NoBright), + }; + var pupil = school.Roster!.People.First(person => person.IsStudent && person.LockerRoomId is null); + var items = pupil.Items.ToList(); + items.Add(new InventoryItem("TShirt", "Red", 1f, ItemLocations.Worn)); + ReplaceItems(pupil, items); + + ApparelDresser.RedressPerson(school, pupil, ApparelMode.Everyday, includeHome: false); + + Assert.Contains( + school.DayLog, + row => row.PersonId == pupil.Id + && row.Type == PersonLogTypes.ApparelChanged + && row.ThingDef == "TShirt"); + var page = PersonLogBrowser.Apply( + school.DayLog, + pupil.Id, + new PersonLogQuery(null, Descending: true, Page: 1, PageSize: 20), + school.Catalog, + "ru"); + Assert.Contains(page.Entries, entry => entry.Type == PersonLogTypes.ApparelChanged); + Assert.Contains( + page.Entries, + entry => entry.Label.StartsWith("переоделся:", StringComparison.Ordinal)); + } + [Fact] public void PendingStrictRule_DoesNotApplyUntilNextMorning() { diff --git a/tests/HSchool.Simulation.Tests/PersonDayLogTests.cs b/tests/HSchool.Simulation.Tests/PersonDayLogTests.cs index 8eae1bd..030c925 100644 --- a/tests/HSchool.Simulation.Tests/PersonDayLogTests.cs +++ b/tests/HSchool.Simulation.Tests/PersonDayLogTests.cs @@ -99,6 +99,25 @@ public class PersonDayLogTests Assert.Equal("UseToilet", page.Entries[0].ThingDef); } + [Fact] + public void ApparelReplaced_FlowsThroughPagedLog() + { + using var school = OpenEmpty(TuesdayNoon); + var person = school.Roster!.People.First(); + school.AppendDayLog(new PersonLogEvent(person.Id, TuesdayNoon, PersonLogTypes.ApparelReplaced, "Shirt")); + + var page = PersonLogBrowser.Apply( + school.DayLog, + person.Id, + new PersonLogQuery(null, Descending: true, Page: 1, PageSize: 20), + school.Catalog, + "ru"); + + Assert.Single(page.Entries); + Assert.Equal(PersonLogTypes.ApparelReplaced, page.Entries[0].Type); + Assert.StartsWith("получил новую ", page.Entries[0].Label, StringComparison.Ordinal); + } + private static void TickMinutes(School school, int minutes) { for (var i = 0; i < minutes; i++)