nblm_core/models/responses/
audio.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5/// Wrapper for the API response that contains audioOverview
6#[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}