mpdclient 0.2.0

Rust interface to MPD using libmpdclient
Documentation
use mpdclient::{Entity, Tag};

use crate::common::setup_mpd;

mod common;

#[test]
fn list_all() -> eyre::Result<()> {
    setup_mpd(
        |setup| {
            setup.song("song")?;
            setup.song("song2")?;
            setup.directory()?;
            setup.song("dir/song")
        },
        |conn| {
            let db = conn.database();
            let list = db.list_all(None)?.receive_all()?;
            assert_eq!(list.len(), 4);
            let Entity::Song(song) = list.iter().find(|e| matches!(e, Entity::Song(_))).unwrap()
            else {
                unreachable!()
            };
            assert!(song.tag(Tag::Title).next().is_none());

            Ok(())
        },
    )
}

#[test]
fn list_all_dir() -> eyre::Result<()> {
    setup_mpd(
        |setup| {
            setup.song("song")?;
            setup.song("song2")?;
            setup.directory()?;
            setup.song("dir/song")?;
            setup.song("dir/text.txt")
        },
        |conn| {
            let db = conn.database();
            let list = db.list_all(Some("dir"))?.receive_all()?;
            assert_eq!(list.len(), 3);
            let Entity::Song(song) = list.iter().find(|e| matches!(e, Entity::Song(_))).unwrap()
            else {
                unreachable!()
            };
            assert!(song.tag(Tag::Title).next().is_none());

            Ok(())
        },
    )
}

#[test]
fn list_all_meta() -> eyre::Result<()> {
    setup_mpd(
        |setup| {
            setup.song("song")?;
            setup.song("song2")?;
            setup.directory()?;
            setup.song("dir/song")
        },
        |conn| {
            let db = conn.database();
            let list = db.list_all_meta(None)?.receive_all()?;
            assert_eq!(list.len(), 4);
            let Entity::Song(song) = list.iter().find(|e| matches!(e, Entity::Song(_))).unwrap()
            else {
                unreachable!()
            };
            assert_eq!(song.tag(Tag::Title).next().unwrap(), "Silence");

            Ok(())
        },
    )
}

#[test]
fn list_meta() -> eyre::Result<()> {
    setup_mpd(
        |setup| {
            setup.song("song")?;
            setup.song("song2")?;
            setup.directory()?;
            setup.song("dir/song")
        },
        |conn| {
            let db = conn.database();
            let list = db.list_meta(None)?.receive_all()?;
            assert_eq!(list.len(), 3);

            let Entity::Song(song) = list.iter().find(|e| matches!(e, Entity::Song(_))).unwrap()
            else {
                unreachable!()
            };
            assert_eq!(song.tag(Tag::Title).next().unwrap(), "Silence");

            Ok(())
        },
    )
}

#[test]
fn list_files() -> eyre::Result<()> {
    setup_mpd(
        |setup| {
            setup.song_copy("song")?;
            setup.song("song2")?;
            setup.directory()
        },
        |conn| {
            let database = conn.database();
            let list = database.list_files(None)?.receive_all()?;
            assert_eq!(list.len(), 2);
            assert!(matches!(list[0], Entity::Directory(_)));

            Ok(())
        },
    )
}

#[test]
fn list_files_dir() -> eyre::Result<()> {
    setup_mpd(
        |setup| {
            setup.directory()?;
            setup.song("dir/song")?;
            setup.song_copy("dir/song2")
        },
        |conn| {
            let database = conn.database();
            let list = database.list_files(Some("dir"))?.receive_all()?;
            assert_eq!(list.len(), 1);
            assert!(matches!(list[0], Entity::Song(_)));
            let Entity::Song(song) = &list[0] else {
                unreachable!()
            };

            assert_eq!(song.uri(), "song2.mp3");

            Ok(())
        },
    )
}

#[test]
fn update() -> eyre::Result<()> {
    setup_mpd(
        |_| Ok(()),
        |conn| {
            assert!(conn.database().update(None)? >= 1);

            Ok(())
        },
    )
}

#[test]
fn rescan() -> eyre::Result<()> {
    setup_mpd(
        |_| Ok(()),
        |conn| {
            assert!(conn.database().rescan(None)? >= 1);

            Ok(())
        },
    )
}