diff --git a/REFACTORING_ROADMAP.md b/REFACTORING_ROADMAP.md index b59dce4..de95c85 100644 --- a/REFACTORING_ROADMAP.md +++ b/REFACTORING_ROADMAP.md @@ -506,51 +506,44 @@ if config.hotkeys.matches(KeyCode::Up, "up") { ## Приоритет 4: Качество кода -### 11. Добавить юнит-тесты +### 11. Добавить юнит-тесты ✅ ЗАВЕРШЕНО! -**Проблема**: Нет тестов, сложно убедиться в корректности. +**Статус**: ЗАВЕРШЕНО 100% (+106 строк тестов, 2026-02-01) -**Решение**: Добавить тесты для: +**Что сделано**: +- ✅ Добавлены 9 unit тестов в `src/utils.rs` (в секции `#[cfg(test)]`) +- ✅ Покрыты все edge cases для форматирования времени +- ✅ Тестирование приватных функций через публичный API +- ✅ Все 54 unit теста проходят (было 45, +9 новых) +**Добавленные тесты**: +- `format_timestamp_with_tz` - положительный offset (+03:00) +- `format_timestamp_with_tz` - отрицательный offset (-05:00) +- `format_timestamp_with_tz` - нулевой offset (UTC) +- `format_timestamp_with_tz` - переход через полночь +- `format_timestamp_with_tz` - невалидный timezone (fallback) +- `get_day` - расчет дня из timestamp +- `get_day_grouping` - группировка сообщений по дням +- `format_datetime` - полная дата и время с MSK +- `parse_timezone_offset` - через публичный API (приватная функция) + +**Примеры**: ```rust -// tests/utils_test.rs -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_format_timestamp_with_tz() { - let timestamp = 1640000000; // 2021-12-20 09:33:20 UTC - assert_eq!( - format_timestamp_with_tz(timestamp, "+03:00"), - "12:33" - ); - } - - #[test] - fn test_parse_timezone_offset() { - assert_eq!(parse_timezone_offset("+03:00"), 3); - assert_eq!(parse_timezone_offset("-05:00"), -5); - assert_eq!(parse_timezone_offset("invalid"), 3); // fallback - } +#[test] +fn test_format_timestamp_with_tz_positive_offset() { + let timestamp = 1640000000; // 2021-12-20 11:33:20 UTC + assert_eq!(format_timestamp_with_tz(timestamp, "+03:00"), "14:33"); } -// tests/config_test.rs #[test] -fn test_parse_color() { - let config = Config::default(); - assert_eq!(config.parse_color("red"), Color::Red); - assert_eq!(config.parse_color("invalid"), Color::White); // fallback -} - -// tests/grouping_test.rs -#[test] -fn test_message_grouping_by_date() { - // ... +fn test_get_day_grouping() { + let msg1 = 1640000000; // 2021-12-20 09:33:20 + let msg2 = 1640040000; // 2021-12-20 20:40:00 + assert_eq!(get_day(msg1), get_day(msg2)); // Один день } ``` -**Запуск**: `cargo test` +**Запуск**: `cargo test --lib utils::tests` --- @@ -596,11 +589,26 @@ pub struct AuthManager { ... } --- -### 13. Config валидация +### 13. Config валидация ✅ ЗАВЕРШЕНО! -**Проблема**: Невалидные значения в конфиге молча игнорируются. +**Статус**: ЗАВЕРШЕНО 100% (+149 строк тестов, 2026-02-01) -**Решение**: Добавить валидацию: +**Что сделано**: +- ✅ Валидация уже была реализована в `config.rs:344-389` +- ✅ Вызов валидации в `Config::load():450-456` +- ✅ Добавлено 15 comprehensive тестов для полного покрытия +- ✅ Все 23 config теста проходят (8 существующих + 15 новых) + +**Добавленные тесты**: +- Валидация дефолтного конфига +- Timezone: валидный (+03:00, -05:00), невалидный (без знака) +- Цвета: все 18 стандартных ratatui цветов +- Невалидные цвета (rainbow, purple, pink) +- Case-insensitive парсинг (RED, Green, YELLOW) +- parse_color() для всех вариантов (standard, light, gray/grey) +- Fallback к White для невалидных цветов + +**Реализация**: Уже была добавлена ранее: ```rust impl Config { pub fn validate(&self) -> Result<(), TeletuiError> { @@ -732,11 +740,13 @@ tracing-subscriber = "0.3" - [x] P3.8 — Formatting модуль ✅ - [x] P3.9 — Message Grouping ✅ - [x] P3.10 — Hotkey Mapping ✅ -- [ ] Priority 4: 1/4 задач ✅ +- [ ] Priority 4: 3/4 задач ✅ + - [x] P4.11 — Unit tests ✅ - [x] P4.12 — Rustdoc ✅ + - [x] P4.13 — Config validation ✅ - [ ] Priority 5: 0/3 задач -**Всего**: 13/17 задач (76%) +**Всего**: 15/17 задач (88%) ---