# Фикстуры разбора Health Auto Export Конвенция требует тестов на **реальных** пакетах: документация формата тонкая и местами расходится с тем, что приложение шлёт на самом деле. Инвариант при этом запрещает данным о здоровье попадать под контроль версий. Поэтому фикстуры собраны из живого архива скриптом `tmp/research/fixtures.py`, который сохраняет всё, на чём работает разбор, и уничтожает всё, что является измерением. Сохранено дословно: порядок ключей, форма числового литерала, выравнивание меток по секундам и минутам, смещение зоны, длительности интервалов, невидимые символы в именах устройств, категориальные значения. Заменено: числа (цифры переставлены с сохранением формы), даты (сдвинуты на постоянную величину), имена устройств. | Файл | Что проверяет | |---|---| | `minute.json` | минутная доставка; плотные метрики минутные, одна (`apple_stand_hour`) часовая — классификация **по метрике**, а не по доставке; редкие наследуют минутный слой; суточная сводка сна | | `hour.json` | часовая доставка целиком | | `raw.json` | посекундная доставка | | `mixed.json` | одна доставка с минутными, посекундными и часовыми метриками — перенастройка автоматизации | | `heartbeat_series.json` | точка с `heartbeatSeries`: третий формат времени, серия проходит исходными байтами | | `sparse_sleep.json` | доставка **без плотных метрик** (заголовок `Default` не спасает) и поэпизодный сон с задвоенной меткой — интервальная идентичность | | `handmade_edge.json` | случаи, которых живой поток не даёт (см. ниже) | `handmade_edge.json` собран руками, скриптом не воспроизводится: - `mixed_alignment` — плотная метрика, где 10 меток часовые и одна минутная: слой обязан выйти минутным, потому что слой метрики — **самое мелкое** встретившееся выравнивание; - `unknown_shape` — незнакомое поле точки (в том числе вложенное), `1.0`, целое больше 2⁵³ и дробь длиннее двенадцати значащих цифр: всё это обязано пережить хранение дословно; - `broken_timestamps` — RFC 3339 вместо формата HAE, пустая строка, отсутствие `date` и число вместо строки: каждая точка пропускается со счётчиком, разбор не падает; - `interval_points` — три записи с одной меткой и разными интервалами: ключ по метке схлопнул бы их в одну. Обновить набор: ``` python3 tmp/research/fixtures.py --list python3 tmp/research/fixtures.py <файл из data/raw> --metrics a,b --limit 14 \ --out internal/hae/testdata/<имя>.json ```