# Спецификация: чтение программы (GetActive, ListVersions, GetVersion) ## 1. `GetActive(int athleteId)` → `ProgramVersion?` Активная версия с body; программы/активной версии нет → `null`. Изоляция: только программы этого атлета. | # | Тест | Ожидание | |---|---|---| | 1 | есть активная | версия со status = active, body ≠ пусто | | 2 | программы нет | null | | 3 | все версии archived | null | ## 2. `ListVersions(int athleteId)` → `IReadOnlyList` Версии программы атлета (без body — поле пустое), по возрастанию номера. Программы нет → пустой список. | # | Тест | Ожидание | |---|---|---| | 4 | три версии | 3 записи, номера 1–3 по возрастанию, статусы соответствуют, body пустые | | 5 | чужой атлет | пустой список (изоляция) | ## 3. `GetVersion(int athleteId, Guid versionId)` → `ProgramVersion?` Версия с body; чужая версия атлета / не существует → `null` (различие не выдаётся). | # | Тест | Ожидание | |---|---|---| | 6 | своя версия | версия с body | | 7 | чужая версия | null |