spotify_cli/io/formatters/
user.rs

1//! User profile formatting functions
2
3use serde_json::Value;
4
5use crate::io::common::format_number;
6
7pub fn format_user_profile(payload: &Value) {
8    let display_name = payload
9        .get("display_name")
10        .and_then(|v| v.as_str())
11        .unwrap_or("Unknown");
12    let email = payload.get("email").and_then(|v| v.as_str());
13    let country = payload.get("country").and_then(|v| v.as_str());
14    let product = payload
15        .get("product")
16        .and_then(|v| v.as_str())
17        .unwrap_or("free");
18    let followers = payload
19        .get("followers")
20        .and_then(|f| f.get("total"))
21        .and_then(|v| v.as_u64())
22        .unwrap_or(0);
23    let uri = payload.get("uri").and_then(|v| v.as_str()).unwrap_or("");
24
25    println!("{}", display_name);
26    if let Some(email) = email {
27        println!("  Email: {}", email);
28    }
29    if let Some(country) = country {
30        println!("  Country: {}", country);
31    }
32    println!("  Plan: {}", product);
33    println!("  Followers: {}", format_number(followers));
34    if !uri.is_empty() {
35        println!("  URI: {}", uri);
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    use serde_json::json;
43
44    #[test]
45    fn format_user_profile_full() {
46        let payload = json!({
47            "display_name": "Test User",
48            "email": "test@example.com",
49            "country": "US",
50            "product": "premium",
51            "followers": { "total": 1500 },
52            "uri": "spotify:user:testuser"
53        });
54        format_user_profile(&payload);
55    }
56
57    #[test]
58    fn format_user_profile_minimal() {
59        let payload = json!({});
60        format_user_profile(&payload);
61    }
62
63    #[test]
64    fn format_user_profile_without_email() {
65        let payload = json!({
66            "display_name": "Test User",
67            "country": "GB",
68            "product": "free",
69            "followers": { "total": 0 }
70        });
71        format_user_profile(&payload);
72    }
73
74    #[test]
75    fn format_user_profile_without_country() {
76        let payload = json!({
77            "display_name": "Test User",
78            "email": "test@example.com",
79            "product": "premium"
80        });
81        format_user_profile(&payload);
82    }
83
84    #[test]
85    fn format_user_profile_large_followers() {
86        let payload = json!({
87            "display_name": "Popular Artist",
88            "followers": { "total": 5000000 }
89        });
90        format_user_profile(&payload);
91    }
92}