pubnub/dx/presence/event_engine/effects/
leave.rs

1//! Presence leave module.
2//!
3//! Module contains implementation of `Leave` effect which is used to announce
4//! `user_id` `leave` from specified channels and groups.
5
6use 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}