1
use serde::{Deserialize, Serialize};
2

            
3
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4
pub struct AccountSuggestion {
5
    pub id: String,
6
    pub name: String,
7
    pub currency: Option<String>,
8
}
9

            
10
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11
pub struct CommoditySuggestion {
12
    pub id: String,
13
    pub symbol: String,
14
    pub name: String,
15
}
16

            
17
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18
pub struct TagSuggestion {
19
    pub name: String,
20
    pub value: Option<String>,
21
}
22

            
23
#[cfg(test)]
24
mod tests {
25
    use super::*;
26

            
27
    #[test]
28
1
    fn account_suggestion_serializes_with_correct_field_names() {
29
1
        let suggestion = AccountSuggestion {
30
1
            id: "acc-123".into(),
31
1
            currency: Some("cur-456".into()),
32
1
            name: "Checking".into(),
33
1
        };
34

            
35
1
        let json = serde_json::to_value(&suggestion).unwrap();
36

            
37
1
        assert!(json.get("id").is_some(), "must have 'id' field");
38
1
        assert!(json.get("name").is_some(), "must have 'name' field");
39
1
        assert!(json.get("currency").is_some(), "must have 'currency' field");
40
1
    }
41

            
42
    #[test]
43
1
    fn account_suggestion_deserializes_from_api_response() {
44
1
        let json = r#"{
45
1
            "id": "acc-123",
46
1
            "currency": "cur-456",
47
1
            "name": "Checking"
48
1
        }"#;
49

            
50
1
        let suggestion: AccountSuggestion = serde_json::from_str(json).unwrap();
51

            
52
1
        assert_eq!(suggestion.id, "acc-123");
53
1
        assert_eq!(suggestion.currency, Some("cur-456".into()));
54
1
        assert_eq!(suggestion.name, "Checking");
55
1
    }
56

            
57
    #[test]
58
1
    fn commodity_suggestion_serializes_correctly() {
59
1
        let suggestion = CommoditySuggestion {
60
1
            id: "com-123".into(),
61
1
            symbol: "USD".into(),
62
1
            name: "US Dollar".into(),
63
1
        };
64

            
65
1
        let json = serde_json::to_value(&suggestion).unwrap();
66

            
67
1
        assert!(json.get("id").is_some(), "must have 'id' field");
68
1
        assert!(json.get("symbol").is_some(), "must have 'symbol' field");
69
1
        assert!(json.get("name").is_some(), "must have 'name' field");
70
1
    }
71

            
72
    #[test]
73
1
    fn tag_suggestion_serializes_correctly() {
74
1
        let suggestion = TagSuggestion {
75
1
            name: "category".into(),
76
1
            value: Some("groceries".into()),
77
1
        };
78

            
79
1
        let json = serde_json::to_value(&suggestion).unwrap();
80

            
81
1
        assert!(json.get("name").is_some(), "must have 'name' field");
82
1
        assert!(json.get("value").is_some(), "must have 'value' field");
83
1
    }
84
}