1use chrono::{DateTime, Local};
2
3#[cfg(not(test))]
4pub fn now() -> DateTime<Local> {
5 chrono::Local::now()
6}
7
8#[cfg(test)]
9pub use mock_time::now;
10
11#[cfg(test)]
12pub mod mock_time {
13 use super::*;
14 use std::cell::RefCell;
15
16 thread_local! {
17 static MOCK_TIME: RefCell<Option<DateTime<Local>>> = const {RefCell::new(None)};
18 }
19
20 pub fn now() -> DateTime<Local> {
21 MOCK_TIME.with(|cell| {
22 cell.borrow()
23 .as_ref()
24 .cloned()
25 .unwrap_or_else(chrono::Local::now)
26 })
27 }
28
29 pub fn set_mock_time(time: DateTime<Local>) {
30 MOCK_TIME.with(|cell| *cell.borrow_mut() = Some(time));
31 }
32}