Merge branch 'merge/lock'
ci / server (push) Failing after 3m58s
ci / client (push) Failing after 16s

This commit is contained in:
Leonid Pershin
2026-08-20 05:54:23 +03:00
4 changed files with 54 additions and 3 deletions
+2 -2
View File
@@ -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 лога в том же коммите
+1 -1
View File
@@ -148,7 +148,7 @@
| --- | --- | --- |
| [34. Износ и дом](34-wear-home.md) | ✅ | Прочность, утренняя замена, из ветхого не выходят |
| [35. Уместность](35-appropriateness.md) | ✅ | Правила, переодевание действием, физкультура |
| [36. Вкладки карточки](36-person-card-tabs.md) | 🔄 | Одежда, ноша, сейчас + история за сегодня |
| [36. Вкладки карточки](36-person-card-tabs.md) | | Одежда, ноша, сейчас + история за сегодня |
| [37. Правила школы](37-school-rules.md) | ⬜ | Вкладка в «Управлении», четыре комбобокса, с завтра |
34 стоит на 31; 35 — на 32–34; 36 — на 31 и может идти параллельно с 35 в части вкладок одежды,
@@ -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()
{
@@ -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++)