suno-core 0.36.2

Engine for a download-only Suno.ai library tool: feed selection, sync reconciliation, and audio tagging.
Documentation
use super::*;

#[test]
fn get_billing_info_reads_remaining_credits() {
    let mut rules = auth_rules();
    rules.push(Rule::new(
        BILLING_INFO_PATH,
        200,
        r#"{"total_credits_left":500,"monthly_limit":1000,"monthly_usage":500}"#.to_string(),
    ));
    let http = MockHttp::new(rules);
    let client = authed_client(&http);

    let billing = pollster::block_on(client.get_billing_info(&http)).unwrap();
    assert_eq!(billing.total_credits_left, Some(500));
    assert_eq!(billing.monthly_limit, Some(1000));
    assert_eq!(billing.monthly_usage, Some(500));
}

#[test]
fn get_billing_info_tolerates_missing_balance() {
    let mut rules = auth_rules();
    rules.push(Rule::new(
        BILLING_INFO_PATH,
        200,
        r#"{"monthly_usage":12}"#.to_string(),
    ));
    let http = MockHttp::new(rules);
    let client = authed_client(&http);

    let billing = pollster::block_on(client.get_billing_info(&http)).unwrap();
    assert_eq!(billing.total_credits_left, None);
    assert_eq!(billing.monthly_usage, Some(12));
}

#[test]
fn aligned_lyrics_reads_words_and_lines() {
    let mut rules = auth_rules();
    let body = serde_json::json!({
        "aligned_words": [
            {"word": "hi", "success": true, "start_s": 0.5, "end_s": 0.9, "p_align": 0.99}
        ],
        "aligned_lyrics": [
            {"text": "hi", "start_s": 0.5, "end_s": 0.9, "section": "Verse 1",
             "words": [{"text": "hi", "start_s": 0.5, "end_s": 0.9}]}
        ],
        "hoot_cer": 0.2, "is_streamed": false
    })
    .to_string();
    rules.push(Rule::new("/aligned_lyrics/v2/", 200, body));
    let http = MockHttp::new(rules);
    let client = authed_client(&http);

    let aligned = pollster::block_on(client.aligned_lyrics(&http, "clip-1")).unwrap();
    assert_eq!(aligned.words.len(), 1);
    assert_eq!(aligned.lines.len(), 1);
    assert_eq!(aligned.lines[0].section, "Verse 1");
    assert!(!aligned.is_empty());
}

#[test]
fn aligned_lyrics_empty_arrays_map_to_empty() {
    let mut rules = auth_rules();
    rules.push(Rule::new(
        "/aligned_lyrics/v2/",
        200,
        r#"{"aligned_words":[],"aligned_lyrics":[],"hoot_cer":1.0}"#.to_string(),
    ));
    let http = MockHttp::new(rules);
    let client = authed_client(&http);

    let aligned = pollster::block_on(client.aligned_lyrics(&http, "instr")).unwrap();
    assert!(aligned.is_empty());
}

#[test]
fn aligned_lyrics_maps_404_to_empty() {
    let mut rules = auth_rules();
    rules.push(Rule::new(
        "/aligned_lyrics/v2/",
        404,
        "not found".to_string(),
    ));
    let http = MockHttp::new(rules);
    let client = authed_client(&http);

    let aligned = pollster::block_on(client.aligned_lyrics(&http, "missing")).unwrap();
    assert!(aligned.is_empty());
}