diff --git a/src/app/index/browser.rs b/src/app/index/browser.rs index af62ee4..6efc495 100644 --- a/src/app/index/browser.rs +++ b/src/app/index/browser.rs @@ -9,7 +9,7 @@ use trie_rs::{Trie, TrieBuilder}; use crate::app::{scanner, Error}; -#[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] pub enum File { Directory(PathBuf), Song(PathBuf), @@ -17,7 +17,7 @@ pub enum File { #[derive(Serialize, Deserialize)] pub struct Browser { - directories: HashMap>, + directories: HashMap>, flattened: Trie, } @@ -33,7 +33,7 @@ impl Browser { let Some(files) = self.directories.get(virtual_path.as_ref()) else { return Err(Error::DirectoryNotFound(virtual_path.as_ref().to_owned())); }; - Ok(files.iter().cloned().collect()) + Ok(files.clone()) } pub fn flatten>(&self, virtual_path: P) -> Result, Error> { @@ -56,7 +56,7 @@ impl Browser { } pub struct Builder { - directories: HashMap>, + directories: HashMap>, flattened: TrieBuilder, } @@ -79,7 +79,7 @@ impl Builder { self.directories .entry(parent.clone()) .or_default() - .insert(File::Directory(directory.virtual_path)); + .push(File::Directory(directory.virtual_path)); } } @@ -87,7 +87,7 @@ impl Builder { self.directories .entry(song.virtual_parent.clone()) .or_default() - .insert(File::Song(song.virtual_path.clone())); + .push(File::Song(song.virtual_path.clone())); self.flattened.push( song.virtual_path @@ -97,7 +97,10 @@ impl Builder { ); } - pub fn build(self) -> Browser { + pub fn build(mut self) -> Browser { + for directory in self.directories.values_mut() { + directory.sort(); + } Browser { directories: self.directories, flattened: self.flattened.build(), diff --git a/src/server/test.rs b/src/server/test.rs index a80eb6b..f9aff6b 100644 --- a/src/server/test.rs +++ b/src/server/test.rs @@ -116,23 +116,10 @@ pub trait TestService { let response = self.fetch(&request).await; assert_eq!(response.status(), StatusCode::OK); - loop { - let browse_request = protocol::browse::(Path::new("")); - let response = self - .fetch_json::<(), Vec>(&browse_request) - .await; - let entries = response.body(); - if !entries.is_empty() { - break; - } - tokio::time::sleep(Duration::from_millis(100)).await; - } - loop { let flatten_request = protocol::flatten::(Path::new("")); - let response = self.fetch_json::<_, Vec>(&flatten_request).await; - let entries = response.body(); - if !entries.is_empty() { + let response = self.fetch(&flatten_request).await; + if response.status() == StatusCode::OK { break; } tokio::time::sleep(Duration::from_millis(100)).await; diff --git a/src/server/test/collection.rs b/src/server/test/collection.rs index fb44c10..fe788cc 100644 --- a/src/server/test/collection.rs +++ b/src/server/test/collection.rs @@ -78,7 +78,9 @@ async fn browse_directory_api_v7() { let entries = response.body(); assert_eq!(entries.len(), 5); match &entries[0] { - dto::v7::CollectionFile::Song(s) => assert_eq!(s.artist.as_deref(), Some("Khemmis")), + dto::v7::CollectionFile::Song(s) => { + assert_eq!(s.path, path.join("01 - Above The Water.mp3")) + } _ => (), } } @@ -100,10 +102,10 @@ async fn flatten_root() { service.login().await; let request = protocol::flatten::(&PathBuf::new()); - let response = service.fetch_json::<_, Vec>(&request).await; + let response = service.fetch_json::<_, dto::SongList>(&request).await; assert_eq!(response.status(), StatusCode::OK); - let entries = response.body(); - assert_eq!(entries.len(), 13); + let song_list = response.body(); + assert_eq!(song_list.paths.len(), 13); } #[tokio::test] @@ -115,10 +117,10 @@ async fn flatten_directory() { service.login().await; let request = protocol::flatten::(Path::new(TEST_MOUNT_NAME)); - let response = service.fetch_json::<_, Vec>(&request).await; + let response = service.fetch_json::<_, dto::SongList>(&request).await; assert_eq!(response.status(), StatusCode::OK); - let entries = response.body(); - assert_eq!(entries.len(), 13); + let song_list = response.body(); + assert_eq!(song_list.paths.len(), 13); } #[tokio::test] @@ -148,7 +150,7 @@ async fn flatten_directory_api_v7() { let entries = response.body(); assert_eq!(entries.len(), 5); - assert_eq!(entries[0].artist.as_deref(), Some("Khemmis")); + assert_eq!(entries[0].path, path.join("01 - Above The Water.mp3")); } #[tokio::test]