Skip to main content

rust_ynab/ynab/
user.rs

1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3
4use crate::ynab::client::Client;
5use crate::ynab::common::NO_PARAMS;
6use crate::ynab::errors::Error;
7
8#[derive(Debug, Deserialize)]
9struct UserDataEnvelope {
10    data: UserData,
11}
12
13#[derive(Debug, Deserialize)]
14struct UserData {
15    user: User,
16}
17
18/// The authenticated YNAB user.
19#[derive(Debug, Serialize, Deserialize)]
20pub struct User {
21    pub id: Uuid,
22}
23
24impl Client {
25    /// Returns authenticated user information.
26    pub async fn get_user(&self) -> Result<User, Error> {
27        let result: UserDataEnvelope = self.get("user", NO_PARAMS).await?;
28        Ok(result.data.user)
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35    use crate::ynab::testutil::{TEST_ID_3, error_body, new_test_client, user_fixture};
36    use wiremock::matchers::{method, path};
37    use wiremock::{Mock, ResponseTemplate};
38
39    fn user_single_fixture() -> serde_json::Value {
40        serde_json::json!({
41            "data": { "user": user_fixture() }
42        })
43    }
44    #[tokio::test]
45    async fn get_user_returns_id() {
46        let (client, server) = new_test_client().await;
47
48        Mock::given(method("GET"))
49            .and(path("/user"))
50            .respond_with(
51                ResponseTemplate::new(200).set_body_json(serde_json::json!(user_single_fixture())),
52            )
53            .expect(1)
54            .mount(&server)
55            .await;
56
57        let user = client.get_user().await.unwrap();
58        assert_eq!(user.id.to_string(), TEST_ID_3);
59    }
60
61    #[tokio::test]
62    async fn get_user_returns_unauthorized() {
63        let (client, server) = new_test_client().await;
64
65        Mock::given(method("GET"))
66            .and(path("/user"))
67            .respond_with(ResponseTemplate::new(401).set_body_json(error_body(
68                "401",
69                "unauthorized",
70                "Unauthorized",
71            )))
72            .mount(&server)
73            .await;
74
75        let err = client.get_user().await.unwrap_err();
76        assert!(matches!(err, Error::Unauthorized(_)));
77    }
78}