fix: Sonarr CLI was not properly filtering out episode and season releases when manually searching for releases

This commit is contained in:
2026-01-19 14:49:17 -07:00
parent 7bb5f83a56
commit 5fa9b08347
2 changed files with 44 additions and 10 deletions
@@ -75,11 +75,21 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrManualSearchCommand>
let result = match self.command { let result = match self.command {
SonarrManualSearchCommand::Episode { episode_id } => { SonarrManualSearchCommand::Episode { episode_id } => {
println!("Searching for episode releases. This may take a minute..."); println!("Searching for episode releases. This may take a minute...");
let resp = self match self
.network .network
.handle_network_event(SonarrEvent::GetEpisodeReleases(episode_id).into()) .handle_network_event(SonarrEvent::GetEpisodeReleases(episode_id).into())
.await?; .await
serde_json::to_string_pretty(&resp)? {
Ok(Serdeable::Sonarr(SonarrSerdeable::Releases(releases_vec))) => {
let seasons_vec: Vec<SonarrRelease> = releases_vec
.into_iter()
.filter(|release| !release.full_season)
.collect();
serde_json::to_string_pretty(&seasons_vec)?
}
Err(e) => return Err(e),
_ => serde_json::to_string_pretty(&json!({"message": "Failed to parse response"}))?,
}
} }
SonarrManualSearchCommand::Season { SonarrManualSearchCommand::Season {
series_id, series_id,
@@ -108,9 +108,13 @@ mod tests {
use std::sync::Arc; use std::sync::Arc;
use mockall::predicate::eq; use mockall::predicate::eq;
use serde_json::json; use pretty_assertions::assert_str_eq;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use crate::models::sonarr_models::SonarrRelease;
use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{
torrent_release, usenet_release,
};
use crate::{ use crate::{
app::App, app::App,
cli::{ cli::{
@@ -134,9 +138,13 @@ mod tests {
)) ))
.times(1) .times(1)
.returning(|_| { .returning(|_| {
Ok(Serdeable::Sonarr(SonarrSerdeable::Value( Ok(Serdeable::Sonarr(SonarrSerdeable::Releases(vec![
json!({"testResponse": "response"}), torrent_release(),
))) SonarrRelease {
full_season: true,
..usenet_release()
},
])))
}); });
let app_arc = Arc::new(Mutex::new(App::test_default())); let app_arc = Arc::new(Mutex::new(App::test_default()));
let manual_episode_search_command = SonarrManualSearchCommand::Episode { episode_id: 1 }; let manual_episode_search_command = SonarrManualSearchCommand::Episode { episode_id: 1 };
@@ -150,10 +158,18 @@ mod tests {
.await; .await;
assert_ok!(&result); assert_ok!(&result);
assert_str_eq!(
result.unwrap(),
serde_json::to_string_pretty(&[torrent_release()]).unwrap()
);
} }
#[tokio::test] #[tokio::test]
async fn test_manual_season_search_command() { async fn test_manual_season_search_command() {
let expected_release = SonarrRelease {
full_season: true,
..usenet_release()
};
let expected_series_id = 1; let expected_series_id = 1;
let expected_season_number = 1; let expected_season_number = 1;
let mut mock_network = MockNetworkTrait::new(); let mut mock_network = MockNetworkTrait::new();
@@ -164,9 +180,13 @@ mod tests {
)) ))
.times(1) .times(1)
.returning(|_| { .returning(|_| {
Ok(Serdeable::Sonarr(SonarrSerdeable::Value( Ok(Serdeable::Sonarr(SonarrSerdeable::Releases(vec![
json!({"testResponse": "response"}), torrent_release(),
))) SonarrRelease {
full_season: true,
..usenet_release()
},
])))
}); });
let app_arc = Arc::new(Mutex::new(App::test_default())); let app_arc = Arc::new(Mutex::new(App::test_default()));
let manual_season_search_command = SonarrManualSearchCommand::Season { let manual_season_search_command = SonarrManualSearchCommand::Season {
@@ -183,6 +203,10 @@ mod tests {
.await; .await;
assert_ok!(&result); assert_ok!(&result);
assert_str_eq!(
result.unwrap(),
serde_json::to_string_pretty(&[expected_release]).unwrap()
);
} }
} }
} }