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:
106
src/utils.rs
106
src/utils.rs
@@ -158,3 +158,109 @@ pub fn format_was_online(timestamp: i32) -> String {
|
|||||||
format!("был(а) {}", datetime)
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user