Files
telegram-tui/TESTING_PROGRESS.md
Mikhail Kilin 126c7482af
Some checks failed
CI / Check (pull_request) Has been cancelled
CI / Format (pull_request) Has been cancelled
CI / Clippy (pull_request) Has been cancelled
CI / Build (macos-latest) (pull_request) Has been cancelled
CI / Build (ubuntu-latest) (pull_request) Has been cancelled
CI / Build (windows-latest) (pull_request) Has been cancelled
fixes
2026-01-29 01:22:57 +03:00

18 KiB
Raw Blame History

Testing Progress Report

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

Все UI snapshot тесты готовы. Можно переходить к integration тестам.

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


Что сделано

Фаза 1.4: Input Field Snapshot Tests (100%)

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

Snapshot тесты для поля ввода:

  • snapshot_empty_input — пустое поле ввода с плейсхолдером
  • snapshot_input_with_text — поле с текстом и курсором █
  • snapshot_input_long_text_2_lines — длинный текст на 2 строки
  • snapshot_input_long_text_max_lines — очень длинный текст (максимум 10 строк)
  • snapshot_input_editing_mode — режим редактирования с превью оригинального сообщения
  • snapshot_input_reply_mode — режим ответа с превью сообщения
  • snapshot_input_search_mode — поле поиска с query

Результаты:

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

Фаза 1.6: Screens Snapshot Tests (100%)

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

Snapshot тесты для полных экранов:

  • snapshot_loading_screen_default — экран загрузки (дефолтный)
  • snapshot_loading_screen_with_status — экран загрузки со статусом
  • snapshot_auth_screen_phone — экран авторизации (ввод телефона)
  • snapshot_auth_screen_code — экран авторизации (ввод кода)
  • snapshot_auth_screen_password — экран авторизации (ввод пароля 2FA)
  • snapshot_main_screen_empty — главный экран (пустой список чатов)
  • snapshot_main_screen_terminal_too_small — предупреждение о маленьком терминале

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

  • Добавлен метод status_message(message) — установить статус для loading screen
  • Добавлен метод auth_state(state) — установить состояние авторизации
  • Добавлен метод phone_input(phone) — установить phone input
  • Добавлен метод code_input(code) — установить code input
  • Добавлен метод password_input(password) — установить password input
  • Добавлены поля: status_message, auth_state, phone_input, code_input, password_input
  • Обновлен build() — применяет auth состояние и inputs

Результаты:

  • 7 новых snapshot тестов — все проходят
  • 7 snapshots приняты через cargo insta accept
  • Все тесты проходят: 127 тестов (21 chat_list + 19 input_field + 30 messages + 20 modals + 18 footer + 19 screens)

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

Snapshot тесты для нижней панели:

  • snapshot_footer_chat_list — footer в списке чатов
  • snapshot_footer_open_chat — footer в открытом чате
  • snapshot_footer_network_waiting — footer с "⚠ Нет сети"
  • snapshot_footer_network_connecting_proxy — footer с " Прокси..."
  • snapshot_footer_network_connecting — footer с " Подключение..."
  • snapshot_footer_search_mode — footer в режиме поиска

Изменения:

  • Сделан footer модуль публичным в src/ui/mod.rs

Результаты:

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

Фаза 1.4: Input Field 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

📊 Метрики

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

  • 5 helpers
  • 7 test files (chat_list.rs, messages.rs, modals.rs, input_field.rs, footer.rs, screens.rs)
  • 1 mod.rs

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

  • test_data.rs: ~250 строк
  • fake_tdclient.rs: ~300 строк
  • snapshot_utils.rs: ~100 строк
  • app_builder.rs: ~320 строк
  • chat_list.rs: ~150 строк
  • messages.rs: ~430 строк
  • modals.rs: ~220 строк
  • input_field.rs: ~150 строк
  • footer.rs: ~120 строк
  • screens.rs: ~130 строк

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

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

Покрытие:

  • Фаза 0: 8/8 (100%)
  • Фаза 1.1: 9/10 (90%)
  • Фаза 1.2: 18/18 (100%)
  • Фаза 1.3: 8/8 (100%)
  • Фаза 1.4: 7/7 (100%)
  • Фаза 1.5: 6/6 (100%)
  • Фаза 1.6: 7/7 (100%)
  • Общий прогресс: 55/151 (36%)

🏗️ Структура

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);

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

Фаза 2: Integration Tests для логики (Приоритет: ВЫСОКИЙ)

Все UI snapshot тесты завершены! Теперь можно переходить к интеграционным тестам:

2.1 Send Message Flow (6 тестов)

  • Отправка текстового сообщения
  • Отправка сообщения обновляет UI
  • Отправка пустого сообщения игнорируется
  • Отправка с markdown форматированием
  • Счётчик непрочитанных обнуляется при открытии чата
  • Новое сообщение появляется в реальном времени

2.2 Edit Message Flow (6 тестов)

  • ↑ при пустом инпуте активирует режим выбора
  • Enter в режиме выбора начинает редактирование
  • Изменение текста и Enter сохраняет
  • Esc отменяет редактирование
  • Редактирование только своих сообщений
  • Индикатор ✎ появляется после редактирования

2.3 Delete Message Flow (6 тестов)

  • d в режиме выбора открывает модалку
  • y в модалке удаляет сообщение
  • n в модалке отменяет удаление
  • Esc отменяет удаление
  • Сообщение исчезает из списка после удаления
  • Удаление только своих сообщений

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

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

  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