Fixed a bug where flatten could return songs from adjacent directories

This commit is contained in:
Antoine Gersant 2020-05-31 14:43:29 -07:00
parent 99db3eda13
commit d5c186579a
5 changed files with 36 additions and 15 deletions

View file

@ -101,9 +101,13 @@ where
let real_songs: Vec<Song> = if virtual_path.as_ref().parent() != None {
let real_path = vfs.virtual_to_real(virtual_path)?;
let like_path = real_path.as_path().to_string_lossy().into_owned() + "%";
let song_path_filter = {
let mut path_buf = real_path.clone();
path_buf.push("%");
path_buf.as_path().to_string_lossy().into_owned()
};
songs
.filter(path.like(&like_path))
.filter(path.like(&song_path_filter))
.order(path)
.load(&connection)?
} else {

View file

@ -13,8 +13,8 @@ fn test_populate() {
let connection = db.connect().unwrap();
let all_directories: Vec<Directory> = directories::table.load(&connection).unwrap();
let all_songs: Vec<Song> = songs::table.load(&connection).unwrap();
assert_eq!(all_directories.len(), 5);
assert_eq!(all_songs.len(), 12);
assert_eq!(all_directories.len(), 6);
assert_eq!(all_songs.len(), 13);
}
#[test]
@ -101,9 +101,26 @@ fn test_browse() {
fn test_flatten() {
let db = db::get_test_db("flatten.sqlite");
update(&db).unwrap();
// Flatten all
let results = flatten(&db, Path::new("root")).unwrap();
assert_eq!(results.len(), 12);
assert_eq!(results.len(), 13);
assert_eq!(results[0].title, Some("Above The Water".to_owned()));
// Flatten a directory
let mut path = PathBuf::new();
path.push("root");
path.push("Tobokegao");
let results = flatten(&db, &path).unwrap();
assert_eq!(results.len(), 8);
// Flatten a directory that is a prefix of another directory (Picnic Remixes)
let mut path = PathBuf::new();
path.push("root");
path.push("Tobokegao");
path.push("Picnic");
let results = flatten(&db, &path).unwrap();
assert_eq!(results.len(), 7);
}
#[test]

View file

@ -259,18 +259,18 @@ fn test_fill_playlist() {
.into_iter()
.map(|s| s.path)
.collect();
assert_eq!(playlist_content.len(), 12);
assert_eq!(playlist_content.len(), 13);
let first_song = playlist_content[0].clone();
playlist_content.push(first_song);
assert_eq!(playlist_content.len(), 13);
assert_eq!(playlist_content.len(), 14);
save_playlist("all_the_music", "test_user", &playlist_content, &db).unwrap();
let songs = read_playlist("all_the_music", "test_user", &db).unwrap();
assert_eq!(songs.len(), 13);
assert_eq!(songs.len(), 14);
assert_eq!(songs[0].title, Some("Above The Water".to_owned()));
assert_eq!(songs[12].title, Some("Above The Water".to_owned()));
assert_eq!(songs[13].title, Some("Above The Water".to_owned()));
use std::path::PathBuf;
let mut first_song_path = PathBuf::new();
@ -283,5 +283,5 @@ fn test_fill_playlist() {
// Save again to verify that we don't dupe the content
save_playlist("all_the_music", "test_user", &playlist_content, &db).unwrap();
let songs = read_playlist("all_the_music", "test_user", &db).unwrap();
assert_eq!(songs.len(), 13);
assert_eq!(songs.len(), 14);
}

View file

@ -242,7 +242,7 @@ fn test_service_trigger_index() {
let response = service.get_json::<Vec<index::Directory>>("/api/random");
let entries = response.body();
assert_eq!(entries.len(), 2);
assert_eq!(entries.len(), 3);
}
#[test]
@ -317,11 +317,11 @@ fn test_service_flatten() {
let response = service.get_json::<Vec<index::Song>>("/api/flatten");
let entries = response.body();
assert_eq!(entries.len(), 12);
assert_eq!(entries.len(), 13);
let response = service.get_json::<Vec<index::Song>>("/api/flatten/collection");
let entries = response.body();
assert_eq!(entries.len(), 12);
assert_eq!(entries.len(), 13);
}
#[test]
@ -333,7 +333,7 @@ fn test_service_random() {
let response = service.get_json::<Vec<index::Directory>>("/api/random");
let entries = response.body();
assert_eq!(entries.len(), 2);
assert_eq!(entries.len(), 3);
}
#[test]
@ -345,7 +345,7 @@ fn test_service_recent() {
let response = service.get_json::<Vec<index::Directory>>("/api/recent");
let entries = response.body();
assert_eq!(entries.len(), 2);
assert_eq!(entries.len(), 3);
}
#[test]