fix(sonarr): Pass series ID and season number alongside all ManualSeasonSearch events when publishing to the networking channel

This commit is contained in:
2024-12-18 00:32:36 -07:00
parent f655ca989d
commit f7315a3bec
6 changed files with 28 additions and 225 deletions
+4 -1
View File
@@ -68,7 +68,10 @@ impl<'a> App<'a> {
match self.data.sonarr_data.season_details_modal.as_ref() {
Some(season_details_modal) if season_details_modal.season_releases.is_empty() => {
self
.dispatch_network_event(SonarrEvent::GetSeasonReleases(None).into())
.dispatch_network_event(
SonarrEvent::GetSeasonReleases(self.extract_series_id_season_number_tuple().await)
.into(),
)
.await;
}
_ => (),
+9 -1
View File
@@ -154,6 +154,14 @@ mod tests {
async fn test_dispatch_by_manual_season_search_block() {
let (mut app, mut sync_network_rx) = construct_app_unit();
app.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default());
app.data.sonarr_data.series.set_items(vec![Series {
id: 1,
..Series::default()
}]);
app.data.sonarr_data.seasons.set_items(vec![Season {
season_number: 1,
..Season::default()
}]);
app
.dispatch_by_sonarr_block(&ActiveSonarrBlock::ManualSeasonSearch)
@@ -162,7 +170,7 @@ mod tests {
assert!(app.is_loading);
assert_eq!(
sync_network_rx.recv().await.unwrap(),
SonarrEvent::GetSeasonReleases(None).into()
SonarrEvent::GetSeasonReleases((1, 1)).into()
);
assert!(!app.data.sonarr_data.prompt_confirm);
assert_eq!(app.tick_count, 0);
@@ -86,9 +86,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrManualSearchCommand>
println!("Searching for season releases. This may take a minute...");
let resp = self
.network
.handle_network_event(
SonarrEvent::GetSeasonReleases(Some((series_id, season_number))).into(),
)
.handle_network_event(SonarrEvent::GetSeasonReleases((series_id, season_number)).into())
.await?;
serde_json::to_string_pretty(&resp)?
}
@@ -160,7 +160,7 @@ mod tests {
mock_network
.expect_handle_network_event()
.with(eq::<NetworkEvent>(
SonarrEvent::GetSeasonReleases(Some((expected_series_id, expected_season_number))).into(),
SonarrEvent::GetSeasonReleases((expected_series_id, expected_season_number)).into(),
))
.times(1)
.returning(|_| {
+8 -14
View File
@@ -71,7 +71,7 @@ pub enum SonarrEvent {
GetRootFolders,
GetEpisodeReleases(i64),
GetSeasonHistory((i64, i64)),
GetSeasonReleases(Option<(i64, i64)>),
GetSeasonReleases((i64, i64)),
GetSecurityConfig,
GetSeriesDetails(Option<i64>),
GetSeriesHistory(Option<i64>),
@@ -1668,19 +1668,10 @@ impl<'a, 'b> Network<'a, 'b> {
async fn get_season_releases(
&mut self,
series_season_id_tuple: Option<(i64, i64)>,
series_season_id_tuple: (i64, i64),
) -> Result<Vec<SonarrRelease>> {
let event = SonarrEvent::GetSeasonReleases(None);
let (series_id, season_number) =
if let Some((series_id, season_number)) = series_season_id_tuple {
(Some(series_id), Some(season_number))
} else {
(None, None)
};
let (series_id, series_id_param) = self.extract_series_id(series_id).await;
let (season_number, season_number_param) = self.extract_season_number(season_number).await?;
let event = SonarrEvent::GetSeasonReleases(series_season_id_tuple);
let (series_id, season_number) = series_season_id_tuple;
info!("Fetching releases for series with ID: {series_id} and season number: {season_number}");
let request_props = self
@@ -1689,7 +1680,10 @@ impl<'a, 'b> Network<'a, 'b> {
RequestMethod::Get,
None::<()>,
None,
Some(format!("{}&{}", series_id_param, season_number_param)),
Some(format!(
"seriesId={}&seasonNumber={}",
series_id, season_number
)),
)
.await;
+5 -205
View File
@@ -257,7 +257,7 @@ mod test {
#[rstest]
fn test_resource_release(
#[values(
SonarrEvent::GetSeasonReleases(None),
SonarrEvent::GetSeasonReleases((0, 0)),
SonarrEvent::GetEpisodeReleases(0)
)]
event: SonarrEvent,
@@ -3744,7 +3744,7 @@ mod test {
None,
Some(release_json),
None,
SonarrEvent::GetSeasonReleases(None),
SonarrEvent::GetSeasonReleases((1, 1)),
None,
Some("seriesId=1&seasonNumber=1"),
)
@@ -3768,7 +3768,7 @@ mod test {
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
if let SonarrSerdeable::Releases(releases_vec) = network
.handle_sonarr_event(SonarrEvent::GetSeasonReleases(None))
.handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1)))
.await
.unwrap()
{
@@ -3834,7 +3834,7 @@ mod test {
None,
Some(release_json),
None,
SonarrEvent::GetSeasonReleases(None),
SonarrEvent::GetSeasonReleases((1, 1)),
None,
Some("seriesId=1&seasonNumber=1"),
)
@@ -3856,7 +3856,7 @@ mod test {
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
assert!(network
.handle_sonarr_event(SonarrEvent::GetSeasonReleases(None))
.handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1)))
.await
.is_ok());
@@ -3876,206 +3876,6 @@ mod test {
);
}
#[tokio::test]
async fn test_handle_get_season_releases_event_uses_provided_series_id_and_season_number() {
let release_json = json!([
{
"guid": "1234",
"protocol": "torrent",
"age": 1,
"title": "Test Release",
"indexer": "kickass torrents",
"indexerId": 2,
"size": 1234,
"rejected": true,
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
"fullSeason": true
},
{
"guid": "4567",
"protocol": "torrent",
"age": 1,
"title": "Test Release",
"indexer": "kickass torrents",
"indexerId": 2,
"size": 1234,
"rejected": true,
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
}
]);
let expected_filtered_sonarr_release = SonarrRelease {
full_season: true,
..release()
};
let expected_raw_sonarr_releases = vec![
SonarrRelease {
full_season: true,
..release()
},
SonarrRelease {
guid: "4567".to_owned(),
..release()
},
];
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Get,
None,
Some(release_json),
None,
SonarrEvent::GetSeasonReleases(None),
None,
Some("seriesId=2&seasonNumber=2"),
)
.await;
app_arc
.lock()
.await
.data
.sonarr_data
.series
.set_items(vec![series()]);
app_arc
.lock()
.await
.data
.sonarr_data
.seasons
.set_items(vec![season()]);
app_arc.lock().await.data.sonarr_data.season_details_modal =
Some(SeasonDetailsModal::default());
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
if let SonarrSerdeable::Releases(releases_vec) = network
.handle_sonarr_event(SonarrEvent::GetSeasonReleases(Some((2, 2))))
.await
.unwrap()
{
async_server.assert_async().await;
assert_eq!(
app_arc
.lock()
.await
.data
.sonarr_data
.season_details_modal
.as_ref()
.unwrap()
.season_releases
.items,
vec![expected_filtered_sonarr_release]
);
assert_eq!(releases_vec, expected_raw_sonarr_releases);
}
}
#[tokio::test]
async fn test_handle_get_season_releases_event_filtered_series_and_filtered_seasons() {
let release_json = json!([
{
"guid": "1234",
"protocol": "torrent",
"age": 1,
"title": "Test Release",
"indexer": "kickass torrents",
"indexerId": 2,
"size": 1234,
"rejected": true,
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
"fullSeason": true
},
{
"guid": "4567",
"protocol": "torrent",
"age": 1,
"title": "Test Release",
"indexer": "kickass torrents",
"indexerId": 2,
"size": 1234,
"rejected": true,
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "id": 1, "name": "English" } ],
"quality": { "quality": { "name": "Bluray-1080p" }},
}
]);
let expected_filtered_sonarr_release = SonarrRelease {
full_season: true,
..release()
};
let expected_raw_sonarr_releases = vec![
SonarrRelease {
full_season: true,
..release()
},
SonarrRelease {
guid: "4567".to_owned(),
..release()
},
];
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Get,
None,
Some(release_json),
None,
SonarrEvent::GetSeasonReleases(None),
None,
Some("seriesId=1&seasonNumber=1"),
)
.await;
let mut filtered_series = StatefulTable::default();
filtered_series.set_items(vec![Series::default()]);
filtered_series.set_filtered_items(vec![Series {
id: 1,
..Series::default()
}]);
app_arc.lock().await.data.sonarr_data.series = filtered_series;
let mut filtered_seasons = StatefulTable::default();
filtered_seasons.set_items(vec![Season::default()]);
filtered_seasons.set_filtered_items(vec![Season {
season_number: 1,
..Season::default()
}]);
app_arc.lock().await.data.sonarr_data.seasons = filtered_seasons;
app_arc.lock().await.data.sonarr_data.season_details_modal =
Some(SeasonDetailsModal::default());
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
if let SonarrSerdeable::Releases(releases_vec) = network
.handle_sonarr_event(SonarrEvent::GetSeasonReleases(None))
.await
.unwrap()
{
async_server.assert_async().await;
assert_eq!(
app_arc
.lock()
.await
.data
.sonarr_data
.season_details_modal
.as_ref()
.unwrap()
.season_releases
.items,
vec![expected_filtered_sonarr_release]
);
assert_eq!(releases_vec, expected_raw_sonarr_releases);
}
}
#[rstest]
#[tokio::test]
async fn test_handle_list_series_event(#[values(true, false)] use_custom_sorting: bool) {