Skip to main content

bitwarden_emergency_access/
initiate.rs

1use bitwarden_core::ApiError;
2use bitwarden_error::bitwarden_error;
3use thiserror::Error;
4
5use crate::{EmergencyAccessClient, EmergencyAccessId};
6
7/// Errors returned when requesting emergency access.
8#[bitwarden_error(flat)]
9#[derive(Debug, Error)]
10pub enum EmergencyAccessInitiateError {
11    /// The request to the server failed.
12    #[error(transparent)]
13    Api(#[from] ApiError),
14}
15
16#[bitwarden_ffi::wasm_export]
17impl EmergencyAccessClient {
18    /// Requests access to the grantor's account. Access is granted once the grantor approves or
19    /// the wait time passes.
20    ///
21    /// Called by the grantee.
22    pub async fn initiate(
23        &self,
24        emergency_access_id: EmergencyAccessId,
25    ) -> Result<(), EmergencyAccessInitiateError> {
26        self.api_configurations
27            .api_client
28            .emergency_access_api()
29            .initiate(emergency_access_id.into())
30            .await?;
31
32        Ok(())
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use bitwarden_core::client::test_accounts::test_bitwarden_com_account_v2;
39
40    use super::*;
41    use crate::{
42        EmergencyAccessClientExt,
43        test_support::{api_error, is_test_id, test_client, test_id},
44    };
45
46    #[tokio::test]
47    async fn initiates() {
48        let client = test_client(test_bitwarden_com_account_v2(), |mock| {
49            mock.emergency_access_api
50                .expect_initiate()
51                .withf(is_test_id)
52                .returning(|_| Ok(()))
53                .once();
54        })
55        .await;
56
57        client.emergency_access().initiate(test_id()).await.unwrap();
58    }
59
60    #[tokio::test]
61    async fn fails_when_request_fails() {
62        let client = test_client(test_bitwarden_com_account_v2(), |mock| {
63            mock.emergency_access_api
64                .expect_initiate()
65                .returning(|_| api_error())
66                .once();
67        })
68        .await;
69
70        let result = client.emergency_access().initiate(test_id()).await;
71
72        assert!(matches!(result, Err(EmergencyAccessInitiateError::Api(_))));
73    }
74}