style: Applied uniform formatting across all new UI test files

This commit is contained in:
2025-12-15 20:18:28 -07:00
parent aadd6c8abf
commit c072c57bbb
23 changed files with 337 additions and 140 deletions
+10 -6
View File
@@ -30,11 +30,11 @@ use {
crate::models::servarr_data::radarr::modals::{ crate::models::servarr_data::radarr::modals::{
EditCollectionModal, EditMovieModal, MovieDetailsModal, EditCollectionModal, EditMovieModal, MovieDetailsModal,
}, },
crate::models::stateful_table::SortOption,
crate::network::radarr_network::radarr_network_test_utils::test_utils::*, crate::network::radarr_network::radarr_network_test_utils::test_utils::*,
chrono::DateTime, chrono::DateTime,
strum::IntoEnumIterator,
std::fmt::Debug, std::fmt::Debug,
crate::models::stateful_table::SortOption strum::IntoEnumIterator,
}; };
#[cfg(test)] #[cfg(test)]
@@ -50,9 +50,9 @@ macro_rules! sort_option {
($field:ident) => { ($field:ident) => {
SortOption { SortOption {
name: "Something", name: "Something",
cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)) cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)),
}
} }
};
} }
pub struct App<'a> { pub struct App<'a> {
@@ -386,7 +386,9 @@ impl App<'_> {
movie_details_modal movie_details_modal
.movie_releases .movie_releases
.set_items(vec![torrent_release(), usenet_release()]); .set_items(vec![torrent_release(), usenet_release()]);
movie_details_modal.movie_releases.sorting(vec![sort_option!(indexer_id)]); movie_details_modal
.movie_releases
.sorting(vec![sort_option!(indexer_id)]);
let mut radarr_data = RadarrData { let mut radarr_data = RadarrData {
disk_space_vec: vec![diskspace()], disk_space_vec: vec![diskspace()],
@@ -418,7 +420,9 @@ impl App<'_> {
radarr_data.collections.sorting(vec![sort_option!(id)]); radarr_data.collections.sorting(vec![sort_option!(id)]);
radarr_data.collections.search = Some("Something".into()); radarr_data.collections.search = Some("Something".into());
radarr_data.collections.filter = Some("Something".into()); radarr_data.collections.filter = Some("Something".into());
radarr_data.collection_movies.set_items(vec![collection_movie()]); radarr_data
.collection_movies
.set_items(vec![collection_movie()]);
radarr_data.downloads.set_items(vec![download_record()]); radarr_data.downloads.set_items(vec![download_record()]);
radarr_data.blocklist.set_items(vec![blocklist_item()]); radarr_data.blocklist.set_items(vec![blocklist_item()]);
radarr_data.blocklist.sorting(vec![sort_option!(id)]); radarr_data.blocklist.sorting(vec![sort_option!(id)]);
@@ -162,9 +162,7 @@ pub mod test_utils {
} }
pub fn percentage_rating() -> Rating { pub fn percentage_rating() -> Rating {
Rating { Rating { value: 99.into() }
value: 99.into(),
}
} }
pub fn ratings_list() -> RatingsList { pub fn ratings_list() -> RatingsList {
@@ -20,8 +20,8 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use crate::ui::ui_test_utils::test_utils::TerminalSize; use crate::ui::ui_test_utils::test_utils::TerminalSize;
use rstest::rstest;
use super::*; use super::*;
@@ -56,8 +56,9 @@ mod tests {
ActiveRadarrBlock::Blocklist, ActiveRadarrBlock::Blocklist,
ActiveRadarrBlock::BlocklistSortPrompt, ActiveRadarrBlock::BlocklistSortPrompt,
ActiveRadarrBlock::DeleteBlocklistItemPrompt, ActiveRadarrBlock::DeleteBlocklistItemPrompt,
ActiveRadarrBlock::BlocklistClearAllItemsPrompt, ActiveRadarrBlock::BlocklistClearAllItemsPrompt
)] active_radarr_block: ActiveRadarrBlock )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
@@ -37,16 +37,17 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use crate::models::stateful_table::StatefulTable;
use super::*; use super::*;
use crate::models::stateful_table::StatefulTable;
use rstest::rstest;
#[rstest] #[rstest]
fn test_collection_details_ui_renders_collection_details( fn test_collection_details_ui_renders_collection_details(
#[values( #[values(
ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::ViewMovieOverview ActiveRadarrBlock::ViewMovieOverview
)] active_radarr_block: ActiveRadarrBlock )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
@@ -30,9 +30,9 @@ mod tests {
mod snapshot_tests { mod snapshot_tests {
use super::*; use super::*;
use rstest::rstest;
use crate::models::BlockSelectionState; use crate::models::BlockSelectionState;
use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS;
use rstest::rstest;
#[rstest] #[rstest]
#[case(true, false, false)] #[case(true, false, false)]
@@ -70,8 +70,10 @@ mod tests {
ActiveRadarrBlock::FilterCollectionsError, ActiveRadarrBlock::FilterCollectionsError,
ActiveRadarrBlock::SearchCollection, ActiveRadarrBlock::SearchCollection,
ActiveRadarrBlock::SearchCollectionError, ActiveRadarrBlock::SearchCollectionError,
ActiveRadarrBlock::UpdateAllCollectionsPrompt, ActiveRadarrBlock::UpdateAllCollectionsPrompt
)] active_radarr_block: ActiveRadarrBlock) { )]
active_radarr_block: ActiveRadarrBlock,
) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
@@ -96,13 +98,34 @@ mod tests {
} }
#[rstest] #[rstest]
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionPrompt)] #[case(
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionConfirmPrompt)] ActiveRadarrBlock::CollectionDetails,
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] ActiveRadarrBlock::EditCollectionPrompt
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] )]
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] #[case(
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] ActiveRadarrBlock::CollectionDetails,
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleMonitored)] ActiveRadarrBlock::EditCollectionConfirmPrompt
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionRootFolderPathInput
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionSelectQualityProfile
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionToggleMonitored
)]
fn test_edit_collection_ui_renders_edit_collection_modal( fn test_edit_collection_ui_renders_edit_collection_modal(
#[case] context_block: ActiveRadarrBlock, #[case] context_block: ActiveRadarrBlock,
#[case] active_radarr_block: ActiveRadarrBlock, #[case] active_radarr_block: ActiveRadarrBlock,
@@ -116,7 +139,14 @@ mod tests {
CollectionsUi::draw(f, app, f.area()); CollectionsUi::draw(f, app, f.area());
}); });
insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context_block.to_string()), output); insta::assert_snapshot!(
format!(
"{}_{}",
active_radarr_block.to_string(),
context_block.to_string()
),
output
);
} }
} }
} }
@@ -31,24 +31,66 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use super::*; use super::*;
use rstest::rstest;
#[rstest] #[rstest]
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionPrompt)] #[case(
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionConfirmPrompt)] ActiveRadarrBlock::Collections,
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] ActiveRadarrBlock::EditCollectionPrompt
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] )]
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] #[case(
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] ActiveRadarrBlock::Collections,
#[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionToggleMonitored)] ActiveRadarrBlock::EditCollectionConfirmPrompt
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionPrompt)] )]
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionConfirmPrompt)] #[case(
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] ActiveRadarrBlock::Collections,
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] ActiveRadarrBlock::EditCollectionRootFolderPathInput
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] )]
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] #[case(
#[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleMonitored)] ActiveRadarrBlock::Collections,
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
)]
#[case(
ActiveRadarrBlock::Collections,
ActiveRadarrBlock::EditCollectionSelectQualityProfile
)]
#[case(
ActiveRadarrBlock::Collections,
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
)]
#[case(
ActiveRadarrBlock::Collections,
ActiveRadarrBlock::EditCollectionToggleMonitored
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionPrompt
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionConfirmPrompt
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionRootFolderPathInput
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionSelectQualityProfile
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
)]
#[case(
ActiveRadarrBlock::CollectionDetails,
ActiveRadarrBlock::EditCollectionToggleMonitored
)]
fn test_edit_collection_ui_renders_edit_collection_modal( fn test_edit_collection_ui_renders_edit_collection_modal(
#[case] active_radarr_block: ActiveRadarrBlock, #[case] active_radarr_block: ActiveRadarrBlock,
#[case] context_block: ActiveRadarrBlock, #[case] context_block: ActiveRadarrBlock,
@@ -62,7 +104,14 @@ mod tests {
EditCollectionUi::draw(f, app, f.area()); EditCollectionUi::draw(f, app, f.area());
}); });
insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context_block.to_string()), output); insta::assert_snapshot!(
format!(
"{}_{}",
active_radarr_block.to_string(),
context_block.to_string()
),
output
);
} }
} }
} }
@@ -20,8 +20,8 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use super::*; use super::*;
use rstest::rstest;
#[test] #[test]
fn test_radarr_ui_renders_downloads_tab_loading() { fn test_radarr_ui_renders_downloads_tab_loading() {
@@ -41,8 +41,9 @@ mod tests {
#[values( #[values(
ActiveRadarrBlock::Downloads, ActiveRadarrBlock::Downloads,
ActiveRadarrBlock::DeleteDownloadPrompt, ActiveRadarrBlock::DeleteDownloadPrompt,
ActiveRadarrBlock::UpdateDownloadsPrompt, ActiveRadarrBlock::UpdateDownloadsPrompt
)] active_radarr_block: ActiveRadarrBlock )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
@@ -7,7 +7,7 @@ mod tests {
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS,
}; };
use crate::models::servarr_models::{Indexer}; use crate::models::servarr_models::Indexer;
use crate::ui::DrawUi; use crate::ui::DrawUi;
use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi;
use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app};
@@ -24,9 +24,9 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use super::*;
use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_NZB_SELECTION_BLOCKS; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_NZB_SELECTION_BLOCKS;
use crate::network::radarr_network::radarr_network_test_utils::test_utils::indexer; use crate::network::radarr_network::radarr_network_test_utils::test_utils::indexer;
use super::*;
#[test] #[test]
fn test_edit_indexer_ui_renders_edit_indexer_modal_torrent() { fn test_edit_indexer_ui_renders_edit_indexer_modal_torrent() {
@@ -29,7 +29,8 @@ mod tests {
fn test_indexer_settings_ui_renders_indexer_settings() { fn test_indexer_settings_ui_renders_indexer_settings() {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into()); app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into());
app.data.radarr_data.selected_block = BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); app.data.radarr_data.selected_block =
BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS);
let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| {
IndexerSettingsUi::draw(f, app, f.area()); IndexerSettingsUi::draw(f, app, f.area());
+35 -10
View File
@@ -20,10 +20,10 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest; use super::*;
use crate::models::BlockSelectionState; use crate::models::BlockSelectionState;
use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS;
use super::*; use rstest::rstest;
#[test] #[test]
fn test_add_movie_ui_renders_loading_for_search() { fn test_add_movie_ui_renders_loading_for_search() {
@@ -49,15 +49,33 @@ mod tests {
#[case(ActiveRadarrBlock::AddMovieSelectRootFolder, None)] #[case(ActiveRadarrBlock::AddMovieSelectRootFolder, None)]
#[case(ActiveRadarrBlock::AddMovieAlreadyInLibrary, None)] #[case(ActiveRadarrBlock::AddMovieAlreadyInLibrary, None)]
#[case(ActiveRadarrBlock::AddMovieTagsInput, None)] #[case(ActiveRadarrBlock::AddMovieTagsInput, None)]
#[case(ActiveRadarrBlock::AddMoviePrompt, Some(ActiveRadarrBlock::CollectionDetails))] #[case(
#[case(ActiveRadarrBlock::AddMovieSelectMinimumAvailability, Some(ActiveRadarrBlock::CollectionDetails))] ActiveRadarrBlock::AddMoviePrompt,
#[case(ActiveRadarrBlock::AddMovieSelectMonitor, Some(ActiveRadarrBlock::CollectionDetails))] Some(ActiveRadarrBlock::CollectionDetails)
#[case(ActiveRadarrBlock::AddMovieSelectQualityProfile, Some(ActiveRadarrBlock::CollectionDetails))] )]
#[case(ActiveRadarrBlock::AddMovieSelectRootFolder, Some(ActiveRadarrBlock::CollectionDetails))] #[case(
#[case(ActiveRadarrBlock::AddMovieTagsInput, Some(ActiveRadarrBlock::CollectionDetails))] ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
Some(ActiveRadarrBlock::CollectionDetails)
)]
#[case(
ActiveRadarrBlock::AddMovieSelectMonitor,
Some(ActiveRadarrBlock::CollectionDetails)
)]
#[case(
ActiveRadarrBlock::AddMovieSelectQualityProfile,
Some(ActiveRadarrBlock::CollectionDetails)
)]
#[case(
ActiveRadarrBlock::AddMovieSelectRootFolder,
Some(ActiveRadarrBlock::CollectionDetails)
)]
#[case(
ActiveRadarrBlock::AddMovieTagsInput,
Some(ActiveRadarrBlock::CollectionDetails)
)]
fn test_add_movie_ui_renders( fn test_add_movie_ui_renders(
#[case] active_radarr_block: ActiveRadarrBlock, #[case] active_radarr_block: ActiveRadarrBlock,
#[case] context: Option<ActiveRadarrBlock> #[case] context: Option<ActiveRadarrBlock>,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack((active_radarr_block, context).into()); app.push_navigation_stack((active_radarr_block, context).into());
@@ -68,7 +86,14 @@ mod tests {
}); });
if let Some(context) = context { if let Some(context) = context {
insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context.to_string()), output); insta::assert_snapshot!(
format!(
"{}_{}",
active_radarr_block.to_string(),
context.to_string()
),
output
);
} else { } else {
insta::assert_snapshot!(active_radarr_block.to_string(), output); insta::assert_snapshot!(active_radarr_block.to_string(), output);
} }
@@ -23,17 +23,33 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use super::*; use super::*;
use rstest::rstest;
#[rstest] #[rstest]
#[case(ActiveRadarrBlock::EditMoviePrompt, None, 0)] #[case(ActiveRadarrBlock::EditMoviePrompt, None, 0)]
#[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::MovieDetails), 0)] #[case(
#[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::MovieHistory), 1)] ActiveRadarrBlock::EditMoviePrompt,
#[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::FileInfo), 2)] Some(ActiveRadarrBlock::MovieDetails),
0
)]
#[case(
ActiveRadarrBlock::EditMoviePrompt,
Some(ActiveRadarrBlock::MovieHistory),
1
)]
#[case(
ActiveRadarrBlock::EditMoviePrompt,
Some(ActiveRadarrBlock::FileInfo),
2
)]
#[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Cast), 3)] #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Cast), 3)]
#[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Crew), 4)] #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Crew), 4)]
#[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::ManualSearch), 5)] #[case(
ActiveRadarrBlock::EditMoviePrompt,
Some(ActiveRadarrBlock::ManualSearch),
5
)]
fn test_edit_movie_ui_renders_edit_movie_modal( fn test_edit_movie_ui_renders_edit_movie_modal(
#[case] active_radarr_block: ActiveRadarrBlock, #[case] active_radarr_block: ActiveRadarrBlock,
#[case] context: Option<ActiveRadarrBlock>, #[case] context: Option<ActiveRadarrBlock>,
@@ -51,7 +67,14 @@ mod tests {
}); });
if let Some(context) = context { if let Some(context) = context {
insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context.to_string()), output); insta::assert_snapshot!(
format!(
"{}_{}",
active_radarr_block.to_string(),
context.to_string()
),
output
);
} else { } else {
insta::assert_snapshot!(active_radarr_block.to_string(), output); insta::assert_snapshot!(active_radarr_block.to_string(), output);
} }
+11 -7
View File
@@ -30,10 +30,12 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use crate::models::BlockSelectionState;
use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS};
use super::*; use super::*;
use crate::models::BlockSelectionState;
use crate::models::servarr_data::radarr::radarr_data::{
ADD_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS,
};
use rstest::rstest;
#[test] #[test]
fn test_library_ui_renders_library_tab_loading() { fn test_library_ui_renders_library_tab_loading() {
@@ -69,8 +71,9 @@ mod tests {
ActiveRadarrBlock::SearchMovieError, ActiveRadarrBlock::SearchMovieError,
ActiveRadarrBlock::FilterMovies, ActiveRadarrBlock::FilterMovies,
ActiveRadarrBlock::FilterMoviesError, ActiveRadarrBlock::FilterMoviesError,
ActiveRadarrBlock::UpdateAllMoviesPrompt, ActiveRadarrBlock::UpdateAllMoviesPrompt
)] active_radarr_block: ActiveRadarrBlock, )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
@@ -94,8 +97,9 @@ mod tests {
ActiveRadarrBlock::AddMovieSelectQualityProfile, ActiveRadarrBlock::AddMovieSelectQualityProfile,
ActiveRadarrBlock::AddMovieSelectRootFolder, ActiveRadarrBlock::AddMovieSelectRootFolder,
ActiveRadarrBlock::AddMovieAlreadyInLibrary, ActiveRadarrBlock::AddMovieAlreadyInLibrary,
ActiveRadarrBlock::AddMovieTagsInput, ActiveRadarrBlock::AddMovieTagsInput
)] active_radarr_block: ActiveRadarrBlock, )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
@@ -50,29 +50,77 @@ mod tests {
#[rstest] #[rstest]
#[case(ActiveRadarrBlock::MovieDetails, None, 0)] #[case(ActiveRadarrBlock::MovieDetails, None, 0)]
#[case(ActiveRadarrBlock::MovieDetails, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 0)] #[case(
#[case(ActiveRadarrBlock::MovieDetails, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 0)] ActiveRadarrBlock::MovieDetails,
Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt),
0
)]
#[case(
ActiveRadarrBlock::MovieDetails,
Some(ActiveRadarrBlock::UpdateAndScanPrompt),
0
)]
#[case(ActiveRadarrBlock::MovieHistory, None, 1)] #[case(ActiveRadarrBlock::MovieHistory, None, 1)]
#[case(ActiveRadarrBlock::MovieHistory, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 1)] #[case(
#[case(ActiveRadarrBlock::MovieHistory, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 1)] ActiveRadarrBlock::MovieHistory,
Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt),
1
)]
#[case(
ActiveRadarrBlock::MovieHistory,
Some(ActiveRadarrBlock::UpdateAndScanPrompt),
1
)]
#[case(ActiveRadarrBlock::FileInfo, None, 2)] #[case(ActiveRadarrBlock::FileInfo, None, 2)]
#[case(ActiveRadarrBlock::FileInfo, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 2)] #[case(
#[case(ActiveRadarrBlock::FileInfo, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 2)] ActiveRadarrBlock::FileInfo,
Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt),
2
)]
#[case(
ActiveRadarrBlock::FileInfo,
Some(ActiveRadarrBlock::UpdateAndScanPrompt),
2
)]
#[case(ActiveRadarrBlock::Cast, None, 3)] #[case(ActiveRadarrBlock::Cast, None, 3)]
#[case(ActiveRadarrBlock::Cast, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 3)] #[case(
#[case(ActiveRadarrBlock::Cast, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 3)] ActiveRadarrBlock::Cast,
Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt),
3
)]
#[case(
ActiveRadarrBlock::Cast,
Some(ActiveRadarrBlock::UpdateAndScanPrompt),
3
)]
#[case(ActiveRadarrBlock::Crew, None, 4)] #[case(ActiveRadarrBlock::Crew, None, 4)]
#[case(ActiveRadarrBlock::Crew, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 4)] #[case(
#[case(ActiveRadarrBlock::Crew, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 4)] ActiveRadarrBlock::Crew,
Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt),
4
)]
#[case(
ActiveRadarrBlock::Crew,
Some(ActiveRadarrBlock::UpdateAndScanPrompt),
4
)]
#[case(ActiveRadarrBlock::ManualSearch, None, 5)] #[case(ActiveRadarrBlock::ManualSearch, None, 5)]
#[case(ActiveRadarrBlock::ManualSearch, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 5)] #[case(
#[case(ActiveRadarrBlock::ManualSearch, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 5)] ActiveRadarrBlock::ManualSearch,
Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt),
5
)]
#[case(
ActiveRadarrBlock::ManualSearch,
Some(ActiveRadarrBlock::UpdateAndScanPrompt),
5
)]
#[case(ActiveRadarrBlock::ManualSearchSortPrompt, None, 5)] #[case(ActiveRadarrBlock::ManualSearchSortPrompt, None, 5)]
#[case(ActiveRadarrBlock::ManualSearchConfirmPrompt, None, 5)] #[case(ActiveRadarrBlock::ManualSearchConfirmPrompt, None, 5)]
fn test_movie_details_ui_renders_movie_details_tab( fn test_movie_details_ui_renders_movie_details_tab(
#[case] active_radarr_block: ActiveRadarrBlock, #[case] active_radarr_block: ActiveRadarrBlock,
#[case] context: Option<ActiveRadarrBlock>, #[case] context: Option<ActiveRadarrBlock>,
#[case] index: usize #[case] index: usize,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack((active_radarr_block, context).into()); app.push_navigation_stack((active_radarr_block, context).into());
@@ -83,9 +131,15 @@ mod tests {
}); });
if let Some(context) = context { if let Some(context) = context {
insta::assert_snapshot!(format!("movie_details_render_{active_radarr_block}_{context}"), output); insta::assert_snapshot!(
format!("movie_details_render_{active_radarr_block}_{context}"),
output
);
} else { } else {
insta::assert_snapshot!(format!("movie_details_render_{active_radarr_block}"), output); insta::assert_snapshot!(
format!("movie_details_render_{active_radarr_block}"),
output
);
} }
} }
@@ -97,8 +151,9 @@ mod tests {
ActiveRadarrBlock::FileInfo, ActiveRadarrBlock::FileInfo,
ActiveRadarrBlock::Cast, ActiveRadarrBlock::Cast,
ActiveRadarrBlock::Crew, ActiveRadarrBlock::Crew,
ActiveRadarrBlock::ManualSearch, ActiveRadarrBlock::ManualSearch
)] active_radarr_block: ActiveRadarrBlock )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default(); let mut app = App::test_default();
app.is_loading = true; app.is_loading = true;
@@ -108,7 +163,10 @@ mod tests {
MovieDetailsUi::draw(f, app, f.area()); MovieDetailsUi::draw(f, app, f.area());
}); });
insta::assert_snapshot!(format!("movie_details_loading_{active_radarr_block}"), output); insta::assert_snapshot!(
format!("movie_details_loading_{active_radarr_block}"),
output
);
} }
} }
} }
+2 -2
View File
@@ -1,14 +1,14 @@
use std::{cmp, iter};
#[cfg(test)] #[cfg(test)]
use crate::ui::ui_test_utils::test_utils::Utc; use crate::ui::ui_test_utils::test_utils::Utc;
use chrono::Duration;
#[cfg(not(test))] #[cfg(not(test))]
use chrono::Utc; use chrono::Utc;
use chrono::{Duration};
use ratatui::Frame; use ratatui::Frame;
use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::prelude::Stylize; use ratatui::prelude::Stylize;
use ratatui::text::Text; use ratatui::text::Text;
use ratatui::widgets::{Paragraph, Row}; use ratatui::widgets::{Paragraph, Row};
use std::{cmp, iter};
use crate::app::App; use crate::app::App;
use crate::logos::RADARR_LOGO; use crate::logos::RADARR_LOGO;
+1 -1
View File
@@ -22,7 +22,7 @@ mod tests {
mod snapshot_tests { mod snapshot_tests {
use super::*; use super::*;
use crate::ui::ui_test_utils::test_utils::{TerminalSize}; use crate::ui::ui_test_utils::test_utils::TerminalSize;
#[rstest] #[rstest]
#[case(ActiveRadarrBlock::Movies, 0)] #[case(ActiveRadarrBlock::Movies, 0)]
@@ -21,8 +21,8 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use super::*; use super::*;
use rstest::rstest;
#[test] #[test]
fn test_root_folders_ui_renders_loading() { fn test_root_folders_ui_renders_loading() {
@@ -55,8 +55,9 @@ mod tests {
#[values( #[values(
ActiveRadarrBlock::RootFolders, ActiveRadarrBlock::RootFolders,
ActiveRadarrBlock::AddRootFolderPrompt, ActiveRadarrBlock::AddRootFolderPrompt,
ActiveRadarrBlock::DeleteRootFolderPrompt, ActiveRadarrBlock::DeleteRootFolderPrompt
)] active_radarr_block: ActiveRadarrBlock )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
+2 -2
View File
@@ -1,9 +1,9 @@
use std::ops::Sub; use std::ops::Sub;
#[cfg(not(test))]
use chrono::Utc;
#[cfg(test)] #[cfg(test)]
use crate::ui::ui_test_utils::test_utils::Utc; use crate::ui::ui_test_utils::test_utils::Utc;
#[cfg(not(test))]
use chrono::Utc;
use ratatui::layout::Layout; use ratatui::layout::Layout;
use ratatui::style::Style; use ratatui::style::Style;
use ratatui::text::{Span, Text}; use ratatui::text::{Span, Text};
@@ -23,8 +23,8 @@ mod tests {
} }
mod snapshot_tests { mod snapshot_tests {
use rstest::rstest;
use super::*; use super::*;
use rstest::rstest;
#[rstest] #[rstest]
fn test_system_details_ui_renders_tasks( fn test_system_details_ui_renders_tasks(
@@ -33,8 +33,9 @@ mod tests {
ActiveRadarrBlock::SystemQueuedEvents, ActiveRadarrBlock::SystemQueuedEvents,
ActiveRadarrBlock::SystemTasks, ActiveRadarrBlock::SystemTasks,
ActiveRadarrBlock::SystemTaskStartConfirmPrompt, ActiveRadarrBlock::SystemTaskStartConfirmPrompt,
ActiveRadarrBlock::SystemUpdates, ActiveRadarrBlock::SystemUpdates
)] active_radarr_block: ActiveRadarrBlock )]
active_radarr_block: ActiveRadarrBlock,
) { ) {
let mut app = App::test_default_fully_populated(); let mut app = App::test_default_fully_populated();
app.push_navigation_stack(active_radarr_block.into()); app.push_navigation_stack(active_radarr_block.into());
+6 -8
View File
@@ -1,12 +1,12 @@
#[cfg(test)] #[cfg(test)]
#[allow(dead_code)] #[allow(dead_code)]
pub mod test_utils { pub mod test_utils {
use std::cell::Cell;
use chrono::DateTime; use chrono::DateTime;
use ratatui::Frame; use ratatui::Frame;
use ratatui::Terminal; use ratatui::Terminal;
use ratatui::backend::TestBackend; use ratatui::backend::TestBackend;
use ratatui::buffer::Buffer; use ratatui::buffer::Buffer;
use std::cell::Cell;
use crate::app::App; use crate::app::App;
@@ -18,14 +18,12 @@ pub mod test_utils {
impl Utc { impl Utc {
pub fn now() -> DateTime<chrono::Utc> { pub fn now() -> DateTime<chrono::Utc> {
TIMESTAMP
TIMESTAMP.with(|timestamp| { .with(|timestamp| {
let ts = timestamp.get(); let ts = timestamp.get();
DateTime::<chrono::Utc>::from_timestamp( DateTime::<chrono::Utc>::from_timestamp(if ts != 0 { ts } else { 1684618200 }, 0)
if ts != 0 { ts } else { 1684618200 }, })
0, .expect("a valid timestamp set")
)}
).expect("a valid timestamp set")
} }
} }
+3 -1
View File
@@ -122,7 +122,9 @@ where
}; };
let loading_block = LoadingBlock::new(self.is_loading, self.block.clone()); let loading_block = LoadingBlock::new(self.is_loading, self.block.clone());
if let Some(content) = self.content && !self.is_loading { if let Some(content) = self.content
&& !self.is_loading
{
let (table_contents, table_state) = if content.filtered_items.is_some() { let (table_contents, table_state) = if content.filtered_items.is_some() {
( (
content.filtered_items.as_ref().unwrap(), content.filtered_items.as_ref().unwrap(),