# Тесты `ProgramRepository` и `ProgramVersionRepository` (слой Src) > Репозитории `Server.WatchBody.Core.Dal.Src.Repository`: > IProgramRepository / ProgramRepository, IProgramVersionRepository / ProgramVersionRepository > (правила — c-dal; unit-тесты без БД — c-tst, d-tst). ## Методы → функции БД | Репозиторий | Метод | Функция БД | |---|---|---| | Program | `Insert(Program)` → int | `src.program_insert` | | Program | `Select(int athleteId)` → IEnumerable | `src.program_select` | | Program | `Get(int athleteId, int programId)` → Program? | `src.program_get` | | ProgramVersion | `Insert(ProgramVersion)` → Guid | `src.program_version_insert` | | ProgramVersion | `UpdateStatus(int athleteId, Guid versionId, string status)` → int | `src.program_version_update` | | ProgramVersion | `Select(ProgramVersionFilter?)` → IEnumerable | `src.program_version_select` | | ProgramVersion | `Get(int athleteId, Guid versionId)` → ProgramVersion? | `src.program_version_get` | `ProgramVersionFilter`: `ProgramId` (int?), `Status` (string?), `Author` (string?). Примечание: `_update` меняет только статус (🛡) — специализированное имя `UpdateStatus` вместо Update (c-dal-5). ## Механика теста (общая) `ConnectionStringTest` (d-tst-11); Program содержит денормализацию `active_version_id`/`active_version` (конвертер заполняет ActiveVersionId/ActiveVersionNumber); ProgramVersion.Select — без body колонки (конвертер не ждёт её); ProgramVersion.Get — с body. ## Заготовки (DataTable) Таблица `program_*`: id:int, athlete_id:int, title:string, created_at:DateTime, active_version_id:Guid?, active_version:int?. Строки: `pr1` — TEST-Программа, active_version_id NULL; `pr2` — TEST-Программа, active версия 2. Таблица `program_version_select`: id:Guid, program_id:int, version:int, based_on_version:int?, status:string, author:string, rationale:string, created_at:DateTime. Таблица `program_version_get`: та же + body:string. Строки: `v1` — version 1, draft, based_on NULL, body='{}'; `v2` — version 2, active, based_on 1. ## Тесты: `Insert` (Program) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | pr1; scalar = 5 | Insert→5; параметры p_athlete_id, p_title | ## Тесты: `Select` (Program) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [pr1, pr2] | 2 сущности; pr2.ActiveVersionNumber = 2; pr1 — null | ## Тесты: `Get` (Program) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [pr2] | сущность с ActiveVersionId | | 2 | граничный | пустая таблица | null | ## Тесты: `Insert` (ProgramVersion) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | v1; scalar = Guid v1 | параметры p_athlete_id, p_id, p_program_id, p_based_on_version, p_author, p_body, p_rationale | ## Тесты: `UpdateStatus` (ProgramVersion) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | v1 → active; scalar = 1 | параметры p_athlete_id, p_id, p_status='active' | ## Тесты: `Select` (ProgramVersion) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [v1, v2]; фильтры NULL | 2 сущности; body-колонки в таблице нет | | 2 | граничный | пустая таблица | пустая коллекция | ## Тесты: `Get` (ProgramVersion) | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [v2] (с body) | сущность; Body = '{}' | | 2 | граничный | пустая таблица | null |