nblm_core/models/responses/
list.rs

1use serde::{Deserialize, Serialize};
2
3use crate::models::notebook::Notebook;
4
5/// Response from list recently viewed notebooks API.
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7#[serde(rename_all = "camelCase")]
8pub struct ListRecentlyViewedResponse {
9    #[serde(default)]
10    pub notebooks: Vec<Notebook>,
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16
17    #[test]
18    fn list_recently_viewed_response_deserializes_correctly() {
19        let json = r#"{
20            "notebooks": [
21                {"title": "Notebook 1", "name": "notebooks/123"},
22                {"title": "Notebook 2", "name": "notebooks/456"}
23            ]
24        }"#;
25        let response: ListRecentlyViewedResponse = serde_json::from_str(json).unwrap();
26        assert_eq!(response.notebooks.len(), 2);
27        assert_eq!(response.notebooks[0].title, "Notebook 1");
28        assert_eq!(response.notebooks[1].title, "Notebook 2");
29    }
30
31    #[test]
32    fn list_recently_viewed_response_deserializes_empty() {
33        let json = r#"{}"#;
34        let response: ListRecentlyViewedResponse = serde_json::from_str(json).unwrap();
35        assert_eq!(response.notebooks.len(), 0);
36    }
37
38    #[test]
39    fn list_recently_viewed_response_serializes_correctly() {
40        let response = ListRecentlyViewedResponse {
41            notebooks: vec![Notebook {
42                name: Some("notebooks/123".to_string()),
43                title: "Test Notebook".to_string(),
44                ..Default::default()
45            }],
46        };
47        let json = serde_json::to_string(&response).unwrap();
48        assert!(json.contains("notebooks"));
49        assert!(json.contains("Test Notebook"));
50    }
51}