nblm_core/models/responses/
audio.rs1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub(crate) struct AudioOverviewApiResponse {
9 pub audio_overview: AudioOverviewResponse,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, Default)]
13#[serde(rename_all = "camelCase")]
14pub struct AudioOverviewResponse {
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub audio_overview_id: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub name: Option<String>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub status: Option<String>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub generation_options: Option<serde_json::Value>,
23 #[serde(flatten)]
24 pub extra: HashMap<String, serde_json::Value>,
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30
31 #[test]
32 fn audio_overview_response_deserializes_correctly() {
33 let json = r#"{
34 "audioOverviewId": "c825b865-ad95-42d7-8abb-fb4ed46f4cc9",
35 "name": "projects/224840249322/locations/global/notebooks/123/audioOverviews/456",
36 "status": "AUDIO_OVERVIEW_STATUS_IN_PROGRESS"
37 }"#;
38 let response: AudioOverviewResponse = serde_json::from_str(json).unwrap();
39 assert_eq!(
40 response.audio_overview_id.as_ref().unwrap(),
41 "c825b865-ad95-42d7-8abb-fb4ed46f4cc9"
42 );
43 assert_eq!(
44 response.name.as_ref().unwrap(),
45 "projects/224840249322/locations/global/notebooks/123/audioOverviews/456"
46 );
47 assert_eq!(
48 response.status.as_ref().unwrap(),
49 "AUDIO_OVERVIEW_STATUS_IN_PROGRESS"
50 );
51 }
52
53 #[test]
54 fn audio_overview_response_skips_none_fields_on_serialize() {
55 let response = AudioOverviewResponse {
56 audio_overview_id: Some("test-id".to_string()),
57 name: Some("notebooks/123/audioOverviews/456".to_string()),
58 status: None,
59 generation_options: None,
60 extra: HashMap::new(),
61 };
62 let json = serde_json::to_string(&response).unwrap();
63 assert!(json.contains("audioOverviewId"));
64 assert!(json.contains("name"));
65 assert!(!json.contains("status"));
66 assert!(!json.contains("generationOptions"));
67 }
68
69 #[test]
70 fn audio_overview_response_with_extra_fields() {
71 let json = r#"{
72 "audioOverviewId": "test-id",
73 "name": "notebooks/123/audioOverviews/456",
74 "status": "AUDIO_OVERVIEW_STATUS_IN_PROGRESS",
75 "generationOptions": {},
76 "customField": "value"
77 }"#;
78 let response: AudioOverviewResponse = serde_json::from_str(json).unwrap();
79 assert_eq!(
80 response.name.as_ref().unwrap(),
81 "notebooks/123/audioOverviews/456"
82 );
83 assert_eq!(
84 response.status.as_ref().unwrap(),
85 "AUDIO_OVERVIEW_STATUS_IN_PROGRESS"
86 );
87 assert_eq!(
88 response.extra.get("customField").unwrap().as_str().unwrap(),
89 "value"
90 );
91 }
92
93 #[test]
94 fn audio_overview_api_response_deserializes_correctly() {
95 let json = r#"{
96 "audioOverview": {
97 "audioOverviewId": "c825b865-ad95-42d7-8abb-fb4ed46f4cc9",
98 "name": "projects/224840249322/locations/global/notebooks/123/audioOverviews/456",
99 "status": "AUDIO_OVERVIEW_STATUS_IN_PROGRESS",
100 "generationOptions": {}
101 }
102 }"#;
103 let api_response: AudioOverviewApiResponse = serde_json::from_str(json).unwrap();
104 let response = api_response.audio_overview;
105 assert_eq!(
106 response.audio_overview_id.as_ref().unwrap(),
107 "c825b865-ad95-42d7-8abb-fb4ed46f4cc9"
108 );
109 assert_eq!(
110 response.name.as_ref().unwrap(),
111 "projects/224840249322/locations/global/notebooks/123/audioOverviews/456"
112 );
113 assert_eq!(
114 response.status.as_ref().unwrap(),
115 "AUDIO_OVERVIEW_STATUS_IN_PROGRESS"
116 );
117 }
118}