From d5c186579af075af0628e9305255fb835ea66b33 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Sun, 31 May 2020 14:43:29 -0700 Subject: [PATCH] Fixed a bug where flatten could return songs from adjacent directories --- src/index/query.rs | 8 ++++-- src/index/test.rs | 23 +++++++++++++++--- src/playlist.rs | 10 ++++---- src/service/test.rs | 10 ++++---- .../01 - ピクニック (Picnic) (Remix).mp3 | Bin 0 -> 5363 bytes 5 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 test/collection/Tobokegao/Picnic (Remixes)/01 - ピクニック (Picnic) (Remix).mp3 diff --git a/src/index/query.rs b/src/index/query.rs index d3c16b2..fa643e4 100644 --- a/src/index/query.rs +++ b/src/index/query.rs @@ -101,9 +101,13 @@ where let real_songs: Vec = 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 { diff --git a/src/index/test.rs b/src/index/test.rs index 3645b4c..8cd13b6 100644 --- a/src/index/test.rs +++ b/src/index/test.rs @@ -13,8 +13,8 @@ fn test_populate() { let connection = db.connect().unwrap(); let all_directories: Vec = directories::table.load(&connection).unwrap(); let all_songs: Vec = 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] diff --git a/src/playlist.rs b/src/playlist.rs index 4d8bf88..2623102 100644 --- a/src/playlist.rs +++ b/src/playlist.rs @@ -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); } diff --git a/src/service/test.rs b/src/service/test.rs index f636115..bad1dbc 100644 --- a/src/service/test.rs +++ b/src/service/test.rs @@ -242,7 +242,7 @@ fn test_service_trigger_index() { let response = service.get_json::>("/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::>("/api/flatten"); let entries = response.body(); - assert_eq!(entries.len(), 12); + assert_eq!(entries.len(), 13); let response = service.get_json::>("/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::>("/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::>("/api/recent"); let entries = response.body(); - assert_eq!(entries.len(), 2); + assert_eq!(entries.len(), 3); } #[test] diff --git a/test/collection/Tobokegao/Picnic (Remixes)/01 - ピクニック (Picnic) (Remix).mp3 b/test/collection/Tobokegao/Picnic (Remixes)/01 - ピクニック (Picnic) (Remix).mp3 new file mode 100644 index 0000000000000000000000000000000000000000..110a96528ebaeb44d8e06694a801d5aa86d32fe7 GIT binary patch literal 5363 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