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 <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 05:44:09 +03:00
co-authored by Cursor
parent 3fa6ce95df
commit 3485ce8ac4
3 changed files with 53 additions and 2 deletions
+2 -2
View File
@@ -25,8 +25,8 @@
- [x] История за сегодня под текущим делом: поиск, сортировка, пейджинг - [x] История за сегодня под текущим делом: поиск, сортировка, пейджинг
- [x] `GET /api/schools/{id}/people/{personId}/log` — страница и фильтр; не сокет, не лента - [x] `GET /api/schools/{id}/people/{personId}/log` — страница и фильтр; не сокет, не лента
школы. Граница суток — шесть утра; skip ночи обнуляет вчерашнее школы. Граница суток — шесть утра; skip ночи обнуляет вчерашнее
- [ ] Запись в лог: начало/конец действия есть; утренняя выдача одежды — тип - [x] Запись в лог: начало/конец действия есть; утренняя выдача одежды — тип
`apparel-replaced` подхватывается, пишет фаза 34; переодевание — после фазы 35 `apparel-replaced` подхватывается, пишет фаза 34; переодевание — `apparel-changed` из фазы 35
- [x] Vitest: переключение вкладок, пейджер лога, «дома» когда activity пустая и человек away - [x] Vitest: переключение вкладок, пейджер лога, «дома» когда activity пустая и человек away
- [x] `docs/protocol.md` — HTTP лога в том же коммите - [x] `docs/protocol.md` — HTTP лога в том же коммите
@@ -101,6 +101,38 @@ public class AppropriatenessSimulationTests
Assert.Contains(pupil.Items, item => item.Def == "TShirt" && item.Color == "Red" && item.Location == ItemLocations.Bag); 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] [Fact]
public void PendingStrictRule_DoesNotApplyUntilNextMorning() public void PendingStrictRule_DoesNotApplyUntilNextMorning()
{ {
@@ -99,6 +99,25 @@ public class PersonDayLogTests
Assert.Equal("UseToilet", page.Entries[0].ThingDef); 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) private static void TickMinutes(School school, int minutes)
{ {
for (var i = 0; i < minutes; i++) for (var i = 0; i < minutes; i++)