suno-core 0.36.4

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

#[test]
fn build_playlist_desired_orders_members_and_marks_absent() {
    let a = clip("id-a", "Song A", "alice");
    let b = clip("id-b", "Song B", "alice");
    let desired = build_desired(
        &[&a, &b],
        AudioFormat::Flac,
        &modes_for(&[&a, &b], SourceMode::Mirror),
        &no_contexts(),
        &no_collisions(),
        ArtifactToggles::default(),
        &NamingConfig::default(),
    );
    let missing = clip("id-x", "Missing Song", "bob");
    let members = vec![b.clone(), missing.clone(), a.clone()];
    let inputs = vec![PlaylistInput {
        id: "pl1",
        name: "Road/Trip",
        members: &members,
    }];

    let out = build_playlist_desired(&inputs, &desired);
    assert_eq!(out.len(), 1);
    let pl = &out[0];
    assert_eq!(pl.id, "pl1");
    assert_eq!(pl.path, "Road Trip.m3u8");
    assert!(pl.content.starts_with("#EXTM3U\n#PLAYLIST:Road/Trip\n"));

    let pos_b = pl.content.find(path_of(&desired, "id-b")).unwrap();
    let pos_missing = pl.content.find("# (not in library) Missing Song").unwrap();
    let pos_a = pl.content.find(path_of(&desired, "id-a")).unwrap();
    assert!(pos_b < pos_missing && pos_missing < pos_a);
    assert!(!pl.content.contains("Missing Song\nbob/"));
    assert_eq!(pl.hash, content_hash(&pl.content));
}

#[test]
fn build_playlist_desired_builds_liked_and_multiple_in_order() {
    let a = clip("id-a", "Song A", "alice");
    let desired = build_desired(
        &[&a],
        AudioFormat::Flac,
        &modes_for(&[&a], SourceMode::Mirror),
        &no_contexts(),
        &no_collisions(),
        ArtifactToggles::default(),
        &NamingConfig::default(),
    );
    let members = vec![a.clone()];
    let inputs = vec![
        PlaylistInput {
            id: "pl1",
            name: "First",
            members: &members,
        },
        PlaylistInput {
            id: LIKED_PLAYLIST_ID,
            name: "Liked Songs",
            members: &members,
        },
    ];

    let out = build_playlist_desired(&inputs, &desired);
    assert_eq!(out.len(), 2);
    assert_eq!(out[0].id, "pl1");
    assert_eq!(out[1].id, LIKED_PLAYLIST_ID);
    assert_eq!(out[1].path, "Liked Songs.m3u8");
    assert!(out[0].content.contains(path_of(&desired, "id-a")));
    assert!(out[1].content.contains(path_of(&desired, "id-a")));
}

#[test]
fn build_playlist_desired_is_empty_for_no_inputs() {
    assert!(build_playlist_desired(&[], &[]).is_empty());
}