mangadex_api/v5/api_client/id/secret/
get.rs1use derive_builder::Builder;
28use serde::Serialize;
29use uuid::Uuid;
30
31use crate::HttpClientRef;
32use mangadex_api_schema::v5::ApiClientSecretResponse;
33
34#[cfg_attr(
35 feature = "deserializable-endpoint",
36 derive(serde::Deserialize, getset::Getters, getset::Setters)
37)]
38#[derive(Debug, Serialize, Clone, Builder)]
39#[serde(rename_all = "camelCase")]
40#[builder(
41 setter(into, strip_option),
42 build_fn(error = "mangadex_api_types::error::BuilderError")
43)]
44pub struct GetClientSecret {
45 #[doc(hidden)]
47 #[serde(skip)]
48 #[builder(pattern = "immutable")]
49 #[cfg_attr(feature = "deserializable-endpoint", getset(set = "pub", get = "pub"))]
50 pub http_client: HttpClientRef,
51
52 #[serde(skip_serializing)]
53 pub client_id: Uuid,
54}
55
56endpoint! {
57 GET ("/client/{}/secret", client_id),
58 #[query auth] GetClientSecret,
59 #[flatten_result] ApiClientSecretResponse,
60 GetClientSecretBuilder
61}
62
63#[cfg(test)]
64mod tests {
65 use std::collections::hash_map::DefaultHasher;
66 use std::hash::{Hash, Hasher};
67
68 use serde_json::json;
69 use url::Url;
70 use uuid::Uuid;
71 use wiremock::matchers::{header, method, path_regex};
72 use wiremock::{Mock, MockServer, ResponseTemplate};
73
74 use crate::{HttpClient, MangaDexClient};
75 use mangadex_api_schema::v5::AuthTokens;
76 #[tokio::test]
77 async fn get_client_fires_a_request_to_base_url() -> anyhow::Result<()> {
78 let mock_server = MockServer::start().await;
79 let http_client = HttpClient::builder()
80 .base_url(Url::parse(&mock_server.uri())?)
81 .auth_tokens(AuthTokens {
82 session: "myToken".to_string(),
83 refresh: "myRefreshToken".to_string(),
84 })
85 .build()?;
86 let mangadex_client = MangaDexClient::new_with_http_client(http_client);
87
88 let client_id = Uuid::new_v4();
89 let data = {
90 let mut default_hasher = DefaultHasher::new();
91 client_id.hash(&mut default_hasher);
92 default_hasher.finish()
93 }
94 .to_string();
95 let response_body = json!({
96 "result": "ok",
97 "data": data
98 });
99
100 Mock::given(method("GET"))
101 .and(path_regex(r"/client/[0-9a-fA-F-]+/secret"))
102 .and(header("Authorization", "Bearer myToken"))
103 .respond_with(ResponseTemplate::new(200).set_body_json(response_body))
104 .expect(1)
105 .mount(&mock_server)
106 .await;
107
108 let res = mangadex_client
109 .client()
110 .id(client_id)
111 .secret()
112 .get()
113 .send()
114 .await?;
115
116 assert_eq!(res.data, data.clone());
117 Ok(())
118 }
119}