use chrono::{DateTime, Utc};
pub fn utc_now() -> DateTime<Utc> {
Utc::now()
}
pub trait Timestamped {
fn set_created_at(&mut self);
fn set_updated_at(&mut self);
fn set_timestamps(&mut self) {
self.set_created_at();
self.set_updated_at();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_utc_now() {
let now = utc_now();
assert!(now.timestamp() > 1_700_000_000);
}
struct MockModel {
created: bool,
updated: bool,
}
impl Timestamped for MockModel {
fn set_created_at(&mut self) {
self.created = true;
}
fn set_updated_at(&mut self) {
self.updated = true;
}
}
#[test]
fn test_set_timestamps() {
let mut model = MockModel {
created: false,
updated: false,
};
model.set_timestamps();
assert!(model.created);
assert!(model.updated);
}
#[test]
fn test_set_created_at_only() {
let mut model = MockModel {
created: false,
updated: false,
};
model.set_created_at();
assert!(model.created);
assert!(!model.updated);
}
#[test]
fn test_set_updated_at_only() {
let mut model = MockModel {
created: false,
updated: false,
};
model.set_updated_at();
assert!(!model.created);
assert!(model.updated);
}
}