1use crate::CamelError;
8use crate::message::Message;
9
10#[async_trait::async_trait]
27pub trait ClaimCheckRepository: Send + Sync + std::fmt::Debug + 'static {
28 fn name(&self) -> &str;
30
31 async fn set(&self, key: &str, payload: Message) -> Result<(), CamelError>;
33
34 async fn get(&self, key: &str) -> Result<Message, CamelError>;
38
39 async fn get_and_remove(&self, key: &str) -> Result<Message, CamelError>;
43
44 async fn remove(&self, key: &str) -> Result<(), CamelError>;
46
47 async fn push(&self, key: &str, payload: Message) -> Result<(), CamelError>;
49
50 async fn pop(&self, key: &str) -> Result<Message, CamelError>;
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59 use crate::body::Body;
60 use std::sync::Arc;
61
62 #[derive(Debug)]
64 struct StubRepo;
65
66 #[async_trait::async_trait]
67 impl ClaimCheckRepository for StubRepo {
68 fn name(&self) -> &str {
69 "stub"
70 }
71
72 async fn set(&self, _key: &str, _payload: Message) -> Result<(), CamelError> {
73 Ok(())
74 }
75
76 async fn get(&self, _key: &str) -> Result<Message, CamelError> {
77 Ok(Message::new(Body::Empty))
78 }
79
80 async fn get_and_remove(&self, _key: &str) -> Result<Message, CamelError> {
81 Ok(Message::new(Body::Empty))
82 }
83
84 async fn remove(&self, _key: &str) -> Result<(), CamelError> {
85 Ok(())
86 }
87
88 async fn push(&self, _key: &str, _payload: Message) -> Result<(), CamelError> {
89 Ok(())
90 }
91
92 async fn pop(&self, _key: &str) -> Result<Message, CamelError> {
93 Ok(Message::new(Body::Empty))
94 }
95 }
96
97 #[test]
99 fn stub_is_object_safe() {
100 let repo: Arc<dyn ClaimCheckRepository> = Arc::new(StubRepo);
101 assert_eq!(repo.name(), "stub");
102 }
103
104 #[tokio::test]
105 async fn stub_set_and_get() {
106 let repo = StubRepo;
107 repo.set("k", Message::new(Body::Text("v".into())))
108 .await
109 .unwrap();
110 let body = repo.get("k").await.unwrap();
111 assert!(body.body.is_empty());
112 }
113
114 #[tokio::test]
115 async fn stub_get_and_remove() {
116 let repo = StubRepo;
117 let body = repo.get_and_remove("k").await.unwrap();
118 assert!(body.body.is_empty());
119 }
120
121 #[tokio::test]
122 async fn stub_remove_is_ok() {
123 let repo = StubRepo;
124 repo.remove("k").await.unwrap();
125 }
126
127 #[tokio::test]
128 async fn stub_push_pop() {
129 let repo = StubRepo;
130 repo.push("k", Message::new(Body::Text("v".into())))
131 .await
132 .unwrap();
133 let body = repo.pop("k").await.unwrap();
134 assert!(body.body.is_empty());
135 }
136}