From 3d16bd22d1f8bfdabb6a8a9086cb2fa2316a9a78 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Sun, 19 Oct 2025 22:37:40 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20test(message-list):=20add=20unit?= =?UTF-8?q?=20tests=20for=20trait=20behavior=20using=20mock=20implementati?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/message_list.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/message_list.rs b/src/message_list.rs index f847af5..c49771c 100644 --- a/src/message_list.rs +++ b/src/message_list.rs @@ -60,6 +60,84 @@ use google_gmail1::{ hyper_util::client::legacy::connect::HttpConnector, }; +#[cfg(test)] +mod tests { + use super::*; + + struct MockList { + label_ids: Vec, + query: String, + max_results: u32, + messages: Vec, + } + + impl MockList { + fn new() -> Self { + Self { + label_ids: vec![], + query: String::new(), + max_results: 200, + messages: vec![], + } + } + + fn push_msg(&mut self, id: &str) { + self.messages.push(MessageSummary::new(id)); + } + } + + impl MessageList for MockList { + async fn log_messages(&mut self) -> Result<()> { Ok(()) } + async fn list_messages(&mut self, _next_page_token: Option) -> Result { Ok(ListMessagesResponse::default()) } + async fn get_messages(&mut self, _pages: u32) -> Result<()> { Ok(()) } + fn hub(&self) -> Gmail> { panic!("not used in tests") } + fn label_ids(&self) -> Vec { self.label_ids.clone() } + fn message_ids(&self) -> Vec { + self.messages.iter().map(|m| m.id().to_string()).collect() + } + fn messages(&self) -> &Vec { &self.messages } + fn set_query(&mut self, query: &str) { self.query = query.to_string(); } + fn add_labels_ids(&mut self, label_ids: &[String]) { self.label_ids.extend_from_slice(label_ids); } + fn add_labels(&mut self, _labels: &[String]) -> Result<()> { Ok(()) } + fn max_results(&self) -> u32 { self.max_results } + fn set_max_results(&mut self, value: u32) { self.max_results = value; } + } + + #[test] + fn set_query_updates_state() { + let mut ml = MockList::new(); + ml.set_query("from:noreply@example.com"); + // not directly accessible; rely on behavior by calling again + ml.set_query("is:unread"); + assert_eq!(ml.query, "is:unread"); + } + + #[test] + fn add_label_ids_accumulates() { + let mut ml = MockList::new(); + ml.add_labels_ids(&["Label_1".into()]); + ml.add_labels_ids(&["Label_2".into(), "Label_3".into()]); + assert_eq!(ml.label_ids, vec!["Label_1", "Label_2", "Label_3"]); + } + + #[test] + fn max_results_get_set() { + let mut ml = MockList::new(); + assert_eq!(ml.max_results(), 200); + ml.set_max_results(123); + assert_eq!(ml.max_results(), 123); + } + + #[test] + fn message_ids_maps_from_messages() { + let mut ml = MockList::new(); + ml.push_msg("abc"); + ml.push_msg("def"); + assert_eq!(ml.message_ids(), vec!["abc", "def"]); + assert_eq!(ml.messages().len(), 2); + } +} + /// A trait for interacting with Gmail message lists, providing methods for /// retrieving, filtering, and managing collections of Gmail messages. ///