use chrono::{DateTime, Utc}; use uuid::Uuid; use crate::types::LibraryResponseDto; #[derive(Debug, Clone)] pub struct Library { pub id: Uuid, pub name: String, pub asset_count: i64, pub updated_at: DateTime, pub refreshed_at: Option>, } impl From for Library { fn from(value: LibraryResponseDto) -> Self { Self { id: Uuid::parse_str(&value.id).expect("Unable to parse a library's UUID"), name: value.name, asset_count: value.asset_count, updated_at: value.updated_at, refreshed_at: value.refreshed_at, } } } #[cfg(test)] mod tests { use std::str::FromStr; use super::*; #[test] fn from_library_response_dto_success() { let dto = LibraryResponseDto { id: String::from("123e4567-e89b-12d3-a456-426655440000"), name: String::from("Christmas photos"), asset_count: 1246, exclusion_patterns: vec![], import_paths: vec![], owner_id: String::from("abc123"), updated_at: DateTime::::from_str("2024-11-17T12:55:12Z").unwrap(), created_at: DateTime::::from_str("2023-10-17T12:55:12Z").unwrap(), refreshed_at: Some(DateTime::::from_str("2024-11-17T12:53:12Z").unwrap()), }; let library = Library::from(dto); assert_eq!( library.id, Uuid::parse_str("123e4567-e89b-12d3-a456-426655440000").unwrap() ); assert_eq!(library.name, "Christmas photos".to_string()); assert_eq!(library.asset_count, 1246); assert_eq!( library.updated_at, DateTime::::from_str("2024-11-17T12:55:12Z").unwrap() ); assert_eq!( library.refreshed_at, Some(DateTime::::from_str("2024-11-17T12:53:12Z").unwrap()) ); } #[test] #[should_panic] fn from_library_response_dto_invalid_uuid_panics() { let dto = LibraryResponseDto { id: String::from("invalid_uuid"), name: String::from("Christmas photos"), asset_count: 1246, exclusion_patterns: vec![], import_paths: vec![], owner_id: String::from("abc123"), updated_at: DateTime::::from_str("2024-11-17T12:55:12Z").unwrap(), created_at: DateTime::::from_str("2023-10-17T12:55:12Z").unwrap(), refreshed_at: Some(DateTime::::from_str("2024-11-17T12:53:12Z").unwrap()), }; let _ = Library::from(dto); } }