Updated Ratatui, created custom deserialization logic for i64s to make life easier, and used string interpolation where possible to reduce the lines needed to write log messages or create formatted text

This commit is contained in:
2023-09-07 17:20:38 -06:00
parent e13d1ece58
commit b16a58deae
43 changed files with 426 additions and 536 deletions
+9 -19
View File
@@ -63,7 +63,7 @@ impl<'a, 'b> Network<'a, 'b> {
let request_uri = request_props.uri.clone();
select! {
_ = self.cancellation_token.cancelled() => {
warn!("Received Cancel request. Cancelling request to: {}", request_uri);
warn!("Received Cancel request. Cancelling request to: {request_uri}");
let mut app = self.app.lock().await;
self.cancellation_token = app.reset_cancellation_token();
app.is_loading = false;
@@ -80,12 +80,12 @@ impl<'a, 'b> Network<'a, 'b> {
app_update_fn(value, app);
}
Err(e) => {
error!("Failed to parse response! {:?}", e);
error!("Failed to parse response! {e:?}");
self
.app
.lock()
.await
.handle_error(anyhow!("Failed to parse response! {:?}", e));
.handle_error(anyhow!("Failed to parse response! {e:?}"));
}
}
}
@@ -99,24 +99,17 @@ impl<'a, 'b> Network<'a, 'b> {
.replace_all(&response_body.replace('\n', " "), " ")
.to_string();
error!(
"Request failed. Received {} response code with body: {}",
status, response_body
);
self.app.lock().await.handle_error(anyhow!(
"Request failed. Received {} response code with body: {}",
status,
error_body
));
error!("Request failed. Received {status} response code with body: {response_body}");
self.app.lock().await.handle_error(anyhow!("Request failed. Received {status} response code with body: {error_body}"));
}
}
Err(e) => {
error!("Failed to send request. {:?}", e);
error!("Failed to send request. {e:?}");
self
.app
.lock()
.await
.handle_error(anyhow!("Failed to send request. {} ", e));
.handle_error(anyhow!("Failed to send request. {e} "));
}
}
}
@@ -133,11 +126,8 @@ impl<'a, 'b> Network<'a, 'b> {
body,
api_token,
} = request_props;
debug!("Creating RequestBuilder for resource: {:?}", uri);
debug!(
"Sending {:?} request to {} with body {:?}",
method, uri, body
);
debug!("Creating RequestBuilder for resource: {uri:?}");
debug!("Sending {method:?} request to {uri} with body {body:?}");
match method {
RequestMethod::Get => self.client.get(uri).header("X-Api-Key", api_token),
+83 -185
View File
@@ -4,7 +4,7 @@ use std::fmt::Debug;
use indoc::formatdoc;
use log::{debug, info, warn};
use serde::Serialize;
use serde_json::{json, Number, Value};
use serde_json::{json, Value};
use urlencoding::encode;
use crate::app::RadarrConfig;
@@ -226,7 +226,7 @@ impl<'a, 'b> Network<'a, 'b> {
app.data.radarr_data.add_movie_modal = None;
AddMovieBody {
tmdb_id: tmdb_id.as_u64().unwrap(),
tmdb_id,
title,
root_folder_path: path,
minimum_availability,
@@ -240,7 +240,7 @@ impl<'a, 'b> Network<'a, 'b> {
}
};
debug!("Add movie body: {:?}", body);
debug!("Add movie body: {body:?}");
let request_props = self
.radarr_request_props_from(
@@ -273,7 +273,7 @@ impl<'a, 'b> Network<'a, 'b> {
AddRootFolderBody { path }
};
debug!("Add root folder body: {:?}", body);
debug!("Add root folder body: {body:?}");
let request_props = self
.radarr_request_props_from(
@@ -301,11 +301,7 @@ impl<'a, 'b> Network<'a, 'b> {
self
.handle_request::<Value, Tag>(request_props, |tag, mut app| {
app
.data
.radarr_data
.tags_map
.insert(tag.id.as_u64().unwrap(), tag.label);
app.data.radarr_data.tags_map.insert(tag.id, tag.label);
})
.await;
}
@@ -319,18 +315,13 @@ impl<'a, 'b> Network<'a, 'b> {
.radarr_data
.downloads
.current_selection()
.id
.as_u64()
.unwrap();
.id;
info!(
"Deleting Radarr download for download with id: {}",
download_id
);
info!("Deleting Radarr download for download with id: {download_id}");
let request_props = self
.radarr_request_props_from(
format!("{}/{}", RadarrEvent::DeleteDownload.resource(), download_id).as_str(),
format!("{}/{download_id}", RadarrEvent::DeleteDownload.resource()).as_str(),
RequestMethod::Delete,
None::<()>,
)
@@ -350,18 +341,13 @@ impl<'a, 'b> Network<'a, 'b> {
.radarr_data
.indexers
.current_selection()
.id
.as_u64()
.unwrap();
.id;
info!(
"Deleting Radarr indexer for indexer with id: {}",
indexer_id
);
info!("Deleting Radarr indexer for indexer with id: {indexer_id}");
let request_props = self
.radarr_request_props_from(
format!("{}/{}", RadarrEvent::DeleteIndexer.resource(), indexer_id).as_str(),
format!("{}/{indexer_id}", RadarrEvent::DeleteIndexer.resource()).as_str(),
RequestMethod::Delete,
None::<()>,
)
@@ -377,19 +363,13 @@ impl<'a, 'b> Network<'a, 'b> {
let delete_files = self.app.lock().await.data.radarr_data.delete_movie_files;
let add_import_exclusion = self.app.lock().await.data.radarr_data.add_list_exclusion;
info!(
"Deleting Radarr movie with tmdb_id {} and Radarr id: {} with deleteFiles={} and addImportExclusion={}",
tmdb_id, movie_id, delete_files, add_import_exclusion
);
info!("Deleting Radarr movie with tmdb_id {tmdb_id} and Radarr id: {movie_id} with deleteFiles={delete_files} and addImportExclusion={add_import_exclusion}");
let request_props = self
.radarr_request_props_from(
format!(
"{}/{}?deleteFiles={}&addImportExclusion={}",
RadarrEvent::DeleteMovie.resource(),
movie_id,
delete_files,
add_import_exclusion
"{}/{movie_id}?deleteFiles={delete_files}&addImportExclusion={add_import_exclusion}",
RadarrEvent::DeleteMovie.resource()
)
.as_str(),
RequestMethod::Delete,
@@ -419,21 +399,15 @@ impl<'a, 'b> Network<'a, 'b> {
.radarr_data
.root_folders
.current_selection()
.id
.as_u64()
.unwrap();
.id;
info!(
"Deleting Radarr root folder for folder with id: {}",
root_folder_id
);
info!("Deleting Radarr root folder for folder with id: {root_folder_id}");
let request_props = self
.radarr_request_props_from(
format!(
"{}/{}",
RadarrEvent::DeleteRootFolder.resource(),
root_folder_id
"{}/{root_folder_id}",
RadarrEvent::DeleteRootFolder.resource()
)
.as_str(),
RequestMethod::Delete,
@@ -464,10 +438,10 @@ impl<'a, 'b> Network<'a, 'b> {
.movie_releases
.current_selection();
(guid.clone(), title.clone(), indexer_id.as_u64().unwrap())
(guid.clone(), title.clone(), *indexer_id)
};
info!("Downloading release: {}", title);
info!("Downloading release: {title}");
let download_release_body = ReleaseDownloadBody {
guid,
@@ -495,12 +469,7 @@ impl<'a, 'b> Network<'a, 'b> {
let collection_id = self.extract_collection_id().await;
let request_props = self
.radarr_request_props_from(
format!(
"{}/{}",
RadarrEvent::GetCollections.resource(),
collection_id
)
.as_str(),
format!("{}/{collection_id}", RadarrEvent::GetCollections.resource()).as_str(),
RequestMethod::Get,
None::<()>,
)
@@ -557,16 +526,11 @@ impl<'a, 'b> Network<'a, 'b> {
detailed_collection_body
};
debug!("Edit collection body: {:?}", body);
debug!("Edit collection body: {body:?}");
let request_props = self
.radarr_request_props_from(
format!(
"{}/{}",
RadarrEvent::EditCollection.resource(),
collection_id
)
.as_str(),
format!("{}/{collection_id}", RadarrEvent::EditCollection.resource()).as_str(),
RequestMethod::Put,
Some(body),
)
@@ -585,7 +549,7 @@ impl<'a, 'b> Network<'a, 'b> {
let request_props = self
.radarr_request_props_from(
format!("{}/{}", RadarrEvent::GetMovieDetails.resource(), movie_id).as_str(),
format!("{}/{movie_id}", RadarrEvent::GetMovieDetails.resource()).as_str(),
RequestMethod::Get,
None::<()>,
)
@@ -648,11 +612,11 @@ impl<'a, 'b> Network<'a, 'b> {
detailed_movie_body
};
debug!("Edit movie body: {:?}", body);
debug!("Edit movie body: {body:?}");
let request_props = self
.radarr_request_props_from(
format!("{}/{}", RadarrEvent::EditMovie.resource(), movie_id).as_str(),
format!("{}/{movie_id}", RadarrEvent::EditMovie.resource()).as_str(),
RequestMethod::Put,
Some(body),
)
@@ -858,7 +822,7 @@ impl<'a, 'b> Network<'a, 'b> {
let request_props = self
.radarr_request_props_from(
format!("{}/{}", RadarrEvent::GetMovieDetails.resource(), movie_id).as_str(),
format!("{}/{movie_id}", RadarrEvent::GetMovieDetails.resource()).as_str(),
RequestMethod::Get,
None::<()>,
)
@@ -884,43 +848,43 @@ impl<'a, 'b> Network<'a, 'b> {
collection,
..
} = movie_response;
let (hours, minutes) = convert_runtime(runtime.as_u64().unwrap());
let size = convert_to_gb(size_on_disk.as_u64().unwrap());
let (hours, minutes) = convert_runtime(runtime);
let size = convert_to_gb(size_on_disk);
let quality_profile = app
.data
.radarr_data
.quality_profile_map
.get_by_left(&quality_profile_id.as_u64().unwrap())
.get_by_left(&quality_profile_id)
.unwrap()
.to_owned();
let imdb_rating = if let Some(rating) = ratings.imdb {
if let Some(value) = rating.value.as_f64() {
format!("{:.1}", value)
} else {
"".to_owned()
String::new()
}
} else {
"".to_owned()
String::new()
};
let tmdb_rating = if let Some(rating) = ratings.tmdb {
if let Some(value) = rating.value.as_f64() {
format!("{}%", (value * 10f64).ceil())
} else {
"".to_owned()
String::new()
}
} else {
"".to_owned()
String::new()
};
let rotten_tomatoes_rating = if let Some(rating) = ratings.rotten_tomatoes {
if let Some(value) = rating.value.as_u64() {
format!("{}%", value)
} else {
"".to_owned()
String::new()
}
} else {
"".to_owned()
String::new()
};
let status = get_movie_status(has_file, &app.data.radarr_data.downloads.items, id);
@@ -928,36 +892,23 @@ impl<'a, 'b> Network<'a, 'b> {
let mut movie_details_modal = MovieDetailsModal {
movie_details: ScrollableText::with_string(formatdoc!(
"Title: {}
Year: {}
Runtime: {}h {}m
"Title: {title}
Year: {year}
Runtime: {hours}h {minutes}m
Rating: {}
Collection: {}
Status: {}
Description: {}
TMDB: {}
IMDB: {}
Rotten Tomatoes: {}
Quality Profile: {}
Size: {:.2} GB
Path: {}
Studio: {}
Status: {status}
Description: {overview}
TMDB: {tmdb_rating}
IMDB: {imdb_rating}
Rotten Tomatoes: {rotten_tomatoes_rating}
Quality Profile: {quality_profile}
Size: {size:.2} GB
Path: {path}
Studio: {studio}
Genres: {}",
title,
year,
hours,
minutes,
certification.unwrap_or_default(),
collection.title,
status,
overview,
tmdb_rating,
imdb_rating,
rotten_tomatoes_rating,
quality_profile,
size,
path,
studio,
genres.join(", ")
)),
..MovieDetailsModal::default()
@@ -967,11 +918,10 @@ impl<'a, 'b> Network<'a, 'b> {
movie_details_modal.file_details = formatdoc!(
"Relative Path: {}
Absolute Path: {}
Size: {:.2} GB
Size: {size:.2} GB
Date Added: {}",
file.relative_path,
file.path,
size,
file.date_added
);
@@ -982,11 +932,11 @@ impl<'a, 'b> Network<'a, 'b> {
Codec: {}
Languages: {}
Stream Count: {}",
media_info.audio_bitrate.as_u64().unwrap(),
media_info.audio_bitrate,
media_info.audio_channels.as_f64().unwrap(),
media_info.audio_codec.unwrap_or_default(),
media_info.audio_languages.unwrap_or_default(),
media_info.audio_stream_count.as_u64().unwrap()
media_info.audio_stream_count
);
movie_details_modal.video_details = formatdoc!(
@@ -997,8 +947,8 @@ impl<'a, 'b> Network<'a, 'b> {
Resolution: {}
Scan Type: {}
Runtime: {}",
media_info.video_bit_depth.as_u64().unwrap(),
media_info.video_bitrate.as_u64().unwrap(),
media_info.video_bit_depth,
media_info.video_bitrate,
media_info.video_codec,
media_info.video_fps.as_f64().unwrap(),
media_info.resolution,
@@ -1073,7 +1023,7 @@ impl<'a, 'b> Network<'a, 'b> {
.handle_request::<(), Vec<QualityProfile>>(request_props, |quality_profiles, mut app| {
app.data.radarr_data.quality_profile_map = quality_profiles
.into_iter()
.map(|profile| (profile.id.as_u64().unwrap(), profile.name))
.map(|profile| (profile.id, profile.name))
.collect();
})
.await;
@@ -1103,19 +1053,11 @@ impl<'a, 'b> Network<'a, 'b> {
async fn get_releases(&mut self) {
let (movie_id, tmdb_id) = self.extract_movie_id().await;
info!(
"Fetching releases for movie with TMDB id {} and with Radarr id: {}",
tmdb_id, movie_id
);
info!("Fetching releases for movie with TMDB id {tmdb_id} and with Radarr id: {movie_id}");
let request_props = self
.radarr_request_props_from(
format!(
"{}?movieId={}",
RadarrEvent::GetReleases.resource(),
movie_id
)
.as_str(),
format!("{}?movieId={movie_id}", RadarrEvent::GetReleases.resource()).as_str(),
RequestMethod::Get,
None::<()>,
)
@@ -1181,7 +1123,7 @@ impl<'a, 'b> Network<'a, 'b> {
.handle_request::<(), Vec<Tag>>(request_props, |tags_vec, mut app| {
app.data.radarr_data.tags_map = tags_vec
.into_iter()
.map(|tag| (tag.id.as_u64().unwrap(), tag.label))
.map(|tag| (tag.id, tag.label))
.collect();
})
.await;
@@ -1241,56 +1183,46 @@ impl<'a, 'b> Network<'a, 'b> {
let vec_to_bullet_points = |vec: Vec<String>| {
vec
.iter()
.map(|change| format!(" * {}", change))
.map(|change| format!(" * {change}"))
.collect::<Vec<String>>()
.join("\n")
};
let mut update_info = formatdoc!(
"{} - {} {}
"{} - {} {install_status}
{}",
update.version,
update.release_date,
install_status,
"-".repeat(200)
);
if let Some(new_changes) = update.changes.new {
let changes = vec_to_bullet_points(new_changes);
update_info = formatdoc!(
"{}
"{update_info}
New:
{}",
update_info,
changes
{changes}"
)
}
if let Some(fixes) = update.changes.fixed {
let fixes = vec_to_bullet_points(fixes);
update_info = formatdoc!(
"{}
"{update_info}
Fixed:
{}",
update_info,
fixes
{fixes}"
);
}
update_info
})
.reduce(|version_1, version_2| format!("{}\n\n\n{}", version_1, version_2))
.reduce(|version_1, version_2| format!("{version_1}\n\n\n{version_2}"))
.unwrap();
app.data.radarr_data.updates = ScrollableText::with_string(formatdoc!(
"{}
"The latest version of Radarr is {latest_installed} installed
{}",
format!(
"The latest version of Radarr is {} installed",
latest_installed
),
updates
{updates}"
));
})
.await;
@@ -1343,10 +1275,9 @@ impl<'a, 'b> Network<'a, 'b> {
}
Err(e) => {
warn!(
"Encountered a race condition: {}\n \
"Encountered a race condition: {e}\n \
This is most likely caused by the user trying to navigate between modals rapidly. \
Ignoring search request.",
e
Ignoring search request."
);
}
}
@@ -1364,7 +1295,7 @@ impl<'a, 'b> Network<'a, 'b> {
.task_name
.clone();
info!("Starting Radarr task: {}", task_name);
info!("Starting Radarr task: {task_name}");
let body = CommandBody { name: task_name };
@@ -1383,10 +1314,7 @@ impl<'a, 'b> Network<'a, 'b> {
async fn trigger_automatic_search(&mut self) {
let (movie_id, tmdb_id) = self.extract_movie_id().await;
info!(
"Searching indexers for movie with TMDB id {} and with Radarr id: {}",
tmdb_id, movie_id
);
info!("Searching indexers for movie with TMDB id {tmdb_id} and with Radarr id: {movie_id}");
let body = MovieCommandBody {
name: "MoviesSearch".to_owned(),
movie_ids: vec![movie_id],
@@ -1427,10 +1355,7 @@ impl<'a, 'b> Network<'a, 'b> {
async fn update_and_scan(&mut self) {
let (movie_id, tmdb_id) = self.extract_movie_id().await;
info!(
"Updating and scanning movie with TMDB id {} and with Radarr id: {}",
tmdb_id, movie_id
);
info!("Updating and scanning movie with TMDB id {tmdb_id} and with Radarr id: {movie_id}");
let body = MovieCommandBody {
name: "RefreshMovie".to_owned(),
movie_ids: vec![movie_id],
@@ -1501,7 +1426,7 @@ impl<'a, 'b> Network<'a, 'b> {
.unwrap()
.clone();
debug!("Indexer settings body: {:?}", body);
debug!("Indexer settings body: {body:?}");
let request_props = self
.radarr_request_props_from(
@@ -1530,12 +1455,7 @@ impl<'a, 'b> Network<'a, 'b> {
port,
api_token,
} = &app.config.radarr;
let uri = format!(
"http://{}:{}/api/v3{}",
host,
port.unwrap_or(7878),
resource
);
let uri = format!("http://{host}:{}/api/v3{resource}", port.unwrap_or(7878));
RequestProps {
uri,
@@ -1545,7 +1465,7 @@ impl<'a, 'b> Network<'a, 'b> {
}
}
async fn extract_and_add_tag_ids_vec(&mut self, edit_tags: String) -> Vec<u64> {
async fn extract_and_add_tag_ids_vec(&mut self, edit_tags: String) -> Vec<i64> {
let tags_map = self.app.lock().await.data.radarr_data.tags_map.clone();
let tags = edit_tags.clone();
let missing_tags_vec = edit_tags
@@ -1572,7 +1492,7 @@ impl<'a, 'b> Network<'a, 'b> {
.collect()
}
async fn extract_movie_id(&mut self) -> (u64, u64) {
async fn extract_movie_id(&mut self) -> (i64, i64) {
let app = self.app.lock().await;
if app.data.radarr_data.filtered_movies.is_some() {
(
@@ -1583,9 +1503,7 @@ impl<'a, 'b> Network<'a, 'b> {
.as_ref()
.unwrap()
.current_selection()
.id
.as_u64()
.unwrap(),
.id,
app
.data
.radarr_data
@@ -1593,33 +1511,17 @@ impl<'a, 'b> Network<'a, 'b> {
.as_ref()
.unwrap()
.current_selection()
.tmdb_id
.as_u64()
.unwrap(),
.tmdb_id,
)
} else {
(
app
.data
.radarr_data
.movies
.current_selection()
.id
.as_u64()
.unwrap(),
app
.data
.radarr_data
.movies
.current_selection()
.tmdb_id
.as_u64()
.unwrap(),
app.data.radarr_data.movies.current_selection().id,
app.data.radarr_data.movies.current_selection().tmdb_id,
)
}
}
async fn extract_collection_id(&mut self) -> u64 {
async fn extract_collection_id(&mut self) -> i64 {
if self
.app
.lock()
@@ -1640,8 +1542,6 @@ impl<'a, 'b> Network<'a, 'b> {
.unwrap()
.current_selection()
.id
.as_u64()
.unwrap()
} else {
self
.app
@@ -1652,22 +1552,20 @@ impl<'a, 'b> Network<'a, 'b> {
.collections
.current_selection()
.id
.as_u64()
.unwrap()
}
}
async fn append_movie_id_param(&mut self, resource: &str) -> String {
let (movie_id, _) = self.extract_movie_id().await;
format!("{}?movieId={}", resource, movie_id)
format!("{resource}?movieId={movie_id}")
}
}
fn get_movie_status(has_file: bool, downloads_vec: &[DownloadRecord], movie_id: Number) -> String {
fn get_movie_status(has_file: bool, downloads_vec: &[DownloadRecord], movie_id: i64) -> String {
if !has_file {
if let Some(download) = downloads_vec
.iter()
.find(|&download| download.movie_id.as_u64().unwrap() == movie_id.as_u64().unwrap())
.find(|&download| download.movie_id == movie_id)
{
if download.status == "downloading" {
return "Downloading".to_owned();
+78 -86
View File
@@ -7,7 +7,7 @@ mod test {
use mockito::{Matcher, Mock, Server, ServerGuard};
use pretty_assertions::{assert_eq, assert_str_eq};
use rstest::rstest;
use serde_json::{json, Value};
use serde_json::{json, Number, Value};
use strum::IntoEnumIterator;
use tokio::sync::Mutex;
use tokio_util::sync::CancellationToken;
@@ -229,12 +229,12 @@ mod test {
app_arc.lock().await.data.radarr_data.disk_space_vec,
vec![
DiskSpace {
free_space: Number::from(1111),
total_space: Number::from(2222),
free_space: 1111,
total_space: 2222,
},
DiskSpace {
free_space: Number::from(3333),
total_space: Number::from(4444),
free_space: 3333,
total_space: 4444,
},
]
);
@@ -270,7 +270,7 @@ mod test {
let (async_server, app_arc, _server) = mock_radarr_api(
RequestMethod::Get,
None,
Some(serde_json::from_str(format!("[ {} ]", MOVIE_JSON).as_str()).unwrap()),
Some(serde_json::from_str(format!("[ {MOVIE_JSON} ]").as_str()).unwrap()),
RadarrEvent::GetMovies.resource(),
)
.await;
@@ -463,7 +463,7 @@ mod test {
let mut async_server = server
.mock(
&RequestMethod::Get.to_string().to_uppercase(),
format!("/api/v3{}", resource).as_str(),
format!("/api/v3{resource}").as_str(),
)
.match_header("X-Api-Key", "test1234");
async_server = async_server.expect_at_most(0).create_async().await;
@@ -1186,7 +1186,7 @@ mod test {
async_server.assert_async().await;
assert_eq!(
app_arc.lock().await.data.radarr_data.quality_profile_map,
BiMap::from_iter([(2222u64, "HD - 1080p".to_owned())])
BiMap::from_iter([(2222i64, "HD - 1080p".to_owned())])
);
}
@@ -1210,7 +1210,7 @@ mod test {
async_server.assert_async().await;
assert_eq!(
app_arc.lock().await.data.radarr_data.tags_map,
BiMap::from_iter([(2222u64, "usenet".to_owned())])
BiMap::from_iter([(2222i64, "usenet".to_owned())])
);
}
@@ -1237,7 +1237,7 @@ mod test {
Task {
name: "Application Check Update".to_owned(),
task_name: "ApplicationCheckUpdate".to_owned(),
interval: Number::from(360),
interval: 360,
last_execution: timestamp,
next_execution: timestamp,
last_duration: "00:00:00.5111547".to_owned(),
@@ -1245,7 +1245,7 @@ mod test {
Task {
name: "Backup".to_owned(),
task_name: "Backup".to_owned(),
interval: Number::from(10080),
interval: 10080,
last_execution: timestamp,
next_execution: timestamp,
last_duration: "00:00:00.5111547".to_owned(),
@@ -1317,7 +1317,7 @@ mod test {
The latest version of Radarr is already installed
4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed)
{}
{line_break}
New:
* Cool new thing
Fixed:
@@ -1325,20 +1325,17 @@ mod test {
3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed)
{}
{line_break}
New:
* Cool new thing (old)
* Other cool new thing (old)
2.1.0 - 2023-04-15 02:02:53 UTC
{}
{line_break}
Fixed:
* Killed bug 1
* Fixed bug 2",
line_break.clone(),
line_break.clone(),
line_break
* Fixed bug 2"
));
let (async_server, app_arc, _server) = mock_radarr_api(
RequestMethod::Get,
@@ -1569,17 +1566,17 @@ mod test {
};
add_movie_modal.root_folder_list.set_items(vec![
RootFolder {
id: Number::from(1),
id: 1,
path: "/nfs".to_owned(),
accessible: true,
free_space: Number::from(219902325555200u64),
free_space: 219902325555200,
unmapped_folders: None,
},
RootFolder {
id: Number::from(2),
id: 2,
path: "/nfs2".to_owned(),
accessible: true,
free_space: Number::from(21990232555520u64),
free_space: 21990232555520,
unmapped_folders: None,
},
]);
@@ -1655,17 +1652,17 @@ mod test {
};
add_movie_modal.root_folder_list.set_items(vec![
RootFolder {
id: Number::from(1),
id: 1,
path: "/nfs".to_owned(),
accessible: true,
free_space: Number::from(219902325555200u64),
free_space: 219902325555200,
unmapped_folders: None,
},
RootFolder {
id: Number::from(2),
id: 2,
path: "/nfs2".to_owned(),
accessible: true,
free_space: Number::from(21990232555520u64),
free_space: 21990232555520,
unmapped_folders: None,
},
]);
@@ -1685,7 +1682,7 @@ mod test {
app.data.radarr_data.tags_map =
BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]);
let secondary_search_result = AddMovieSearchResult {
tmdb_id: Number::from(5678),
tmdb_id: 5678,
..add_movie_search_result()
};
let mut add_searched_movies = StatefulTable::default();
@@ -1715,9 +1712,7 @@ mod test {
.as_ref()
.unwrap()
.current_selection()
.tmdb_id
.as_u64()
.unwrap(),
.tmdb_id,
5678
);
}
@@ -2006,8 +2001,8 @@ mod test {
.radarr_data
.movies
.set_items(vec![Movie {
id: Number::from(1),
tmdb_id: Number::from(2),
id: 1,
tmdb_id: 2,
..Movie::default()
}]);
let mut network = Network::new(&app_arc, CancellationToken::new());
@@ -2020,8 +2015,8 @@ mod test {
let app_arc = Arc::new(Mutex::new(App::default()));
let mut filtered_movies = StatefulTable::default();
filtered_movies.set_items(vec![Movie {
id: Number::from(1),
tmdb_id: Number::from(2),
id: 1,
tmdb_id: 2,
..Movie::default()
}]);
app_arc.lock().await.data.radarr_data.filtered_movies = Some(filtered_movies);
@@ -2040,7 +2035,7 @@ mod test {
.radarr_data
.collections
.set_items(vec![Collection {
id: Number::from(1),
id: 1,
..Collection::default()
}]);
let mut network = Network::new(&app_arc, CancellationToken::new());
@@ -2053,7 +2048,7 @@ mod test {
let app_arc = Arc::new(Mutex::new(App::default()));
let mut filtered_collections = StatefulTable::default();
filtered_collections.set_items(vec![Collection {
id: Number::from(1),
id: 1,
..Collection::default()
}]);
app_arc.lock().await.data.radarr_data.filtered_collections = Some(filtered_collections);
@@ -2072,7 +2067,7 @@ mod test {
.radarr_data
.movies
.set_items(vec![Movie {
id: Number::from(1),
id: 1,
..Movie::default()
}]);
let mut network = Network::new(&app_arc, CancellationToken::new());
@@ -2127,25 +2122,22 @@ mod test {
#[test]
fn test_get_movie_status_downloaded() {
assert_str_eq!(get_movie_status(true, &[], Number::from(0)), "Downloaded");
assert_str_eq!(get_movie_status(true, &[], 0), "Downloaded");
}
#[test]
fn test_get_movie_status_missing() {
let download_record = DownloadRecord {
movie_id: 1.into(),
movie_id: 1,
..DownloadRecord::default()
};
assert_str_eq!(
get_movie_status(false, &[download_record.clone()], 0.into()),
get_movie_status(false, &[download_record.clone()], 0),
"Missing"
);
assert_str_eq!(
get_movie_status(false, &[download_record], 1.into()),
"Missing"
);
assert_str_eq!(get_movie_status(false, &[download_record], 1), "Missing");
}
#[test]
@@ -2154,11 +2146,11 @@ mod test {
get_movie_status(
false,
&[DownloadRecord {
movie_id: 1.into(),
movie_id: 1,
status: "downloading".to_owned(),
..DownloadRecord::default()
}],
1.into()
1
),
"Downloading"
);
@@ -2170,11 +2162,11 @@ mod test {
get_movie_status(
false,
&[DownloadRecord {
movie_id: 1.into(),
movie_id: 1,
status: "completed".to_owned(),
..DownloadRecord::default()
}],
1.into()
1
),
"Awaiting Import"
);
@@ -2190,7 +2182,7 @@ mod test {
let mut async_server = server
.mock(
&method.to_string().to_uppercase(),
format!("/api/v3{}", resource).as_str(),
format!("/api/v3{resource}").as_str(),
)
.match_header("X-Api-Key", "test1234");
@@ -2248,13 +2240,13 @@ mod test {
fn media_info() -> MediaInfo {
MediaInfo {
audio_bitrate: Number::from(0),
audio_bitrate: 0,
audio_channels: Number::from_f64(7.1).unwrap(),
audio_codec: Some("AAC".to_owned()),
audio_languages: Some("eng".to_owned()),
audio_stream_count: Number::from(1),
video_bit_depth: Number::from(10),
video_bitrate: Number::from(0),
audio_stream_count: 1,
video_bit_depth: 10,
video_bitrate: 0,
video_codec: "x265".to_owned(),
video_fps: Number::from_f64(23.976).unwrap(),
resolution: "1920x804".to_owned(),
@@ -2276,9 +2268,9 @@ mod test {
CollectionMovie {
title: "Test".to_owned().into(),
overview: "Collection blah blah blah".to_owned(),
year: Number::from(2023),
runtime: Number::from(120),
tmdb_id: Number::from(1234),
year: 2023,
runtime: 120,
tmdb_id: 1234,
genres: genres(),
ratings: ratings_list(),
}
@@ -2286,35 +2278,35 @@ mod test {
fn collection() -> Collection {
Collection {
id: Number::from(123),
id: 123,
title: "Test Collection".to_owned().into(),
root_folder_path: Some("/nfs/movies".to_owned()),
search_on_add: true,
monitored: true,
minimum_availability: MinimumAvailability::Released,
overview: Some("Collection blah blah blah".to_owned()),
quality_profile_id: Number::from(2222),
quality_profile_id: 2222,
movies: Some(vec![collection_movie()]),
}
}
fn movie() -> Movie {
Movie {
id: Number::from(1),
id: 1,
title: "Test".to_owned().into(),
original_language: language(),
size_on_disk: Number::from(3543348019u64),
size_on_disk: 3543348019,
status: "Downloaded".to_owned(),
overview: "Blah blah blah".to_owned(),
path: "/nfs/movies".to_owned(),
studio: "21st Century Alex".to_owned(),
genres: genres(),
year: Number::from(2023),
year: 2023,
monitored: true,
has_file: true,
runtime: Number::from(120),
tmdb_id: Number::from(1234),
quality_profile_id: Number::from(2222),
runtime: 120,
tmdb_id: 1234,
quality_profile_id: 2222,
minimum_availability: MinimumAvailability::Announced,
certification: Some("R".to_owned()),
tags: vec![Number::from(1)],
@@ -2345,11 +2337,11 @@ mod test {
Release {
guid: "1234".to_owned(),
protocol: "torrent".to_owned(),
age: Number::from(1),
age: 1,
title: HorizontallyScrollableText::from("Test Release"),
indexer: "kickass torrents".to_owned(),
indexer_id: Number::from(2),
size: Number::from(1234),
indexer_id: 2,
size: 1234,
rejected: true,
rejections: Some(rejections()),
seeders: Some(Number::from(2)),
@@ -2361,14 +2353,14 @@ mod test {
fn add_movie_search_result() -> AddMovieSearchResult {
AddMovieSearchResult {
tmdb_id: Number::from(1234),
tmdb_id: 1234,
title: HorizontallyScrollableText::from("Test"),
original_language: language(),
status: "released".to_owned(),
overview: "New movie blah blah blah".to_owned(),
genres: genres(),
year: Number::from(2023),
runtime: Number::from(120),
year: 2023,
runtime: 120,
ratings: ratings_list(),
}
}
@@ -2387,10 +2379,10 @@ mod test {
DownloadRecord {
title: "Test Download Title".to_owned(),
status: "downloading".to_owned(),
id: Number::from(1),
movie_id: Number::from(1),
size: Number::from(3543348019u64),
sizeleft: Number::from(1771674009u64),
id: 1,
movie_id: 1,
size: 3543348019,
sizeleft: 1771674009,
output_path: Some(HorizontallyScrollableText::from("/nfs/movies/Test")),
indexer: "kickass torrents".to_owned(),
download_client: "transmission".to_owned(),
@@ -2405,10 +2397,10 @@ mod test {
fn root_folder() -> RootFolder {
RootFolder {
id: Number::from(1),
id: 1,
path: "/nfs".to_owned(),
accessible: true,
free_space: Number::from(219902325555200u64),
free_space: 219902325555200,
unmapped_folders: None,
}
}
@@ -2441,17 +2433,17 @@ mod test {
supports_rss: true,
supports_search: true,
protocol: "torrent".to_owned(),
priority: Number::from(25),
download_client_id: Number::from(0),
priority: 25,
download_client_id: 0,
name: Some("Test Indexer".to_owned()),
implementation_name: Some("Torznab".to_owned()),
implementation: Some("Torznab".to_owned()),
config_contract: Some("TorznabSettings".to_owned()),
tags: Some(vec!["test_tag".to_owned()]),
id: Number::from(1),
id: 1,
fields: Some(vec![
IndexerField {
order: Number::from(0),
order: 0,
name: Some("valueIsString".to_owned()),
label: Some("Value Is String".to_owned()),
value: Some(json!("hello")),
@@ -2459,19 +2451,19 @@ mod test {
select_options: None,
},
IndexerField {
order: Number::from(1),
order: 1,
name: Some("emptyValueWithSelectOptions".to_owned()),
label: Some("Empty Value With Select Options".to_owned()),
value: None,
field_type: Some("select".to_owned()),
select_options: Some(vec![IndexerSelectOption {
value: Number::from(-2),
value: -2,
name: Some("Original".to_owned()),
order: Number::from(0),
order: 0,
}]),
},
IndexerField {
order: Number::from(2),
order: 2,
name: Some("valueIsAnArray".to_owned()),
label: Some("Value is an array".to_owned()),
value: Some(json!([1, 2])),
@@ -2484,9 +2476,9 @@ mod test {
fn indexer_settings() -> IndexerSettings {
IndexerSettings {
rss_sync_interval: Number::from(60),
rss_sync_interval: 60,
allow_hardcoded_subs: true,
id: Number::from(1),
id: 1,
..IndexerSettings::default()
}
}