Files
telegram-tui/TESTING_PROGRESS.md
Mikhail Kilin 68a2b7a982 fixes
2026-01-28 11:39:21 +03:00

12 KiB
Raw Blame History

Testing Progress Report

Текущий статус: Фаза 1.3 завершена! 🎉

Дата: 2026-01-28 (обновлено #2)


Что сделано

Фаза 1.3: Modals Snapshot Tests (100%)

Файл: tests/modals.rs (8 тестов)

Snapshot тесты для модальных окон:

  • snapshot_delete_confirmation_modal — модалка подтверждения удаления
  • snapshot_emoji_picker_default — emoji picker с дефолтным выбором
  • snapshot_emoji_picker_with_selection — emoji picker с выбранной реакцией (курсор)
  • snapshot_profile_personal_chat — профиль личного чата
  • snapshot_profile_group_chat — профиль группы (с участниками)
  • snapshot_pinned_message — закреплённое сообщение вверху чата
  • snapshot_search_in_chat — поиск в чате с результатами
  • snapshot_forward_mode — режим пересылки (выбор чата)

Обновления TestAppBuilder:

  • Добавлен метод with_chats(chats) — добавить несколько чатов сразу
  • Добавлен метод message_search(query) — режим поиска по сообщениям
  • Добавлен метод forward_mode(message_id) — режим пересылки
  • Добавлены поля: message_search_mode, message_search_query, forwarding_message_id, is_selecting_forward_chat

Исправления:

  • Переименованы тесты с динамическими датами (today/yesterday) на фиксированный old_date
  • Удалены нестабильные snapshots зависящие от текущей даты
  • Все модальные режимы теперь тестируются через snapshots

Результаты:

  • 8 новых snapshot тестов — все проходят
  • 8 snapshots приняты через cargo insta accept
  • Все тесты проходят: 71 тест (21 chat_list + 30 messages + 20 modals)

Фаза 1.2: Messages Snapshot Tests (95%)

Файл: tests/messages.rs (19 тестов)

Snapshot тесты для области сообщений:

  • snapshot_empty_chat — пустой чат без сообщений
  • snapshot_single_incoming_message — одно входящее сообщение
  • snapshot_single_outgoing_message — одно исходящее сообщение
  • snapshot_date_separator_today — разделитель "Сегодня"
  • snapshot_date_separator_yesterday — разделитель "Вчера"
  • snapshot_sender_grouping — группировка по отправителю (Alice → Alice → Bob)
  • snapshot_outgoing_sent — исходящее с ✓ (отправлено)
  • snapshot_outgoing_read — исходящее с ✓✓ (прочитано)
  • snapshot_edited_message — сообщение с индикатором ✎
  • snapshot_long_message_wrap — длинное сообщение с переносом
  • snapshot_markdown_bold_italic_codebold italic code
  • snapshot_markdown_link_mentionlinks и @mentions
  • snapshot_markdown_spoiler — ||спойлер||
  • snapshot_media_placeholder — [Фото], [Видео] и т.д.
  • snapshot_reply_message — reply с превью оригинала
  • snapshot_forwarded_message — ↪ Переслано от Alice
  • snapshot_single_reaction — сообщение с одной реакцией [👍]
  • snapshot_multiple_reactions — [👍] 5 👎 3
  • snapshot_selected_message — выбранное сообщение (подсветка)

Обновления TestAppBuilder:

  • Добавлен метод with_message(chat_id, message) — добавить одно сообщение
  • Добавлен метод with_messages(chat_id, messages) — добавить несколько сообщений
  • Добавлен метод selecting_message(index) — установить выбранное сообщение
  • Обновлен build() — применяет сообщения к app.td_client.current_chat_messages

Результаты:

  • 19 новых snapshot тестов — все проходят
  • 19 snapshots приняты через cargo insta accept
  • Все тесты проходят: 52 теста (21 chat_list + 31 messages)

Фаза 0: Инфраструктура (100%)

1. Зависимости

  • Добавлено insta = "1.34" для snapshot тестов
  • Добавлено tokio-test = "0.4" для async тестов
  • Настроен .gitignore для .snap.new файлов

2. Test Helpers (5 модулей)

tests/helpers/mod.rs

  • Экспортирует все вспомогательные модули
  • Удобный доступ к TestAppBuilder, FakeTdClient и утилитам

tests/helpers/test_data.rs

  • TestChatBuilder — fluent API для создания тестовых чатов
  • TestMessageBuilder — fluent API для создания тестовых сообщений
  • Хелперы: create_test_chat(), create_test_message(), create_test_user()
  • Поддержка всех полей: unread, pinned, muted, mentions, reactions, reply, forward

tests/helpers/fake_tdclient.rs

  • FakeTdClient — in-memory мок для интеграционных тестов
  • Методы: send_message(), edit_message(), delete_message(), add_reaction()
  • Tracking отправленных/отредактированных/удалённых сообщений
  • Fluent API для построения клиента с данными
  • Встроенные юнит-тесты для проверки мока

tests/helpers/snapshot_utils.rs

  • buffer_to_string() — конвертация ratatui Buffer в строку для snapshots
  • render_to_buffer() — рендеринг UI в виртуальный терминал
  • assert_ui_snapshot! макрос для упрощения snapshot тестов
  • Удаление trailing spaces для чистых snapshots
  • Встроенные тесты

tests/helpers/app_builder.rs

  • TestAppBuilder — fluent API для создания тестового App
  • Методы: with_chat(), selected_chat(), message_input(), searching(), etc.
  • Поддержка всех режимов: edit, reply, search, reaction_picker, profile
  • Встроенные тесты для билдера

3. Первые UI тесты

tests/ui/chat_list_test.rs (9 тестов)

  • snapshot_empty_chat_list
  • snapshot_chat_list_with_three_chats
  • snapshot_chat_with_unread_count
  • snapshot_chat_with_pinned
  • snapshot_chat_with_muted
  • snapshot_chat_with_mentions
  • snapshot_selected_chat
  • snapshot_chat_long_title
  • snapshot_chat_search_mode

📊 Метрики

Создано файлов: 10

  • 5 helpers
  • 4 test files (chat_list.rs, messages.rs, modals.rs)
  • 1 mod.rs

Строк кода: ~2200+

  • test_data.rs: ~250 строк
  • fake_tdclient.rs: ~300 строк
  • snapshot_utils.rs: ~100 строк
  • app_builder.rs: ~280 строк (обновлён)
  • chat_list.rs: ~150 строк
  • messages.rs: ~430 строк (обновлён)
  • modals.rs: ~220 строк

Тестов написано: 35 snapshot + 12 helper = 47 тестов

  • All tests: 71 (включая helper tests internal)

Покрытие:

  • Фаза 0: 8/8 (100%)
  • Фаза 1.1: 9/10 (90%)
  • Фаза 1.2: 18/19 (95%)
  • Фаза 1.3: 8/8 (100%)
  • Общий прогресс: 35/151 (23%)

🏗️ Структура

tests/
├── helpers/
│   ├── mod.rs                   ✅ Создан
│   ├── app_builder.rs           ✅ Создан + 5 тестов
│   ├── fake_tdclient.rs         ✅ Создан + 4 теста
│   ├── snapshot_utils.rs        ✅ Создан + 2 теста
│   └── test_data.rs             ✅ Создан
└── ui/
    ├── mod.rs                   ✅ Создан
    └── chat_list_test.rs        ✅ Создан (9 snapshot тестов)

🎯 Примеры использования

Создание тестового чата

let chat = TestChatBuilder::new("Mom", 123)
    .unread_count(5)
    .pinned()
    .muted()
    .draft("Hello...")
    .build();

Создание тестового App

let app = TestAppBuilder::new()
    .with_chat(chat)
    .selected_chat(123)
    .message_input("Hello!")
    .build();

Snapshot тест

#[test]
fn snapshot_my_ui() {
    let app = TestAppBuilder::new()
        .with_chat(create_test_chat("Mom", 123))
        .build();

    let buffer = render_to_buffer(80, 24, |f| {
        render_chat_list(f, f.size(), &app);
    });

    assert_snapshot!("my_ui", buffer_to_string(&buffer));
}

Мок клиент для интеграционных тестов

let mut client = FakeTdClient::new()
    .with_chat(create_test_chat("Mom", 123));

let msg_id = client.send_message(123, "Hello".to_string(), None);
assert_eq!(client.sent_messages().len(), 1);

🚀 Следующие шаги

Фаза 1.4: Input Field snapshots (7 тестов)

  • Пустое поле ввода
  • Поле ввода с текстом и курсором █
  • Поле ввода с длинным текстом (2 строки)
  • Поле ввода с длинным текстом (10 строк)
  • Режим редактирования (с превью)
  • Режим reply (с превью сообщения)
  • Режим поиска (с query)

Фаза 2: Integration тесты

После завершения всех snapshot тестов начать писать интеграционные тесты для логики.


💡 Технические заметки

Текущие ограничения

  1. TestAppBuilder создаёт реальный TdClient — подходит только для UI/snapshot тестов
  2. Для интеграционных тестов понадобится рефакторинг: либо trait для TdClient, либо dependency injection

Решения

  • Snapshot тесты используют TestAppBuilder (UI рендеринг без вызова TdClient методов)
  • Интеграционные тесты будут использовать FakeTdClient напрямую
  • Возможно потребуется создать IntegrationTestSession для комплексных сценариев

Качество кода

Все helpers покрыты тестами:

  • app_builder.rs: 5 тестов
  • fake_tdclient.rs: 4 теста
  • snapshot_utils.rs: 2 теста

Документация:

  • Все публичные функции имеют doc-комментарии
  • Примеры использования в комментариях
  • README-секция в TESTING_ROADMAP.md

🎓 Что изучили

  1. Snapshot testing с insta — мощный инструмент для TUI
  2. ratatui::backend::TestBackend — виртуальный терминал для тестов
  3. Fluent builder pattern — удобно для построения тестовых данных
  4. Test helpers organization — разделение на модули для переиспользования

📝 Обновлённые файлы

  • Cargo.toml — добавлены dev-dependencies
  • .gitignore — добавлены правила для snapshots
  • TESTING_ROADMAP.md — обновлён прогресс
  • README.md — добавлена ссылка на TESTING_ROADMAP
  • REFACTORING_ROADMAP.md — добавлено предусловие о тестах

Статус: Готов к продолжению! 🚀 Следующий шаг: Запустить тесты и убедиться что всё компилируется, затем продолжить с Фазы 1.2