summaryrefslogtreecommitdiff
path: root/src/test/webpush.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/webpush.rs')
-rw-r--r--src/test/webpush.rs55
1 files changed, 43 insertions, 12 deletions
diff --git a/src/test/webpush.rs b/src/test/webpush.rs
index a611ad0..f33f03c 100644
--- a/src/test/webpush.rs
+++ b/src/test/webpush.rs
@@ -1,13 +1,16 @@
use std::{
+ any::Any,
mem,
sync::{Arc, Mutex},
};
-use web_push::{WebPushClient, WebPushError, WebPushMessage};
+use web_push::{PartialVapidSignatureBuilder, SubscriptionInfo, WebPushError};
+
+use crate::{error::failed::Failed, push::Publish};
#[derive(Clone)]
pub struct Client {
- sent: Arc<Mutex<Vec<WebPushMessage>>>,
+ sent: Arc<Mutex<Vec<Publication>>>,
}
impl Client {
@@ -18,20 +21,48 @@ impl Client {
}
// Clears the list of sent messages (for all clones of this Client) when called, because we
- // can't clone `WebPushMessage`s so we either need to move them or try to reconstruct them,
- // either of which sucks but moving them sucks less.
- pub fn sent(&self) -> Vec<WebPushMessage> {
+ // can't clone `Publications`s, so we either need to move them or try to reconstruct them.
+ pub fn sent(&self) -> Vec<Publication> {
let mut sent = self.sent.lock().unwrap();
- mem::take(&mut *sent)
+ mem::take(&mut sent)
}
}
-#[async_trait::async_trait]
-impl WebPushClient for Client {
- async fn send(&self, message: WebPushMessage) -> Result<(), WebPushError> {
- let mut sent = self.sent.lock().unwrap();
- sent.push(message);
+impl Publish for Client {
+ async fn publish<M>(
+ &self,
+ message: M,
+ _: PartialVapidSignatureBuilder,
+ subscriptions: impl IntoIterator<Item = SubscriptionInfo> + Send,
+ ) -> Result<Vec<(SubscriptionInfo, WebPushError)>, Failed>
+ where
+ M: Send + 'static,
+ {
+ let message: Box<dyn Any + Send> = Box::new(message);
+ let subscriptions = subscriptions.into_iter().collect();
+ let publication = Publication {
+ message,
+ subscriptions,
+ };
+ self.sent.lock().unwrap().push(publication);
+
+ Ok(Vec::new())
+ }
+}
+
+pub struct Publication {
+ pub message: Box<dyn Any + Send>,
+ pub subscriptions: Vec<SubscriptionInfo>,
+}
- Ok(())
+impl Publication {
+ pub fn message_eq<M>(&self, candidate: &M) -> bool
+ where
+ M: PartialEq + 'static,
+ {
+ match self.message.downcast_ref::<M>() {
+ None => false,
+ Some(message) => message == candidate,
+ }
}
}