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