use std::time::SystemTime;
#[cfg(feature = "protocol_0_24")]
use mpdclient::QueueSaveMode;
use mpdclient::{Entity, Position, Song, Tag};
use crate::common::setup_mpd;
mod common;
#[test]
fn path() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
let db = conn.database();
let mut list = db.list_meta(None)?;
let Entity::Playlist(playlist) = list
.find(|e| matches!(e.as_ref().unwrap(), Entity::Playlist(_)))
.unwrap()?
else {
unreachable!();
};
let path = playlist.path().to_string_lossy().to_string();
assert!(path.contains("playlist"));
Ok(())
},
)
}
#[test]
fn last_modified() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
let db = conn.database();
let mut list = db.list_meta(None)?;
let Entity::Playlist(playlist) = list
.find(|e| matches!(e.as_ref().unwrap(), Entity::Playlist(_)))
.unwrap()?
else {
unreachable!();
};
assert!(playlist.last_modified() <= Some(SystemTime::now()));
Ok(())
},
)
}
#[test]
fn list() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song2.mp3"]
);
Ok(())
},
)
}
#[test]
fn list_meta() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song")?;
setup.song("song2")?;
setup.playlist()
},
|conn| {
assert_eq!(
conn.playlist("playlist")?
.list_meta()?
.iter()
.map(|s| s.tag(Tag::Title).receive_all())
.collect::<Vec<Vec<String>>>(),
vec![vec!["Silence"], vec!["Silence"]]
);
Ok(())
},
)
}
#[test]
fn clear() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
conn.playlist("playlist")?.clear()?;
assert!(conn.playlist("playlist")?.list()?.is_empty());
Ok(())
},
)
}
#[test]
fn add() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.playlist("playlist")?.add("song3.mp3")?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song2.mp3", "song3.mp3"]
);
Ok(())
},
)
}
#[test]
fn add_create() -> eyre::Result<()> {
setup_mpd(
|setup| setup.song("song"),
|conn| {
conn.playlist("playlist")?.add("song.mp3")?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3"]
);
Ok(())
},
)
}
#[test]
fn add_to() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.playlist("playlist")?.add_to("song3.mp3", 1)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song3.mp3", "song2.mp3"]
);
Ok(())
},
)
}
#[test]
fn move_single() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
conn.playlist("playlist")?.move_single(1, 0)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song2.mp3", "song.mp3"]
);
Ok(())
},
)
}
#[test]
#[cfg(feature = "protocol_0_24")]
fn move_range() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.playlist("playlist")?.add("song3.mp3")?;
conn.playlist("playlist")?.move_range(1, 3, 0)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song2.mp3", "song3.mp3", "song.mp3"]
);
Ok(())
},
)
}
#[test]
fn delete() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
conn.playlist("playlist")?.delete(1)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3"]
);
Ok(())
},
)
}
#[test]
fn delete_range() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.playlist("playlist")?.add("song3.mp3")?;
conn.playlist("playlist")?.delete_range(1, 3)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3"]
);
Ok(())
},
)
}
#[test]
#[cfg(feature = "protocol_0_24")]
fn save_queue_create() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song")?;
setup.song("song2")
},
|conn| {
let queue = conn.queue();
queue.add("song.mp3")?;
queue.add("song2.mp3")?;
conn.playlist("playlist")?
.save_queue(QueueSaveMode::Create)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song2.mp3"]
);
Ok(())
},
)
}
#[test]
#[cfg(feature = "protocol_0_24")]
#[should_panic = "called `Result::unwrap()` on an `Err` value: MPD Error: Playlist already exists: Exists\n\nLocation:\n tests/playlist.rs:294:13"]
fn save_queue_create_exisiting() {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.queue().add("song3.mp3")?;
conn.playlist("playlist")?
.save_queue(QueueSaveMode::Create)?;
Ok(())
},
)
.unwrap();
}
#[test]
#[cfg(feature = "protocol_0_24")]
fn save_queue_append() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.queue().add("song3.mp3")?;
conn.playlist("playlist")?
.save_queue(QueueSaveMode::Append)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song2.mp3", "song3.mp3"]
);
Ok(())
},
)
}
#[test]
#[cfg(feature = "protocol_0_24")]
#[should_panic = "called `Result::unwrap()` on an `Err` value: MPD Error: No such playlist: Doesn't exist\n\nLocation:\n tests/playlist.rs:337:13"]
fn save_queue_append_new() {
setup_mpd(
|setup| setup.song("song3"),
|conn| {
conn.queue().add("song3.mp3")?;
conn.playlist("playlist")?
.save_queue(QueueSaveMode::Append)?;
Ok(())
},
)
.unwrap();
}
#[test]
#[cfg(feature = "protocol_0_24")]
fn save_queue_replace() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.queue().add("song3.mp3")?;
conn.playlist("playlist")?
.save_queue(QueueSaveMode::Replace)?;
assert_eq!(
conn.playlist("playlist")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song3.mp3"]
);
Ok(())
},
)
}
#[test]
#[cfg(feature = "protocol_0_24")]
#[should_panic = "called `Result::unwrap()` on an `Err` value: MPD Error: No such playlist: Doesn't exist\n\nLocation:\n tests/playlist.rs:380:13"]
fn save_queue_replace_new() {
setup_mpd(
|setup| setup.song("song3"),
|conn| {
conn.queue().add("song3.mp3")?;
conn.playlist("playlist")?
.save_queue(QueueSaveMode::Replace)?;
Ok(())
},
)
.unwrap();
}
#[test]
fn load() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.playlist()?;
setup.song("song")?;
setup.song("song2")
},
|conn| {
conn.playlist("playlist")?.load()?;
assert_eq!(
conn.queue()
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song2.mp3"]
);
Ok(())
},
)
}
#[test]
fn load_range() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song2")?;
setup.song("song3")?;
setup.playlist()
},
|conn| {
let playlist = conn.playlist("playlist")?;
playlist.add("song3.mp3")?;
playlist.load_range(1, Some(3))?;
assert_eq!(
conn.queue()
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song2.mp3", "song3.mp3"]
);
Ok(())
},
)
}
#[test]
fn load_range_none() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song2")?;
setup.song("song3")?;
setup.playlist()
},
|conn| {
let playlist = conn.playlist("playlist")?;
playlist.add("song3.mp3")?;
playlist.load_range(1, None)?;
assert_eq!(
conn.queue()
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song2.mp3", "song3.mp3"]
);
Ok(())
},
)
}
#[test]
fn load_range_to() -> eyre::Result<()> {
setup_mpd(
|setup| {
setup.song("song2")?;
setup.song("song3")?;
setup.playlist()
},
|conn| {
conn.queue().add("song3.mp3")?;
conn.queue().add("song2.mp3")?;
let playlist = conn.playlist("playlist")?;
playlist.add("song3.mp3")?;
playlist.load_range_to(1, Some(3), 1, Position::Absolute)?;
assert_eq!(
conn.queue()
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song3.mp3", "song2.mp3", "song3.mp3", "song2.mp3"]
);
Ok(())
},
)
}
#[test]
fn rename() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
conn.playlist("playlist")?.rename("renamed")?;
assert_eq!(
conn.playlist("renamed")?
.list()?
.iter()
.map(Song::uri)
.collect::<Vec<String>>(),
vec!["song.mp3", "song2.mp3"]
);
Ok(())
},
)
}
#[test]
fn rm() -> eyre::Result<()> {
setup_mpd(
|setup| setup.playlist(),
|conn| {
conn.playlist("playlist")?.rm()?;
assert!(
!conn
.database()
.list_all(None)?
.any(|i| matches!(i, Ok(Entity::Playlist(_))))
);
Ok(())
},
)
}