[Tests] Пробелы в тестовом покрытии: дедупликация datetime, dynamic-режим, моки не соответствуют сигнатуре, нет конфигурации pytest #67

Closed
opened 2026-07-16 18:25:05 +07:00 by artem.kokos · 0 comments
Owner

Проблема

Аудит выявил пробелы в тестах (все 277 текущих тестов зелёные, но ряд путей не проверен).

1. Моки в test_cli.py не соответствуют реальной сигнатуре (tests/test_cli.py:94, а также строки 106, 131, 201, 213, 523, 548):

mock_fetch.return_value = [(issue, 1.0)]

fetch_issues_with_spent_time() возвращает кортежи из 3 элементов (Issue, hours, activities). Тесты проходят только потому, что report_builder.py:56-57 терпимо распаковывает for issue, hours, *rest in .... Моки вводят в заблуждение и не проверяют путь с activities.

2. Нет прямых тестов краевых случаев дедупликации: сравнение naive created_on (именно так их отдаёт redminelib) с aware cutoff; roundtrip --commit_compute_dedup_cutoff в часовом поясе ≠ UTC. См. связанный баг про краш дедупликации.

3. Нет теста связки dynamic: true + precision: datetime без --date — см. связанный баг: parse_date_range отвергает datetime-строки из compute_next_period.

4. Нет регрессионного теста полной загрузки time entries при >100 записях. Текущая реализация полагается на авто-пагинацию redminelib (bulk_request догружает страницы чанками по 100 до total_count). Поведение корректное, но не зафиксировано тестом: смена способа выборки (например, передача явного limit) может тихо ввести потерю данных.

5. Консольные форматтеры проверяются только smoke-тестами (непустота, вхождение подстрок), без структурных проверок/снапшотов; XLSXFormatter не тестирует режим by_activity.

6. Отсутствует конфигурация pytest: в pyproject.toml нет [tool.pytest.ini_options], нет pytest.ini/conftest.py — из свежего клона pytest не находит пакет без установки или PYTHONPATH=..

Рекомендации

  1. Привести моки к 3-элементным кортежам; добавить CLI-тест пути с activities.
  2. Тесты дедупликации: naive/aware, timezone roundtrip.
  3. Тест dynamic + datetime без --date.
  4. Тест с имитацией двух страниц (>100 записей) через мок ResourceSet/bulk_request — подтвердить, что все записи попадают в отчёт.
  5. Структурные проверки или снапшоты для TableFormatter/CompactFormatter; by_activity для XLSXFormatter.
  6. Добавить в pyproject.toml:
[tool.pytest.ini_options]
testpaths = ["tests"]

Связанные места

  • tests/test_cli.py:94 и др.
  • redmine_reporter/report_builder.py:56-57
  • pyproject.toml

Критерии приёмки

  • Моки соответствуют 3-элементной сигнатуре.
  • Добавлены тесты из пунктов 2-5, все зелёные.
  • pytest работает из свежего клона без дополнительных переменных окружения.
## Проблема Аудит выявил пробелы в тестах (все 277 текущих тестов зелёные, но ряд путей не проверен). **1. Моки в test_cli.py не соответствуют реальной сигнатуре** (`tests/test_cli.py:94`, а также строки 106, 131, 201, 213, 523, 548): ```python mock_fetch.return_value = [(issue, 1.0)] ``` `fetch_issues_with_spent_time()` возвращает кортежи из 3 элементов `(Issue, hours, activities)`. Тесты проходят только потому, что `report_builder.py:56-57` терпимо распаковывает `for issue, hours, *rest in ...`. Моки вводят в заблуждение и не проверяют путь с `activities`. **2. Нет прямых тестов краевых случаев дедупликации**: сравнение naive `created_on` (именно так их отдаёт redminelib) с aware cutoff; roundtrip `--commit` → `_compute_dedup_cutoff` в часовом поясе ≠ UTC. См. связанный баг про краш дедупликации. **3. Нет теста связки `dynamic: true` + `precision: datetime` без `--date`** — см. связанный баг: `parse_date_range` отвергает datetime-строки из `compute_next_period`. **4. Нет регрессионного теста полной загрузки time entries при >100 записях.** Текущая реализация полагается на авто-пагинацию redminelib (`bulk_request` догружает страницы чанками по 100 до `total_count`). Поведение корректное, но не зафиксировано тестом: смена способа выборки (например, передача явного `limit`) может тихо ввести потерю данных. **5. Консольные форматтеры проверяются только smoke-тестами** (непустота, вхождение подстрок), без структурных проверок/снапшотов; `XLSXFormatter` не тестирует режим `by_activity`. **6. Отсутствует конфигурация pytest**: в `pyproject.toml` нет `[tool.pytest.ini_options]`, нет `pytest.ini`/`conftest.py` — из свежего клона `pytest` не находит пакет без установки или `PYTHONPATH=.`. ## Рекомендации 1. Привести моки к 3-элементным кортежам; добавить CLI-тест пути с `activities`. 2. Тесты дедупликации: naive/aware, timezone roundtrip. 3. Тест dynamic + datetime без `--date`. 4. Тест с имитацией двух страниц (>100 записей) через мок ResourceSet/`bulk_request` — подтвердить, что все записи попадают в отчёт. 5. Структурные проверки или снапшоты для `TableFormatter`/`CompactFormatter`; `by_activity` для `XLSXFormatter`. 6. Добавить в `pyproject.toml`: ```toml [tool.pytest.ini_options] testpaths = ["tests"] ``` ## Связанные места - `tests/test_cli.py:94` и др. - `redmine_reporter/report_builder.py:56-57` - `pyproject.toml` ## Критерии приёмки - [ ] Моки соответствуют 3-элементной сигнатуре. - [ ] Добавлены тесты из пунктов 2-5, все зелёные. - [ ] `pytest` работает из свежего клона без дополнительных переменных окружения.
artem.kokos added the reliability label 2026-07-16 18:25:05 +07:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: artem.kokos/redmine-reporter#67