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#[derive(Debug, Serialize, Deserialize)]
20pub struct User {
21 pub id: Uuid,
22}
23
24impl Client {
25 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}