1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct TokenResponse {
8 pub access_token: String,
9 pub token_type: String,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub expires_in: Option<u64>,
12 #[serde(skip_serializing_if = "Option::is_none")]
14 pub c_nonce: Option<String>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub c_nonce_expires_in: Option<u64>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct NonceResponse {
22 pub c_nonce: String,
23}
24
25#[cfg(test)]
26mod tests {
27 use super::*;
28
29 #[test]
30 fn token_response_full_roundtrip() {
31 let resp = TokenResponse {
32 access_token: "tok".to_string(),
33 token_type: "Bearer".to_string(),
34 expires_in: Some(3600),
35 c_nonce: Some("nonce".to_string()),
36 c_nonce_expires_in: Some(300),
37 };
38 let json = serde_json::to_string(&resp).unwrap();
39 let parsed: TokenResponse = serde_json::from_str(&json).unwrap();
40 assert_eq!(parsed.access_token, "tok");
41 assert_eq!(parsed.c_nonce.as_deref(), Some("nonce"));
42 }
43
44 #[test]
45 fn token_response_minimal() {
46 let json = r#"{"access_token":"a","token_type":"Bearer"}"#;
47 let resp: TokenResponse = serde_json::from_str(json).unwrap();
48 assert!(resp.expires_in.is_none());
49 assert!(resp.c_nonce.is_none());
50 }
51
52 #[test]
53 fn nonce_response_roundtrip() {
54 let resp = NonceResponse {
55 c_nonce: "abc123".to_string(),
56 };
57 let json = serde_json::to_string(&resp).unwrap();
58 let parsed: NonceResponse = serde_json::from_str(&json).unwrap();
59 assert_eq!(parsed.c_nonce, "abc123");
60 }
61}