# Тесты `WorkoutMetricsRepository` (слой Src) > Репозиторий `Server.WatchBody.Core.Dal.Src.Repository`: > IWorkoutMetricsRepository / WorkoutMetricsRepository (правила — c-dal; > unit-тесты без БД — c-tst, d-tst). ## Методы → функции БД | Метод | Транспорт | Функция БД | |---|---|---| | `Upsert(WorkoutMetrics)` → int | scalar int | `src.workout_metrics_upsert(p_athlete_id, p_workout_id, p_adherence, p_tonnage, p_tonnage_by_group, p_e1pm_by_exercise, p_hr_metrics, p_red_flags)` | | `Select(WorkoutMetricsFilter?)` → IEnumerable | reader | `src.workout_metrics_select` (строка + started_at) | `WorkoutMetricsFilter`: `WorkoutId` (Guid?), `DateFrom` (DateOnly?), `DateTo` (DateOnly?). Примечание: `computed_at` не передаётся — ставит функция. ## Механика теста (общая) `ConnectionStringTest` (d-tst-11); jsonb-поля передаются строками; конвертер читает их как string (разбор JSON — вне DAL, JsonHelper на уровне BLL). ## Заготовки (DataTable) Таблица `workout_metrics_*`: id:int, workout_id:Guid, athlete_id:int, adherence:decimal, tonnage:decimal, tonnage_by_group:string, e1pm_by_exercise:string, hr_metrics:string, red_flags:string, computed_at:DateTime, started_at:DateTime. Строки: `mt1` — adherence 92.5, tonnage 4200.0. ## Тесты: `Upsert` | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | mt1; scalar = 9 | 8 параметров; возврат 9 | ## Тесты: `Select` | № | Тип | Условие | Ожидаемый результат | |---|---|---|---| | 1 | основной | таблица [mt1] | 1 сущность; StartedAt заполнен | | 2 | граничный | пустая таблица | пустая коллекция (не null) |