pubnub/dx/presence/event_engine/effects/
leave.rs1use log::info;
7
8use crate::{
9 lib::alloc::{sync::Arc, vec, vec::Vec},
10 presence::event_engine::{
11 effects::LeaveEffectExecutor, PresenceEvent, PresenceInput, PresenceParameters,
12 },
13};
14
15#[allow(clippy::too_many_arguments, dead_code)]
16pub(super) async fn execute(
17 input: &PresenceInput,
18 executor: &Arc<LeaveEffectExecutor>,
19) -> Vec<PresenceEvent> {
20 let channel_groups = input.channel_groups();
21 let channels = input.channels();
22
23 info!(
24 "Leave\nchannels: {:?}\nchannel groups: {:?}",
25 channels, channel_groups
26 );
27
28 let _ = executor(PresenceParameters {
29 channels: &channels,
30 channel_groups: &channel_groups,
31 })
32 .await;
33
34 vec![]
35}
36
37#[cfg(test)]
38mod it_should {
39 use futures::FutureExt;
40
41 use super::*;
42 use crate::{
43 core::{PubNubError, TransportResponse},
44 presence::LeaveResult,
45 };
46
47 #[tokio::test]
48 async fn return_leave_success_event() {
49 let mocked_leave_function: Arc<LeaveEffectExecutor> = Arc::new(move |parameters| {
50 assert_eq!(parameters.channel_groups, &Some(vec!["cg2".to_string()]));
51 assert_eq!(parameters.channels, &Some(vec!["ch2".to_string()]));
52
53 async move { Ok(LeaveResult) }.boxed()
54 });
55
56 let result = execute(
57 &PresenceInput::new(
58 &Some(vec!["ch2".to_string()]),
59 &Some(vec!["cg2".to_string()]),
60 ),
61 &mocked_leave_function,
62 )
63 .await;
64
65 assert!(result.is_empty());
66 }
67
68 #[tokio::test]
69 async fn return_leave_failed_event_on_error() {
70 let mocked_leave_function: Arc<LeaveEffectExecutor> = Arc::new(move |_| {
71 async move {
72 Err(PubNubError::Transport {
73 details: "test".into(),
74 response: Some(Box::new(TransportResponse {
75 status: 500,
76 ..Default::default()
77 })),
78 })
79 }
80 .boxed()
81 });
82
83 let result = execute(
84 &PresenceInput::new(
85 &Some(vec!["ch3".to_string()]),
86 &Some(vec!["cg3".to_string()]),
87 ),
88 &mocked_leave_function,
89 )
90 .await;
91
92 assert!(result.is_empty());
93 }
94}