# Тесты `WorkoutRepository` (слой Src) > Репозиторий `Server.WatchBody.Core.Dal.Src.Repository`: > IWorkoutRepository / WorkoutRepository (правила — c-dal; unit-тесты > без БД — c-tst, d-tst). ## Методы → функции БД | Метод | Транспорт | Функция БД | |---|---|---| | `Insert(Workout)` → Guid | scalar Guid | `src.workout_insert(p_athlete_id, p_id, p_program_version_id, p_started_at, p_session_kind)` | | `Update(Workout)` → int | scalar int | `src.workout_update` (все поля, db-m-8) | | `Select(WorkoutFilter?)` → IEnumerable | reader | `src.workout_select` (карточка + sets jsonb) | | `Get(int athleteId, Guid workoutId)` → Workout? | reader | `src.workout_get` (строка + sets + commands jsonb) | `WorkoutFilter`: `Status` (string?), `DateFrom` (DateOnly?), `DateTo` (DateOnly?). Примечание: `program_version_id` передаётся только в Insert; Update программную версию не меняет (функция её не пишет). ## Механика теста (общая) `ConnectionStringTest` (d-tst-11); один DataTable = один конвертер (d-tst-13). Select/Get читают денормализованные `sets`/`commands` (jsonb) — конвертер разбирает их в коллекции `Workout.Sets` / `Workout.Commands`. ## Заготовки (DataTable) Таблица `workout_select`: id:Guid, athlete_id:int, program_version_id:Guid?, started_at:DateTime, ended_at:DateTime?, status:string, session_kind:string, avg_hr:int?, facts_json:string?, fit_file_id:string?, hr_recovery_s:int?, sets:string (jsonb), commands:string (jsonb — только в get). Строки: `w1` — normal, active, sets='[{"seq":1},{"seq":2}]', commands='[{"t_offset_s":65}]'; `w2` — тот же профиль, sets='[]', commands='[]'. ## Тесты: `Insert` | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | w1 без версии (program_version_id = null); scalar = Guid w1 | 5 параметров; NULL → DBNull | ## Тесты: `Update` | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | w1 c фактами FitParser; scalar = 1 | параметры p_athlete_id, p_id, p_ended_at, p_status, p_session_kind, p_avg_hr, p_facts_json, p_fit_file_id, p_hr_recovery_s | ## Тесты: `Select` | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [w1] | сущность; Sets = 2 элемента по порядку jsonb | | 2 | граничный | пустая таблица; фильтры NULL | пустая коллекция | ## Тесты: `Get` | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [w1] | сущность; Sets = 2, Commands = 1 | | 2 | граничный | пустая таблица | null |