test: add unit tests for utils time formatting (P4.11)

Added 9 unit tests for src/utils.rs to cover time/date formatting logic.

**Tests added**:
-  format_timestamp_with_tz with positive offset (+03:00)
-  format_timestamp_with_tz with negative offset (-05:00)
-  format_timestamp_with_tz with zero offset (UTC)
-  format_timestamp_with_tz midnight wrap (23:00 + 2h = 01:00)
-  format_timestamp_with_tz invalid timezone (fallback to +03:00)
-  get_day - extract day from timestamp
-  get_day_grouping - messages on same day
-  format_datetime - full date and time with MSK
-  parse_timezone_offset via public API

**Coverage**:
- format_timestamp_with_tz() - all edge cases
- parse_timezone_offset() - tested indirectly (private fn)
- get_day() - day calculation and grouping
- format_datetime() - partial coverage

**Result**: 54 unit tests pass (was 45, +9 new)

Related: REFACTORING_ROADMAP.md P4.11

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-02-01 01:59:47 +03:00
parent 99b3b368b9
commit 5897f6deaa

View File

@@ -158,3 +158,109 @@ pub fn format_was_online(timestamp: i32) -> String {
format!("был(а) {}", datetime)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_timestamp_with_tz_positive_offset() {
// 2021-12-20 11:33:20 UTC (1640000000)
let timestamp = 1640000000;
// +03:00 должно дать 14:33 (11 + 3)
assert_eq!(format_timestamp_with_tz(timestamp, "+03:00"), "14:33");
}
#[test]
fn test_format_timestamp_with_tz_negative_offset() {
// 2021-12-20 11:33:20 UTC
let timestamp = 1640000000;
// -05:00 должно дать 06:33 (11 - 5)
assert_eq!(format_timestamp_with_tz(timestamp, "-05:00"), "06:33");
}
#[test]
fn test_format_timestamp_with_tz_zero_offset() {
// 2021-12-20 11:33:20 UTC
let timestamp = 1640000000;
// +00:00 должно дать UTC время 11:33
assert_eq!(format_timestamp_with_tz(timestamp, "+00:00"), "11:33");
}
#[test]
fn test_format_timestamp_with_tz_midnight_wrap() {
// Тест перехода через полночь
let timestamp = 82800; // 23:00 UTC (первый день эпохи)
// +02:00 должно дать 01:00 (следующего дня)
assert_eq!(format_timestamp_with_tz(timestamp, "+02:00"), "01:00");
}
#[test]
fn test_format_timestamp_with_tz_invalid_fallback() {
let timestamp = 1640000000; // 11:33:20 UTC
// Невалидный timezone должен использовать fallback +03:00 -> 14:33
assert_eq!(format_timestamp_with_tz(timestamp, "invalid"), "14:33");
}
#[test]
fn test_get_day() {
// Первый день эпохи (1970-01-01)
assert_eq!(get_day(0), 0);
// Второй день (1970-01-02)
assert_eq!(get_day(86400), 1);
// Конкретная дата: 2021-12-20 (18976 дней после эпохи)
assert_eq!(get_day(1640000000), 18981);
}
#[test]
fn test_get_day_grouping() {
// Сообщения в один день должны иметь одинаковый day
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));
// Сообщения в разные дни должны различаться
let msg3 = 1640100000; // 2021-12-21 13:26:40
assert_ne!(get_day(msg1), get_day(msg3));
}
#[test]
fn test_format_datetime() {
// 2021-12-20 11:33:20 UTC -> с MSK (+03:00) = 14:33:20
let timestamp = 1640000000;
let result = format_datetime(timestamp);
// Проверяем что результат содержит время с MSK offset
assert!(result.contains("14:33"), "Expected '14:33' in '{}'", result);
// Проверяем формат (должен быть DD.MM.YYYY HH:MM)
assert_eq!(result.chars().filter(|&c| c == '.').count(), 2);
assert!(result.contains(":"));
}
#[test]
fn test_parse_timezone_offset_via_format() {
// Тестируем parse_timezone_offset через публичную функцию
let base_timestamp = 0; // 00:00:00 UTC
// +03:00
assert_eq!(format_timestamp_with_tz(base_timestamp, "+03:00"), "03:00");
// -05:00
assert_eq!(format_timestamp_with_tz(base_timestamp, "-05:00"), "19:00");
// +12:00
assert_eq!(format_timestamp_with_tz(base_timestamp, "+12:00"), "12:00");
// -11:00
assert_eq!(format_timestamp_with_tz(base_timestamp, "-11:00"), "13:00");
}
}