DownloadStatus was declared four times, byte for byte identically, in radarr_models, sonarr_models, lidarr_models, and readarr_models: the same variants, the same derive list, and the same serde, strum, and display_style attributes. Every servarr's queue endpoint reports the same status vocabulary, so there is nothing servarr specific about the type. Move it into servarr_models, preserving that file's alphabetical ordering (between DiskSpace and IndexerSettings), and drop the four copies. The DownloadRecord types keep their per-servarr shapes and now reference the shared enum. The two enum tests, test_download_status_display and test_download_status_to_display_str, were likewise duplicated in the four per-servarr model test files. Keep one copy of each in servarr_models_tests alongside the other shared enum display tests and delete the rest. The per-servarr DownloadRecord fallback deserialization tests stay where they are since they exercise each servarr's own record type. Behavior is unchanged. Every remaining edit is an import path update.
490 lines
13 KiB
Rust
490 lines
13 KiB
Rust
#[cfg(test)]
|
|
#[macro_use]
|
|
pub(in crate::handlers::radarr_handlers) mod utils {
|
|
use crate::models::HorizontallyScrollableText;
|
|
use crate::models::radarr_models::{
|
|
AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie,
|
|
DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection,
|
|
MovieFile, MovieMonitor, MovieStatus, RadarrRelease, Rating, RatingsList,
|
|
};
|
|
use crate::models::servarr_models::{
|
|
DownloadStatus, Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder,
|
|
};
|
|
use chrono::DateTime;
|
|
use serde_json::{Number, json};
|
|
|
|
#[macro_export]
|
|
macro_rules! test_edit_movie_key {
|
|
($handler:ident, $block:expr, $context:expr) => {
|
|
let mut app = App::test_default();
|
|
let mut radarr_data = RadarrData {
|
|
quality_profile_map: BiMap::from_iter([
|
|
(2222, "HD - 1080p".to_owned()),
|
|
(1111, "Any".to_owned()),
|
|
]),
|
|
tags_map: BiMap::from_iter([(1, "test".to_owned())]),
|
|
..create_test_radarr_data()
|
|
};
|
|
radarr_data.movies.set_items(vec![Movie {
|
|
path: "/nfs/movies/Test".to_owned().into(),
|
|
monitored: true,
|
|
quality_profile_id: 2222,
|
|
minimum_availability: MinimumAvailability::Released,
|
|
tags: vec![Number::from(1)],
|
|
..Movie::default()
|
|
}]);
|
|
app.data.radarr_data = radarr_data;
|
|
|
|
$handler::new(DEFAULT_KEYBINDINGS.edit.key, &mut app, $block, None).handle();
|
|
|
|
assert_navigation_pushed!(
|
|
app,
|
|
(ActiveRadarrBlock::EditMoviePrompt, Some($context)).into()
|
|
);
|
|
assert_eq!(
|
|
app.data.radarr_data.selected_block.get_active_block(),
|
|
ActiveRadarrBlock::EditMovieToggleMonitored
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.minimum_availability_list
|
|
.items,
|
|
Vec::from_iter(MinimumAvailability::iter())
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.minimum_availability_list
|
|
.current_selection(),
|
|
&MinimumAvailability::Released
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.quality_profile_list
|
|
.items,
|
|
vec!["Any".to_owned(), "HD - 1080p".to_owned()]
|
|
);
|
|
assert_str_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.quality_profile_list
|
|
.current_selection(),
|
|
"HD - 1080p"
|
|
);
|
|
assert_str_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.path
|
|
.text,
|
|
"/nfs/movies/Test"
|
|
);
|
|
assert_str_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.tags
|
|
.text,
|
|
"test"
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_movie_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.monitored,
|
|
Some(true)
|
|
);
|
|
assert_eq!(
|
|
app.data.radarr_data.selected_block.blocks,
|
|
EDIT_MOVIE_SELECTION_BLOCKS
|
|
);
|
|
};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! test_edit_collection_key {
|
|
($handler:ident, $block:expr, $context:expr) => {
|
|
let mut app = App::test_default();
|
|
let mut radarr_data = RadarrData {
|
|
quality_profile_map: BiMap::from_iter([
|
|
(2222, "HD - 1080p".to_owned()),
|
|
(1111, "Any".to_owned()),
|
|
]),
|
|
..create_test_radarr_data()
|
|
};
|
|
radarr_data.collections.set_items(vec![Collection {
|
|
root_folder_path: "/nfs/movies/Test".to_owned().into(),
|
|
monitored: true,
|
|
search_on_add: true,
|
|
quality_profile_id: 2222,
|
|
minimum_availability: MinimumAvailability::Released,
|
|
..Collection::default()
|
|
}]);
|
|
app.data.radarr_data = radarr_data;
|
|
|
|
$handler::new(DEFAULT_KEYBINDINGS.edit.key, &mut app, $block, None).handle();
|
|
|
|
$crate::assert_navigation_pushed!(
|
|
app,
|
|
(ActiveRadarrBlock::EditCollectionPrompt, $context).into()
|
|
);
|
|
assert_eq!(
|
|
app.data.radarr_data.selected_block.get_active_block(),
|
|
ActiveRadarrBlock::EditCollectionToggleMonitored
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.minimum_availability_list
|
|
.items,
|
|
Vec::from_iter(MinimumAvailability::iter())
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.minimum_availability_list
|
|
.current_selection(),
|
|
&MinimumAvailability::Released
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.quality_profile_list
|
|
.items,
|
|
vec!["Any".to_owned(), "HD - 1080p".to_owned()]
|
|
);
|
|
assert_str_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.quality_profile_list
|
|
.current_selection(),
|
|
"HD - 1080p"
|
|
);
|
|
assert_str_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.path
|
|
.text,
|
|
"/nfs/movies/Test"
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.monitored,
|
|
Some(true)
|
|
);
|
|
assert_eq!(
|
|
app
|
|
.data
|
|
.radarr_data
|
|
.edit_collection_modal
|
|
.as_ref()
|
|
.unwrap()
|
|
.search_on_add,
|
|
Some(true)
|
|
);
|
|
assert_eq!(
|
|
app.data.radarr_data.selected_block.blocks,
|
|
EDIT_COLLECTION_SELECTION_BLOCKS
|
|
);
|
|
};
|
|
}
|
|
|
|
pub fn language() -> Language {
|
|
Language {
|
|
id: 1,
|
|
name: "English".to_owned(),
|
|
}
|
|
}
|
|
|
|
pub fn genres() -> Vec<String> {
|
|
vec!["cool".to_owned(), "family".to_owned(), "fun".to_owned()]
|
|
}
|
|
|
|
pub fn rating() -> Rating {
|
|
Rating {
|
|
value: Number::from_f64(9.9).unwrap(),
|
|
}
|
|
}
|
|
|
|
pub fn ratings_list() -> RatingsList {
|
|
RatingsList {
|
|
imdb: Some(rating()),
|
|
tmdb: Some(rating()),
|
|
rotten_tomatoes: Some(rating()),
|
|
}
|
|
}
|
|
|
|
pub fn media_info() -> MediaInfo {
|
|
MediaInfo {
|
|
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: 1,
|
|
video_bit_depth: 10,
|
|
video_bitrate: 0,
|
|
video_codec: Some("x265".to_owned()),
|
|
video_fps: Number::from_f64(23.976).unwrap(),
|
|
resolution: "1920x804".to_owned(),
|
|
run_time: "2:00:00".to_owned(),
|
|
scan_type: "Progressive".to_owned(),
|
|
}
|
|
}
|
|
|
|
pub fn movie_file() -> MovieFile {
|
|
MovieFile {
|
|
relative_path: "Test.mkv".to_owned(),
|
|
path: "/nfs/movies/Test.mkv".to_owned(),
|
|
date_added: DateTime::from(DateTime::parse_from_rfc3339("2022-12-30T07:37:56Z").unwrap()),
|
|
media_info: Some(media_info()),
|
|
}
|
|
}
|
|
|
|
pub fn collection_movie() -> CollectionMovie {
|
|
CollectionMovie {
|
|
title: "Test".to_owned().into(),
|
|
overview: "Collection movie blah blah blah\r\n\
|
|
\r\n\
|
|
It was shot in Madison, Wisconsin: a city the cast never really left.\r\n\
|
|
\r\n\
|
|
The sequel took seven years to finish.\r\n"
|
|
.to_owned(),
|
|
year: 2023,
|
|
runtime: 120,
|
|
tmdb_id: 1234,
|
|
genres: genres(),
|
|
ratings: ratings_list(),
|
|
}
|
|
}
|
|
|
|
pub fn collection() -> Collection {
|
|
Collection {
|
|
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: 2222,
|
|
movies: Some(vec![collection_movie()]),
|
|
}
|
|
}
|
|
|
|
pub fn movie() -> Movie {
|
|
Movie {
|
|
id: 1,
|
|
title: "Test".to_owned().into(),
|
|
original_language: language(),
|
|
size_on_disk: 3543348019,
|
|
status: MovieStatus::Released,
|
|
overview: "Blah blah blah".to_owned(),
|
|
path: "/nfs/movies".to_owned(),
|
|
studio: Some("21st Century Alex".to_owned()),
|
|
genres: genres(),
|
|
year: 2023,
|
|
monitored: true,
|
|
has_file: true,
|
|
runtime: 120,
|
|
tmdb_id: 1234,
|
|
quality_profile_id: 2222,
|
|
minimum_availability: MinimumAvailability::Announced,
|
|
certification: Some("R".to_owned()),
|
|
tags: vec![Number::from(1)],
|
|
ratings: ratings_list(),
|
|
movie_file: Some(movie_file()),
|
|
collection: Some(movie_collection()),
|
|
}
|
|
}
|
|
|
|
pub fn movie_collection() -> MovieCollection {
|
|
MovieCollection {
|
|
title: Some("Test Collection".to_owned()),
|
|
}
|
|
}
|
|
|
|
pub fn rejections() -> Vec<String> {
|
|
vec![
|
|
"Unknown quality profile".to_owned(),
|
|
"Release is already mapped".to_owned(),
|
|
]
|
|
}
|
|
|
|
pub fn quality() -> Quality {
|
|
Quality {
|
|
name: "HD - 1080p".to_owned(),
|
|
}
|
|
}
|
|
|
|
pub fn quality_wrapper() -> QualityWrapper {
|
|
QualityWrapper { quality: quality() }
|
|
}
|
|
|
|
pub fn release() -> RadarrRelease {
|
|
RadarrRelease {
|
|
guid: "1234".to_owned(),
|
|
protocol: "torrent".to_owned(),
|
|
age: 1,
|
|
title: HorizontallyScrollableText::from("Test Release"),
|
|
indexer: "kickass torrents".to_owned(),
|
|
indexer_id: 2,
|
|
size: 1234,
|
|
rejected: true,
|
|
rejections: Some(rejections()),
|
|
seeders: Some(Number::from(2)),
|
|
leechers: Some(Number::from(1)),
|
|
languages: Some(vec![language()]),
|
|
quality: quality_wrapper(),
|
|
}
|
|
}
|
|
|
|
pub fn add_movie_search_result() -> AddMovieSearchResult {
|
|
AddMovieSearchResult {
|
|
tmdb_id: 4321,
|
|
title: HorizontallyScrollableText::from("Test Search Result"),
|
|
original_language: language(),
|
|
status: MovieStatus::Released,
|
|
overview: "New movie blah blah blah".to_owned(),
|
|
genres: genres(),
|
|
year: 2023,
|
|
runtime: 120,
|
|
ratings: ratings_list(),
|
|
}
|
|
}
|
|
|
|
pub fn download_record() -> DownloadRecord {
|
|
DownloadRecord {
|
|
title: "Test Download Title".to_owned(),
|
|
status: DownloadStatus::Downloading,
|
|
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(),
|
|
}
|
|
}
|
|
|
|
pub fn root_folder() -> RootFolder {
|
|
RootFolder {
|
|
id: 1,
|
|
path: "/nfs".to_owned(),
|
|
accessible: true,
|
|
free_space: 219902325555200,
|
|
unmapped_folders: None,
|
|
}
|
|
}
|
|
|
|
pub fn indexer() -> Indexer {
|
|
Indexer {
|
|
enable_rss: true,
|
|
enable_automatic_search: true,
|
|
enable_interactive_search: true,
|
|
supports_rss: true,
|
|
supports_search: true,
|
|
protocol: "torrent".to_owned(),
|
|
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: vec![Number::from(1)],
|
|
id: 1,
|
|
fields: Some(vec![
|
|
IndexerField {
|
|
name: Some("baseUrl".to_owned()),
|
|
value: Some(json!("https://test.com")),
|
|
},
|
|
IndexerField {
|
|
name: Some("apiKey".to_owned()),
|
|
value: Some(json!("")),
|
|
},
|
|
IndexerField {
|
|
name: Some("seedCriteria.seedRatio".to_owned()),
|
|
value: Some(json!("1.2")),
|
|
},
|
|
]),
|
|
}
|
|
}
|
|
|
|
pub fn indexer_settings() -> IndexerSettings {
|
|
IndexerSettings {
|
|
rss_sync_interval: 60,
|
|
allow_hardcoded_subs: true,
|
|
id: 1,
|
|
..IndexerSettings::default()
|
|
}
|
|
}
|
|
|
|
pub fn add_movie_body() -> AddMovieBody {
|
|
AddMovieBody {
|
|
tmdb_id: 1234,
|
|
title: "Test".to_owned(),
|
|
root_folder_path: "/nfs2".to_owned(),
|
|
minimum_availability: MinimumAvailability::InCinemas,
|
|
monitored: true,
|
|
quality_profile_id: 2222,
|
|
tags: Vec::new(),
|
|
tag_input_string: Some("usenet, testing".into()),
|
|
add_options: AddMovieOptions {
|
|
monitor: MovieMonitor::MovieAndCollection,
|
|
search_for_movie: true,
|
|
},
|
|
}
|
|
}
|
|
}
|