From 3f379cf454814593af08c6b9b3e345ebbd9492dd Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 21 Mar 2025 21:21:53 -0400 Subject: [PATCH 1/6] Renamed branch --- .gitea/workflows/tag_release.yaml | 2 +- .gitea/workflows/workflow.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/tag_release.yaml b/.gitea/workflows/tag_release.yaml index 921d7e3..0e41d99 100644 --- a/.gitea/workflows/tag_release.yaml +++ b/.gitea/workflows/tag_release.yaml @@ -4,7 +4,7 @@ on: push: branches: - main - - dev + - devel tags: - 'v*' # Trigger on tags matching v* diff --git a/.gitea/workflows/workflow.yaml b/.gitea/workflows/workflow.yaml index 4c5afd4..355ad53 100644 --- a/.gitea/workflows/workflow.yaml +++ b/.gitea/workflows/workflow.yaml @@ -4,11 +4,11 @@ on: push: branches: - main - - dev + - devel pull_request: branches: - main - - dev + - devel jobs: check: -- 2.43.0 From 351147cb649117b290175e76dc416e6245aebf1e Mon Sep 17 00:00:00 2001 From: KD Date: Sat, 22 Mar 2025 18:24:08 +0000 Subject: [PATCH 2/6] Fixed some warnings (#11) Reviewed-on: https://git.kundeng.us/phoenix/icarus-models/pulls/11 Co-authored-by: KD Co-committed-by: KD --- src/access_level.rs | 10 +++--- src/coverart.rs | 8 ++--- src/login_result.rs | 2 +- src/song.rs | 79 ++++++++++++++++++++++----------------------- src/token.rs | 8 ++--- src/types.rs | 12 +++---- src/user.rs | 4 +-- 7 files changed, 57 insertions(+), 66 deletions(-) diff --git a/src/access_level.rs b/src/access_level.rs index 2dc4f15..c41d81f 100644 --- a/src/access_level.rs +++ b/src/access_level.rs @@ -20,23 +20,23 @@ impl Default for AccessLevel { } pub fn default_level() -> AccessLevel { - return AccessLevel { + AccessLevel { id: -1, level: String::from("Public"), song_id: -1, - }; + } } pub fn private_level() -> AccessLevel { - return AccessLevel { + AccessLevel { id: -1, level: String::from("Private"), song_id: -1, - }; + } } impl AccessLevel { pub fn _to_json(&self) -> Result { - return serde_json::to_string_pretty(&self); + serde_json::to_string_pretty(&self) } } diff --git a/src/coverart.rs b/src/coverart.rs index 4703823..f8aaec5 100644 --- a/src/coverart.rs +++ b/src/coverart.rs @@ -16,12 +16,8 @@ impl CoverArt { let mut file = std::fs::File::open(path)?; let mut buffer = Vec::new(); match file.read_to_end(&mut buffer) { - Ok(_) => { - return Ok(buffer); - } - Err(err) => { - return Err(err); - } + Ok(_) => Ok(buffer), + Err(err) => Err(err), } } } diff --git a/src/login_result.rs b/src/login_result.rs index 9095fdb..782ca77 100644 --- a/src/login_result.rs +++ b/src/login_result.rs @@ -26,6 +26,6 @@ impl Default for LoginResult { impl LoginResult { pub fn _to_json(&self) -> Result { - return serde_json::to_string_pretty(&self); + serde_json::to_string_pretty(&self) } } diff --git a/src/song.rs b/src/song.rs index b024a62..ed62435 100644 --- a/src/song.rs +++ b/src/song.rs @@ -1,4 +1,4 @@ -use std::default::Default; +// use std::default::Default; use std::io::Read; use crate::constants; @@ -64,6 +64,7 @@ fn is_dur_not_set(num: &i32) -> bool { *num == 0 } +/* impl Default for Song { fn default() -> Self { Song { @@ -92,13 +93,14 @@ impl Default for Song { } } } +*/ impl Song { pub fn to_metadata_json(&self, pretty: bool) -> Result { if pretty { - return serde_json::to_string_pretty(&self); + serde_json::to_string_pretty(&self) } else { - return serde_json::to_string(&self); + serde_json::to_string(&self) } } @@ -111,7 +113,7 @@ impl Song { } let directory = &self.directory; - let mut buffer: String = String::from(directory.clone()); + let mut buffer: String = directory.clone(); let last_index = directory.len() - 1; if let Some(character) = directory.chars().nth(last_index) { @@ -121,12 +123,12 @@ impl Song { buffer += &self.filename.clone(); - return Ok(buffer); + Ok(buffer) } else { - return Err(std::io::Error::new( + Err(std::io::Error::new( std::io::ErrorKind::Other, "Could not access last character of directory", - )); + )) } } @@ -139,50 +141,45 @@ impl Song { let mut buffer: Vec = Vec::new(); file.read_to_end(&mut buffer)?; - if buffer.len() == 0 { - return Err(std::io::Error::new( + if buffer.is_empty() { + Err(std::io::Error::new( std::io::ErrorKind::Other, "File is empty", - )); + )) } else { - return Ok(buffer); + Ok(buffer) } } - Err(er) => { - return Err(er); - } + Err(er) => Err(er), } } - pub fn generate_filename(&self, typ: types::types::Types, randomize: bool) -> String { + pub fn generate_filename(&self, typ: types::MusicTypes, randomize: bool) -> String { let mut filename: String = String::new(); let filename_len = 10; let file_extension = match typ { - types::types::Types::DefaultMusicExtension => { + types::MusicTypes::DefaultMusicExtension => { String::from(constants::DEFAULTMUSICEXTENSION) } - types::types::Types::WavExtension => String::from(constants::WAVEXTENSION), - types::types::Types::FlacExtension => String::from(constants::FLACEXTENSION), - types::types::Types::MPThreeExtension => String::from(constants::MPTHREEEXTENSION), + types::MusicTypes::WavExtension => String::from(constants::WAVEXTENSION), + types::MusicTypes::FlacExtension => String::from(constants::FLACEXTENSION), + types::MusicTypes::MPThreeExtension => String::from(constants::MPTHREEEXTENSION), }; if randomize { let some_chars: String = String::from("abcdefghij0123456789"); - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); for _i in 0..filename_len { - let random_number: i32 = rng.gen_range(0..=19); + let random_number: i32 = rng.random_range(0..=19); let index = random_number as usize; let rando_char = some_chars.chars().nth(index); - match rando_char { - Some(c) => { - filename.push(c); - } - None => {} - }; + if let Some(c) = rando_char { + filename.push(c); + } } } else { filename += "track-output"; @@ -190,10 +187,11 @@ impl Song { filename += &file_extension; - return filename; + filename } } +/* mod embedded { use std::io::Read; @@ -202,9 +200,9 @@ mod embedded { impl Song { pub fn to_metadata_json(&self, pretty: bool) -> Result { if pretty { - return serde_json::to_string_pretty(&self); + serde_json::to_string_pretty(&self) } else { - return serde_json::to_string(&self); + serde_json::to_string(&self) } } @@ -217,7 +215,7 @@ mod embedded { } let directory = &self.directory; - let mut buffer: String = String::from(directory.clone()); + let mut buffer: String = directory.clone(); let last_index = directory.len() - 1; if let Some(character) = directory.chars().nth(last_index) { @@ -227,12 +225,12 @@ mod embedded { buffer += &self.filename.clone(); - return Ok(buffer); + Ok(buffer) } else { - return Err(std::io::Error::new( + Err(std::io::Error::new( std::io::ErrorKind::Other, "Could not access last character of directory", - )); + )) } } @@ -245,18 +243,16 @@ mod embedded { let mut buffer: Vec = Vec::new(); file.read_to_end(&mut buffer)?; - if buffer.len() == 0 { - return Err(std::io::Error::new( + if buffer.is_empty() { + Err(std::io::Error::new( std::io::ErrorKind::Other, "File is empty", - )); + )) } else { - return Ok(buffer); + Ok(buffer) } } - Err(er) => { - return Err(er); - } + Err(er) => Err(er), } } } @@ -348,3 +344,4 @@ mod embedded { } } } +*/ diff --git a/src/token.rs b/src/token.rs index 3934840..dc5a261 100644 --- a/src/token.rs +++ b/src/token.rs @@ -43,18 +43,18 @@ impl AccessToken { pub fn bearer_token(&self) -> String { let mut token: String = String::from("Bearer "); token += &self.token.clone(); - return token; + token } } impl Token { pub fn _to_json(&self) -> Result { - return serde_json::to_string_pretty(&self); + serde_json::to_string_pretty(&self) } // TODO: Implement pub fn token_expired(&self) -> bool { - return false; + false } // TODO: Implement @@ -65,6 +65,6 @@ impl Token { return true; } - return false; + false } } diff --git a/src/types.rs b/src/types.rs index 1cc0995..e518320 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,8 +1,6 @@ -pub mod types { - pub enum Types { - DefaultMusicExtension, - WavExtension, - FlacExtension, - MPThreeExtension, - } +pub enum MusicTypes { + DefaultMusicExtension, + WavExtension, + FlacExtension, + MPThreeExtension, } diff --git a/src/user.rs b/src/user.rs index 04fe442..07f2a59 100644 --- a/src/user.rs +++ b/src/user.rs @@ -52,9 +52,9 @@ impl Default for User { impl User { pub fn to_json(&self, output_pretty: bool) -> Result { if output_pretty { - return serde_json::to_string_pretty(&self); + serde_json::to_string_pretty(&self) } else { - return serde_json::to_string(&self); + serde_json::to_string(&self) } } } -- 2.43.0 From e0617b3fb813d84304dd7eaf68bb90d24e568234 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 22 Mar 2025 20:30:00 +0000 Subject: [PATCH 3/6] Workflow change (#15) Reviewed-on: https://git.kundeng.us/phoenix/icarus-models/pulls/15 Co-authored-by: phoenix Co-committed-by: phoenix --- .gitea/workflows/tag_release.yaml | 2 +- .gitea/workflows/workflow.yaml | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/tag_release.yaml b/.gitea/workflows/tag_release.yaml index 0e41d99..287ac4f 100644 --- a/.gitea/workflows/tag_release.yaml +++ b/.gitea/workflows/tag_release.yaml @@ -20,7 +20,7 @@ jobs: - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: 1.85.0 components: cargo - name: Extract Version from Cargo.toml diff --git a/.gitea/workflows/workflow.yaml b/.gitea/workflows/workflow.yaml index 355ad53..c3640b8 100644 --- a/.gitea/workflows/workflow.yaml +++ b/.gitea/workflows/workflow.yaml @@ -17,6 +17,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: 1.85.0 - run: cargo check test: @@ -25,6 +27,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: 1.85.0 - run: cargo test fmt: @@ -33,6 +37,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: 1.85.0 - run: rustup component add rustfmt - run: cargo fmt --all -- --check @@ -42,6 +48,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: 1.85.0 - run: rustup component add clippy - run: cargo clippy -- -D warnings @@ -51,6 +59,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: 1.85.0 - run: cargo build -- 2.43.0 From ae2fd072293eab347ce04163c5ff34c325b19748 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 22 Mar 2025 20:31:03 +0000 Subject: [PATCH 4/6] Removing test (#14) Reviewed-on: https://git.kundeng.us/phoenix/icarus-models/pulls/14 Co-authored-by: phoenix Co-committed-by: phoenix --- src/lib.rs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index da15f76..43c2c79 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,18 +7,3 @@ pub mod song; pub mod token; pub mod types; pub mod user; - -pub fn add(left: u64, right: u64) -> u64 { - left + right -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} -- 2.43.0 From bc3aace070fea8771b2c7650e96b80c9e47cb424 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 22 Mar 2025 20:32:04 +0000 Subject: [PATCH 5/6] Added tests (#12) Reviewed-on: https://git.kundeng.us/phoenix/icarus-models/pulls/12 Co-authored-by: phoenix Co-committed-by: phoenix --- .gitignore | 1 + Cargo.toml | 1 + src/song.rs | 34 +--------- tests/97h357j59j.flac | Bin 0 -> 13795 bytes tests/album.json | 31 +++++++++ tests/tests.rs | 146 ++++++++++++++++++++++++++++++++++++++++++ tests/track01.flac | Bin 0 -> 13795 bytes tests/track02.flac | Bin 0 -> 14322 bytes tests/track03.flac | Bin 0 -> 12350 bytes 9 files changed, 180 insertions(+), 33 deletions(-) create mode 100644 tests/97h357j59j.flac create mode 100644 tests/album.json create mode 100644 tests/tests.rs create mode 100644 tests/track01.flac create mode 100644 tests/track02.flac create mode 100644 tests/track03.flac diff --git a/.gitignore b/.gitignore index ea8c4bf..96ef6c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml index 90b37f5..2e6113e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,4 @@ license = "MIT" serde = { version = "1.0.218", features = ["derive"] } serde_json = { version = "1.0.139" } rand = { version = "0.9" } +tempfile = { version = "3.19.1" } diff --git a/src/song.rs b/src/song.rs index ed62435..4d319dc 100644 --- a/src/song.rs +++ b/src/song.rs @@ -1,4 +1,3 @@ -// use std::default::Default; use std::io::Read; use crate::constants; @@ -7,7 +6,7 @@ use crate::types; use rand::Rng; use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Song { #[serde(skip_serializing_if = "is_zero")] #[serde(alias = "id")] @@ -64,37 +63,6 @@ fn is_dur_not_set(num: &i32) -> bool { *num == 0 } -/* -impl Default for Song { - fn default() -> Self { - Song { - id: 0, - title: String::new(), - artist: String::new(), - album: String::new(), - album_artist: String::new(), - genre: String::new(), - year: 0, - duration: 0, - track: 0, - disc: 0, - disc_count: 0, - track_count: 0, - audio_type: String::new(), - date_created: String::new(), - filename: String::new(), - user_id: 0, - data: Vec::new(), - directory: String::new(), - // album_id: 0, - // artist_id: 0, - // genre_id: 0, - // coverart_id: 0, - } - } -} -*/ - impl Song { pub fn to_metadata_json(&self, pretty: bool) -> Result { if pretty { diff --git a/tests/97h357j59j.flac b/tests/97h357j59j.flac new file mode 100644 index 0000000000000000000000000000000000000000..b018649c66699a09eb7e75037f1757e0ce559b8a GIT binary patch literal 13795 zcmeI2X;4=88O2{klbX2iC{1Wwh*)I_dMsE z{}*GzqsBTMj@LRnI(z=p(c$Rw@=33yj_xzBjypLZ_K@54Jol|LL%ow81+;Rs=+xHp zXTqbBVuAw)4I32bbiUx>uAYC~OXkK!yQ62%S?&stn-@FRH!?o1gJ&KcmFRW_IfI4< zIEMrT1z97{ABhv7`zxn<9Bja8FDL|^j*KRoAl+T^A*lV-$kxYwQ?Nnaa%Hq~V$~~PHzmTJxxya%d3zUDH zX7Nwzm76}cxJ{$-r3i~(I;uRai^VV3DG&6sxNU{Nd zyeAfSe4?D2VsWSMlirt&wT7WX!k3zIDNxuQI#+2Wsmp&ax_i(k2>ysyCG zSO2X1WvRu!bCl2Fc|UV2AHn-xTcqrV^YmG$JPGIRyGl6|&+E5b`A593|5D|JIFH|l z$~|%3*JmhCgPsH4QyvJt{U<3mVIKqERlbCM{rpYkuFx}JjPg9_J!qWr6YOJfgmNnO z<+T3x5PtFSQ(!mc7Vuk;k8&>jIHb4oUHJ7E?UhHuPea=%Pk`To6&=^$$6+t(pc;M+ z@mKx^dHQ95av}0IysvUQB9+fV?{O=YQ*fT~ z$;#j2yuVIRj=}f5ov7Rm-y0sKd=Yv~h*3TRy(Y#f`$Nx&`O4FwcjQpz{qW;&f|Rer zukXB}91cIfJ3@IB{61-b^4G}2$MPA;2Rk;Xxnr;2PHT)hRZ@(>9ZpQPX_9|!KeRHan zy>Xto2b34!ywRtW>+n2xlk!=-FXn{uWSnPSt#W^ycm59L80Z;WtlSNHFW9D>f_*H^ zRsI(HT9m5n4?P#JQ=SgJmt-qn#6IFSD4)T;mR?p4ho6@HNqH3f7Jox|Km3?*Q~5gl zns`Ck0Y824sd57Rmh^k&ui?iJ&noA^uOIzQ`7-jf{DE=>@|Ju{c?k0O@onYN$m@#7 z%0Z|@Jm!p@lWLL;T%h|FW z9dUFW)H=!baY{{UoMMynbsX$Y*%} z8i=})!XVe9u#Hqk{Q?@@NMjkyLS-9kSQmrQ>Bd?X%2SlKkeWUx@;aCsS-tQ;TQZblYMX(O&L zBb&ALJ?=Lnhe2+G0ynlW>d9z$V=K$xAu8P1#=6*!jyG~yC}AjZBaf96jFva@SxTj- zaif5>^*MUpC}faxaFH2BjQTCybVf1DAPHBQQNp@tjl0g+&O*6~%gorp%BjI^XY6Dt z4aaq6>|$+=$9-q)W{_veL-#Q1gXOh*SqAlTuu|5=1vz>d3#Fqxw49YQS6*AeQhF)} z+sE2Um!nrQ$e)PFRgC&^S;KyoK_6LEHR~c$R(XJhvQb1n$jbR%)^LcW6eo+SVQu-y zDr*_!hhnJj>mpgKeUyb#DyBQe%K2Pud7PybCdNI%+6oqHpJb4e zB!s6J_0|&8dX_Sij< zKM|^%X|(nYY|dOm^H*YX=2}K<8B{mZ8N!xO-CW0r6<~AbdWP^eHfL_2waef_b0f`v z6)rS4(b}PKvbmY&4}_D=3`Xo8Txe!8ge7pHnZ<~;hm*~0hHxdEZ04}~vY@)Th2{7I zR5!P>`sQPE<~EjNZ*0!YWd)yy>Si8G`mm^;&kF8~&6x!(>8aS9S;*?^0T-G@EXQcL z&@5*4J%*Fb5|(2coNR7q1$-zo#{)uw*GDfUG9$L;2-j>%^Fk;K(VEY)tmU8q;T02xkuA=z^Wexjj?J`+Z zHO+rjR(XICYcC=nWC&Nv8V)gH_heBu3}K0^vX<31UrcwH<=9(nd4$!MCC05|IsPEl zKFSL2E2cZflAbEIJkAO}FUCE=l0GcfKFR8PEFnC_a!iw$*0cJ0NRUsn9HS-b4Xofs TPY9EJ%*IYvS~&joyT0|G#2-_X literal 0 HcmV?d00001 diff --git a/tests/album.json b/tests/album.json new file mode 100644 index 0000000..7124099 --- /dev/null +++ b/tests/album.json @@ -0,0 +1,31 @@ +{ + "album": "Sample Tracks! Yes", + "album_artist": "KD", + "genre": "Country", + "year": 2025, + "track_count": 3, + "disc_count": 1, + "tracks": [ + { + "title": "E less", + "artist": "KD", + "disc": 1, + "track": 1, + "duration": 31 + }, + { + "title": "Aaaaaye", + "artist": "KD", + "disc": 1, + "track": 2, + "duration": 33 + }, + { + "title": "Check D out", + "artist": "KD", + "disc": 1, + "track": 3, + "duration": 22 + } + ] +} diff --git a/tests/tests.rs b/tests/tests.rs new file mode 100644 index 0000000..ab96494 --- /dev/null +++ b/tests/tests.rs @@ -0,0 +1,146 @@ +mod song_tests { + use std::fs; + use std::fs::File; + use std::io::{Read, Write}; + use std::path::Path; + + use tempfile::tempdir; + + use icarus_models::song; + use icarus_models::types; + + fn get_tests_directory() -> String { + String::from(env!("CARGO_MANIFEST_DIR").to_owned() + "/tests/") + } + + fn does_directory_exists(directory: &String) -> bool { + let path = Path::new(directory); + if let Ok(dir_i) = fs::metadata(path) { + dir_i.is_dir() + } else { + false + } + } + + fn extract_data_from_file(filepath: &String) -> Result, std::io::Error> { + match std::fs::File::open(filepath) { + Ok(mut file) => { + let mut buffer: Vec = Vec::new(); + let _ = file.read_to_end(&mut buffer); + Ok(buffer) + } + Err(err) => Err(err), + } + } + + #[test] + fn test_song_to_data() { + println!("Test"); + let some_val = true; + + println!("Checking if some_val is true"); + assert_eq!(true, some_val); + + println!("Getting track"); + let mut song = song::Song::default(); + song.directory = get_tests_directory(); + song.filename = String::from("track01.flac"); + + assert!( + does_directory_exists(&song.directory), + "Directory does not exist" + ); + + println!("Directory: {}", song.directory); + + match song.song_path() { + Ok(filepath) => match extract_data_from_file(&filepath) { + Ok(buffer) => { + assert_eq!(buffer.is_empty(), false); + + match song.to_data() { + Ok(song_data) => { + println!("Both files match"); + assert_eq!(buffer, song_data); + } + Err(err) => { + assert!(false, "Error producing song data: {:?}", err); + } + }; + } + Err(err) => { + assert!(false, "Failed to open file: {:?}", err); + } + }, + Err(err) => { + assert!(false, "Could not get song path: {:?}", err); + } + } + } + + #[test] + fn test_song_path_check() { + let mut song = song::Song::default(); + song.directory = get_tests_directory(); + song.filename = String::from("track01.flac"); + + assert!( + does_directory_exists(&song.directory), + "Directory does not exist" + ); + } + + #[test] + fn test_song_generate_filename() { + let mut song = song::Song::default(); + song.directory = get_tests_directory(); + song.filename = String::from("track01.flac"); + + match song.song_path() { + Ok(songpath) => match extract_data_from_file(&songpath) { + Ok(buffer) => { + let mut song_cpy = song.clone(); + let temp_dir = tempdir().expect("Failed to create temp dir"); + song_cpy.directory = match temp_dir.path().to_str() { + Some(s) => String::from(s), + None => String::new(), + }; + + assert_eq!(song.directory.is_empty(), false); + song_cpy.filename = + song.generate_filename(types::MusicTypes::FlacExtension, true); + println!("Directory: {:?}", song_cpy.directory); + println!("File to be created: {:?}", song_cpy.filename); + + let path = match song_cpy.song_path() { + Ok(s_path) => s_path, + Err(err) => { + assert!(false, "Error: {:?}", err); + String::new() + } + }; + + match File::create(path) { + Ok(mut file_cpy) => match file_cpy.write_all(&buffer) { + Ok(success) => { + println!("Success: {:?}", success); + } + Err(err) => { + assert!(false, "Error saving file: {:?}", err); + } + }, + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }, + Err(err) => { + assert!(false, "Error extracting song data: {:?}", err); + } + } + } +} diff --git a/tests/track01.flac b/tests/track01.flac new file mode 100644 index 0000000000000000000000000000000000000000..b018649c66699a09eb7e75037f1757e0ce559b8a GIT binary patch literal 13795 zcmeI2X;4=88O2{klbX2iC{1Wwh*)I_dMsE z{}*GzqsBTMj@LRnI(z=p(c$Rw@=33yj_xzBjypLZ_K@54Jol|LL%ow81+;Rs=+xHp zXTqbBVuAw)4I32bbiUx>uAYC~OXkK!yQ62%S?&stn-@FRH!?o1gJ&KcmFRW_IfI4< zIEMrT1z97{ABhv7`zxn<9Bja8FDL|^j*KRoAl+T^A*lV-$kxYwQ?Nnaa%Hq~V$~~PHzmTJxxya%d3zUDH zX7Nwzm76}cxJ{$-r3i~(I;uRai^VV3DG&6sxNU{Nd zyeAfSe4?D2VsWSMlirt&wT7WX!k3zIDNxuQI#+2Wsmp&ax_i(k2>ysyCG zSO2X1WvRu!bCl2Fc|UV2AHn-xTcqrV^YmG$JPGIRyGl6|&+E5b`A593|5D|JIFH|l z$~|%3*JmhCgPsH4QyvJt{U<3mVIKqERlbCM{rpYkuFx}JjPg9_J!qWr6YOJfgmNnO z<+T3x5PtFSQ(!mc7Vuk;k8&>jIHb4oUHJ7E?UhHuPea=%Pk`To6&=^$$6+t(pc;M+ z@mKx^dHQ95av}0IysvUQB9+fV?{O=YQ*fT~ z$;#j2yuVIRj=}f5ov7Rm-y0sKd=Yv~h*3TRy(Y#f`$Nx&`O4FwcjQpz{qW;&f|Rer zukXB}91cIfJ3@IB{61-b^4G}2$MPA;2Rk;Xxnr;2PHT)hRZ@(>9ZpQPX_9|!KeRHan zy>Xto2b34!ywRtW>+n2xlk!=-FXn{uWSnPSt#W^ycm59L80Z;WtlSNHFW9D>f_*H^ zRsI(HT9m5n4?P#JQ=SgJmt-qn#6IFSD4)T;mR?p4ho6@HNqH3f7Jox|Km3?*Q~5gl zns`Ck0Y824sd57Rmh^k&ui?iJ&noA^uOIzQ`7-jf{DE=>@|Ju{c?k0O@onYN$m@#7 z%0Z|@Jm!p@lWLL;T%h|FW z9dUFW)H=!baY{{UoMMynbsX$Y*%} z8i=})!XVe9u#Hqk{Q?@@NMjkyLS-9kSQmrQ>Bd?X%2SlKkeWUx@;aCsS-tQ;TQZblYMX(O&L zBb&ALJ?=Lnhe2+G0ynlW>d9z$V=K$xAu8P1#=6*!jyG~yC}AjZBaf96jFva@SxTj- zaif5>^*MUpC}faxaFH2BjQTCybVf1DAPHBQQNp@tjl0g+&O*6~%gorp%BjI^XY6Dt z4aaq6>|$+=$9-q)W{_veL-#Q1gXOh*SqAlTuu|5=1vz>d3#Fqxw49YQS6*AeQhF)} z+sE2Um!nrQ$e)PFRgC&^S;KyoK_6LEHR~c$R(XJhvQb1n$jbR%)^LcW6eo+SVQu-y zDr*_!hhnJj>mpgKeUyb#DyBQe%K2Pud7PybCdNI%+6oqHpJb4e zB!s6J_0|&8dX_Sij< zKM|^%X|(nYY|dOm^H*YX=2}K<8B{mZ8N!xO-CW0r6<~AbdWP^eHfL_2waef_b0f`v z6)rS4(b}PKvbmY&4}_D=3`Xo8Txe!8ge7pHnZ<~;hm*~0hHxdEZ04}~vY@)Th2{7I zR5!P>`sQPE<~EjNZ*0!YWd)yy>Si8G`mm^;&kF8~&6x!(>8aS9S;*?^0T-G@EXQcL z&@5*4J%*Fb5|(2coNR7q1$-zo#{)uw*GDfUG9$L;2-j>%^Fk;K(VEY)tmU8q;T02xkuA=z^Wexjj?J`+Z zHO+rjR(XICYcC=nWC&Nv8V)gH_heBu3}K0^vX<31UrcwH<=9(nd4$!MCC05|IsPEl zKFSL2E2cZflAbEIJkAO}FUCE=l0GcfKFR8PEFnC_a!iw$*0cJ0NRUsn9HS-b4Xofs TPY9EJ%*IYvS~&joyT0|G#2-_X literal 0 HcmV?d00001 diff --git a/tests/track02.flac b/tests/track02.flac new file mode 100644 index 0000000000000000000000000000000000000000..3dfdbdb171d81ae387d33754fc1e1eec2236f690 GIT binary patch literal 14322 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 Date: Sat, 22 Mar 2025 21:19:07 +0000 Subject: [PATCH 6/6] Adding album tests (#13) Reviewed-on: https://git.kundeng.us/phoenix/icarus-models/pulls/13 Co-authored-by: phoenix Co-committed-by: phoenix --- src/album.rs | 18 +++++++++-- tests/97h357j59j.flac | Bin 13795 -> 0 bytes tests/tests.rs | 69 +++++++++++++++++++++++++++++++----------- 3 files changed, 67 insertions(+), 20 deletions(-) delete mode 100644 tests/97h357j59j.flac diff --git a/src/album.rs b/src/album.rs index f0db09b..356d23b 100644 --- a/src/album.rs +++ b/src/album.rs @@ -1,15 +1,29 @@ pub mod collection { use serde::{Deserialize, Serialize}; + use std::default::Default; + + use std::fs::File; + use std::io::BufReader; fn is_set(num: &i32) -> bool { *num >= 0 } - #[derive(Clone, Debug, Deserialize, Serialize)] + pub fn parse_album(filepath: &String) -> Result { + let file = File::open(filepath).expect("Failed to open file"); + let reader = BufReader::new(file); + + serde_json::from_reader(reader) + } + + #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Album { #[serde(skip_serializing_if = "String::is_empty")] #[serde(alias = "album")] pub title: String, + #[serde(skip_serializing_if = "String::is_empty")] + #[serde(alias = "album_artist")] + pub artist: String, pub genre: String, pub year: i32, pub track_count: i32, @@ -19,7 +33,7 @@ pub mod collection { pub tracks: Vec, } - #[derive(Clone, Debug, Deserialize, Serialize)] + #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Track { pub title: String, pub artist: String, diff --git a/tests/97h357j59j.flac b/tests/97h357j59j.flac deleted file mode 100644 index b018649c66699a09eb7e75037f1757e0ce559b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13795 zcmeI2X;4=88O2{klbX2iC{1Wwh*)I_dMsE z{}*GzqsBTMj@LRnI(z=p(c$Rw@=33yj_xzBjypLZ_K@54Jol|LL%ow81+;Rs=+xHp zXTqbBVuAw)4I32bbiUx>uAYC~OXkK!yQ62%S?&stn-@FRH!?o1gJ&KcmFRW_IfI4< zIEMrT1z97{ABhv7`zxn<9Bja8FDL|^j*KRoAl+T^A*lV-$kxYwQ?Nnaa%Hq~V$~~PHzmTJxxya%d3zUDH zX7Nwzm76}cxJ{$-r3i~(I;uRai^VV3DG&6sxNU{Nd zyeAfSe4?D2VsWSMlirt&wT7WX!k3zIDNxuQI#+2Wsmp&ax_i(k2>ysyCG zSO2X1WvRu!bCl2Fc|UV2AHn-xTcqrV^YmG$JPGIRyGl6|&+E5b`A593|5D|JIFH|l z$~|%3*JmhCgPsH4QyvJt{U<3mVIKqERlbCM{rpYkuFx}JjPg9_J!qWr6YOJfgmNnO z<+T3x5PtFSQ(!mc7Vuk;k8&>jIHb4oUHJ7E?UhHuPea=%Pk`To6&=^$$6+t(pc;M+ z@mKx^dHQ95av}0IysvUQB9+fV?{O=YQ*fT~ z$;#j2yuVIRj=}f5ov7Rm-y0sKd=Yv~h*3TRy(Y#f`$Nx&`O4FwcjQpz{qW;&f|Rer zukXB}91cIfJ3@IB{61-b^4G}2$MPA;2Rk;Xxnr;2PHT)hRZ@(>9ZpQPX_9|!KeRHan zy>Xto2b34!ywRtW>+n2xlk!=-FXn{uWSnPSt#W^ycm59L80Z;WtlSNHFW9D>f_*H^ zRsI(HT9m5n4?P#JQ=SgJmt-qn#6IFSD4)T;mR?p4ho6@HNqH3f7Jox|Km3?*Q~5gl zns`Ck0Y824sd57Rmh^k&ui?iJ&noA^uOIzQ`7-jf{DE=>@|Ju{c?k0O@onYN$m@#7 z%0Z|@Jm!p@lWLL;T%h|FW z9dUFW)H=!baY{{UoMMynbsX$Y*%} z8i=})!XVe9u#Hqk{Q?@@NMjkyLS-9kSQmrQ>Bd?X%2SlKkeWUx@;aCsS-tQ;TQZblYMX(O&L zBb&ALJ?=Lnhe2+G0ynlW>d9z$V=K$xAu8P1#=6*!jyG~yC}AjZBaf96jFva@SxTj- zaif5>^*MUpC}faxaFH2BjQTCybVf1DAPHBQQNp@tjl0g+&O*6~%gorp%BjI^XY6Dt z4aaq6>|$+=$9-q)W{_veL-#Q1gXOh*SqAlTuu|5=1vz>d3#Fqxw49YQS6*AeQhF)} z+sE2Um!nrQ$e)PFRgC&^S;KyoK_6LEHR~c$R(XJhvQb1n$jbR%)^LcW6eo+SVQu-y zDr*_!hhnJj>mpgKeUyb#DyBQe%K2Pud7PybCdNI%+6oqHpJb4e zB!s6J_0|&8dX_Sij< zKM|^%X|(nYY|dOm^H*YX=2}K<8B{mZ8N!xO-CW0r6<~AbdWP^eHfL_2waef_b0f`v z6)rS4(b}PKvbmY&4}_D=3`Xo8Txe!8ge7pHnZ<~;hm*~0hHxdEZ04}~vY@)Th2{7I zR5!P>`sQPE<~EjNZ*0!YWd)yy>Si8G`mm^;&kF8~&6x!(>8aS9S;*?^0T-G@EXQcL z&@5*4J%*Fb5|(2coNR7q1$-zo#{)uw*GDfUG9$L;2-j>%^Fk;K(VEY)tmU8q;T02xkuA=z^Wexjj?J`+Z zHO+rjR(XICYcC=nWC&Nv8V)gH_heBu3}K0^vX<31UrcwH<=9(nd4$!MCC05|IsPEl zKFSL2E2cZflAbEIJkAO}FUCE=l0GcfKFR8PEFnC_a!iw$*0cJ0NRUsn9HS-b4Xofs TPY9EJ%*IYvS~&joyT0|G#2-_X diff --git a/tests/tests.rs b/tests/tests.rs index ab96494..7df899b 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1,19 +1,13 @@ -mod song_tests { +mod utils { use std::fs; - use std::fs::File; - use std::io::{Read, Write}; + use std::io::Read; use std::path::Path; - use tempfile::tempdir; - - use icarus_models::song; - use icarus_models::types; - - fn get_tests_directory() -> String { + pub fn get_tests_directory() -> String { String::from(env!("CARGO_MANIFEST_DIR").to_owned() + "/tests/") } - fn does_directory_exists(directory: &String) -> bool { + pub fn does_directory_exists(directory: &String) -> bool { let path = Path::new(directory); if let Ok(dir_i) = fs::metadata(path) { dir_i.is_dir() @@ -22,7 +16,7 @@ mod song_tests { } } - fn extract_data_from_file(filepath: &String) -> Result, std::io::Error> { + pub fn extract_data_from_file(filepath: &String) -> Result, std::io::Error> { match std::fs::File::open(filepath) { Ok(mut file) => { let mut buffer: Vec = Vec::new(); @@ -32,6 +26,18 @@ mod song_tests { Err(err) => Err(err), } } +} + +mod song_tests { + use std::fs::File; + use std::io::Write; + + use tempfile::tempdir; + + use icarus_models::song; + use icarus_models::types; + + use crate::utils; #[test] fn test_song_to_data() { @@ -43,18 +49,18 @@ mod song_tests { println!("Getting track"); let mut song = song::Song::default(); - song.directory = get_tests_directory(); + song.directory = utils::get_tests_directory(); song.filename = String::from("track01.flac"); assert!( - does_directory_exists(&song.directory), + utils::does_directory_exists(&song.directory), "Directory does not exist" ); println!("Directory: {}", song.directory); match song.song_path() { - Ok(filepath) => match extract_data_from_file(&filepath) { + Ok(filepath) => match utils::extract_data_from_file(&filepath) { Ok(buffer) => { assert_eq!(buffer.is_empty(), false); @@ -81,11 +87,11 @@ mod song_tests { #[test] fn test_song_path_check() { let mut song = song::Song::default(); - song.directory = get_tests_directory(); + song.directory = utils::get_tests_directory(); song.filename = String::from("track01.flac"); assert!( - does_directory_exists(&song.directory), + utils::does_directory_exists(&song.directory), "Directory does not exist" ); } @@ -93,11 +99,11 @@ mod song_tests { #[test] fn test_song_generate_filename() { let mut song = song::Song::default(); - song.directory = get_tests_directory(); + song.directory = utils::get_tests_directory(); song.filename = String::from("track01.flac"); match song.song_path() { - Ok(songpath) => match extract_data_from_file(&songpath) { + Ok(songpath) => match utils::extract_data_from_file(&songpath) { Ok(buffer) => { let mut song_cpy = song.clone(); let temp_dir = tempdir().expect("Failed to create temp dir"); @@ -144,3 +150,30 @@ mod song_tests { } } } + +mod album_tests { + + use crate::utils; + use icarus_models::album; + + #[test] + fn parse_album() { + let test_dir = utils::get_tests_directory(); + if utils::does_directory_exists(&test_dir) { + let album_file: String = test_dir + &String::from("album.json"); + println!("Album file: {:?}", album_file); + + match album::collection::parse_album(&album_file) { + Ok(album) => { + println!("Album title: {}", album.title); + assert_eq!(album.title.is_empty(), false); + assert_eq!(album.artist.is_empty(), false); + assert_eq!(album.tracks.is_empty(), false); + } + Err(err) => { + assert!(false, "Error parsing album json file: {:?}", err); + } + } + } + } +} -- 2.43.0