diff --git a/src/utils.rs b/src/utils.rs index 42816fb..a1bbf8b 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -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"); + } +}