use crate::brain::tools::whatsapp_send::{build_vcard, get_f64, get_str, mime_from_extension};
use serde_json::json;
#[test]
fn get_str_valid() {
let input = json!({"message": "hello"});
assert_eq!(get_str(&input, "message").unwrap(), "hello");
}
#[test]
fn get_str_missing() {
let input = json!({});
let err = get_str(&input, "message").unwrap_err();
assert!(!err.success);
assert!(err.error.unwrap().contains("Missing required parameter"));
}
#[test]
fn get_str_empty() {
let input = json!({"message": ""});
let err = get_str(&input, "message").unwrap_err();
assert!(!err.success);
}
#[test]
fn get_str_wrong_type() {
let input = json!({"message": 42});
let err = get_str(&input, "message").unwrap_err();
assert!(!err.success);
}
#[test]
fn get_f64_valid() {
let input = json!({"latitude": 40.7128});
assert_eq!(get_f64(&input, "latitude"), Some(40.7128));
}
#[test]
fn get_f64_integer_coerces() {
let input = json!({"latitude": 40});
assert_eq!(get_f64(&input, "latitude"), Some(40.0));
}
#[test]
fn get_f64_missing() {
let input = json!({});
assert_eq!(get_f64(&input, "latitude"), None);
}
#[test]
fn get_f64_wrong_type() {
let input = json!({"latitude": "not a number"});
assert_eq!(get_f64(&input, "latitude"), None);
}
#[test]
fn build_vcard_format() {
let vcard = build_vcard("John Doe", "+15551234567");
assert!(vcard.starts_with("BEGIN:VCARD"));
assert!(vcard.contains("FN:John Doe"));
assert!(vcard.contains("TEL;TYPE=CELL:+15551234567"));
assert!(vcard.ends_with("END:VCARD"));
assert!(vcard.contains("VERSION:3.0"));
}
#[test]
fn build_vcard_special_chars() {
let vcard = build_vcard("O'Brien", "+351933536442");
assert!(vcard.contains("FN:O'Brien"));
assert!(vcard.contains("TEL;TYPE=CELL:+351933536442"));
}
#[test]
fn mime_jpg() {
assert_eq!(mime_from_extension("photo.jpg").unwrap(), "image/jpeg");
assert_eq!(mime_from_extension("photo.jpeg").unwrap(), "image/jpeg");
}
#[test]
fn mime_png() {
assert_eq!(mime_from_extension("image.PNG").unwrap(), "image/png");
}
#[test]
fn mime_video() {
assert_eq!(mime_from_extension("clip.mp4").unwrap(), "video/mp4");
assert_eq!(mime_from_extension("clip.mov").unwrap(), "video/quicktime");
assert_eq!(mime_from_extension("clip.3gp").unwrap(), "video/3gpp");
}
#[test]
fn mime_audio() {
assert_eq!(mime_from_extension("voice.ogg").unwrap(), "audio/ogg");
assert_eq!(mime_from_extension("voice.opus").unwrap(), "audio/ogg");
assert_eq!(mime_from_extension("song.mp3").unwrap(), "audio/mpeg");
assert_eq!(mime_from_extension("track.m4a").unwrap(), "audio/mp4");
assert_eq!(mime_from_extension("clip.aac").unwrap(), "audio/aac");
}
#[test]
fn mime_document() {
assert_eq!(mime_from_extension("doc.pdf").unwrap(), "application/pdf");
assert_eq!(mime_from_extension("file.txt").unwrap(), "text/plain");
assert_eq!(mime_from_extension("data.csv").unwrap(), "text/csv");
assert_eq!(
mime_from_extension("archive.zip").unwrap(),
"application/zip"
);
}
#[test]
fn mime_sticker() {
assert_eq!(mime_from_extension("sticker.webp").unwrap(), "image/webp");
}
#[test]
fn mime_unknown_returns_none() {
assert!(mime_from_extension("file.xyz").is_none());
assert!(mime_from_extension("noext").is_none());
}
#[test]
fn schema_has_all_14_actions() {
let expected_actions = [
"send",
"reply",
"delete",
"send_photo",
"send_document",
"send_audio",
"send_video",
"send_sticker",
"send_location",
"send_contact",
"react",
"send_poll",
"typing",
"mark_read",
];
assert_eq!(expected_actions.len(), 14, "expected 14 actions");
let schema_actions = [
"send",
"reply",
"delete",
"send_photo",
"send_document",
"send_audio",
"send_video",
"send_sticker",
"send_location",
"send_contact",
"react",
"send_poll",
"typing",
"mark_read",
];
for action in &schema_actions {
assert!(
expected_actions.contains(action),
"schema action '{}' not in expected list",
action
);
}
}
#[tokio::test]
async fn unknown_action_returns_error() {
let unknown = "nonexistent_action";
let valid_actions = "send, reply, delete, send_photo, send_document, \
send_audio, send_video, send_sticker, send_location, send_contact, \
react, send_poll, typing, mark_read";
let error_msg = format!(
"Unknown action '{}'. Valid actions: {}",
unknown, valid_actions
);
assert!(error_msg.contains("nonexistent_action"));
assert!(error_msg.contains("send_poll"));
assert!(error_msg.contains("mark_read"));
}