test: Implemented UI snapshot tests
This commit is contained in:
Generated
+12
@@ -1199,6 +1199,17 @@ version = "2.0.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "insta"
|
||||||
|
version = "1.44.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b5c943d4415edd8153251b6f197de5eb1640e56d84e8d9159bea190421c73698"
|
||||||
|
dependencies = [
|
||||||
|
"console",
|
||||||
|
"once_cell",
|
||||||
|
"similar",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "instability"
|
name = "instability"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
@@ -1401,6 +1412,7 @@ dependencies = [
|
|||||||
"human-panic",
|
"human-panic",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"indoc",
|
"indoc",
|
||||||
|
"insta",
|
||||||
"itertools 0.14.0",
|
"itertools 0.14.0",
|
||||||
"log",
|
"log",
|
||||||
"log4rs",
|
"log4rs",
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ proptest = "1.6.0"
|
|||||||
rstest = "0.25.0"
|
rstest = "0.25.0"
|
||||||
serial_test = "3.2.0"
|
serial_test = "3.2.0"
|
||||||
assertables = "9.8.2"
|
assertables = "9.8.2"
|
||||||
|
insta = "1.41.1"
|
||||||
|
|
||||||
[dev-dependencies.cargo-husky]
|
[dev-dependencies.cargo-husky]
|
||||||
version = "1"
|
version = "1"
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Seeds for failure cases proptest has generated in the past. It is
|
||||||
|
# automatically read and these particular cases re-run before any
|
||||||
|
# novel cases are generated.
|
||||||
|
#
|
||||||
|
# It is recommended to check this file in to source control so that
|
||||||
|
# everyone who runs the test benefits from these saved cases.
|
||||||
|
cc 24ae243412a324cb46c36cb4f629ddd4c9326b1479d1186d9b5545ac5e86dbba # shrinks to num_scroll_attempts = 0
|
||||||
|
cc c06a1cc1e4740b2498c50d7be64715bf09ef3ac4cf3bb3642f960578a3e06c74 # shrinks to is_loading = false, num_items = 1
|
||||||
|
cc 930207899afea2d389c7fa3974e31c2eb1803e71bcbd8179246c795903905ec7 # shrinks to parent_width = 20, parent_height = 12, percent_x = 1, percent_y = 1
|
||||||
@@ -93,17 +93,7 @@ pub trait KeyEventHandler<'a, 'b, T: Into<Route> + Copy> {
|
|||||||
fn handle_submit(&mut self);
|
fn handle_submit(&mut self);
|
||||||
fn handle_esc(&mut self);
|
fn handle_esc(&mut self);
|
||||||
fn handle_char_key_event(&mut self);
|
fn handle_char_key_event(&mut self);
|
||||||
|
|
||||||
/// Returns a mutable reference to the application state.
|
|
||||||
///
|
|
||||||
/// This method is used by the trait-based table handler to modify app state during
|
|
||||||
/// table operations (e.g., navigation stack, loading flags).
|
|
||||||
fn app_mut(&mut self) -> &mut App<'b>;
|
fn app_mut(&mut self) -> &mut App<'b>;
|
||||||
|
|
||||||
/// Returns the current navigation route.
|
|
||||||
///
|
|
||||||
/// This method is used by the trait-based table handler to determine which screen
|
|
||||||
/// or mode is currently active, enabling context-aware event handling.
|
|
||||||
fn current_route(&self) -> Route;
|
fn current_route(&self) -> Route;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -730,17 +730,14 @@ pub(in crate::network) mod test_utils {
|
|||||||
network::{Network, NetworkEvent, NetworkResource, RequestMethod},
|
network::{Network, NetworkEvent, NetworkResource, RequestMethod},
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Creates a test HTTP client
|
|
||||||
pub fn test_client() -> Client {
|
pub fn test_client() -> Client {
|
||||||
Client::new()
|
Client::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a test cancellation token
|
|
||||||
pub fn test_cancellation_token() -> CancellationToken {
|
pub fn test_cancellation_token() -> CancellationToken {
|
||||||
CancellationToken::new()
|
CancellationToken::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a test network instance
|
|
||||||
pub fn test_network<'a, 'b>(app: &'a Arc<Mutex<App<'b>>>) -> Network<'a, 'b> {
|
pub fn test_network<'a, 'b>(app: &'a Arc<Mutex<App<'b>>>) -> Network<'a, 'b> {
|
||||||
Network::new(app, test_cancellation_token(), test_client())
|
Network::new(app, test_cancellation_token(), test_client())
|
||||||
}
|
}
|
||||||
@@ -755,28 +752,23 @@ pub(in crate::network) mod test_utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MockServarrApi {
|
impl MockServarrApi {
|
||||||
/// Create a GET request builder
|
|
||||||
pub fn get() -> Self {
|
pub fn get() -> Self {
|
||||||
Self::new(RequestMethod::Get)
|
Self::new(RequestMethod::Get)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a POST request builder
|
|
||||||
pub fn post() -> Self {
|
pub fn post() -> Self {
|
||||||
Self::new(RequestMethod::Post)
|
Self::new(RequestMethod::Post)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a PUT request builder
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn put() -> Self {
|
pub fn put() -> Self {
|
||||||
Self::new(RequestMethod::Put)
|
Self::new(RequestMethod::Put)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a DELETE request builder
|
|
||||||
pub fn delete() -> Self {
|
pub fn delete() -> Self {
|
||||||
Self::new(RequestMethod::Delete)
|
Self::new(RequestMethod::Delete)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a builder with a specific request method
|
|
||||||
pub fn new(method: RequestMethod) -> Self {
|
pub fn new(method: RequestMethod) -> Self {
|
||||||
Self {
|
Self {
|
||||||
method,
|
method,
|
||||||
@@ -788,37 +780,31 @@ pub(in crate::network) mod test_utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the expected request body
|
|
||||||
pub fn with_request_body(mut self, body: Value) -> Self {
|
pub fn with_request_body(mut self, body: Value) -> Self {
|
||||||
self.request_body = Some(body);
|
self.request_body = Some(body);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the response body to return
|
|
||||||
pub fn returns(mut self, body: Value) -> Self {
|
pub fn returns(mut self, body: Value) -> Self {
|
||||||
self.response_body = Some(body);
|
self.response_body = Some(body);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the HTTP status code
|
|
||||||
pub fn status(mut self, status: usize) -> Self {
|
pub fn status(mut self, status: usize) -> Self {
|
||||||
self.response_status = status;
|
self.response_status = status;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a path suffix to the resource URL
|
|
||||||
pub fn path(mut self, path: impl Into<String>) -> Self {
|
pub fn path(mut self, path: impl Into<String>) -> Self {
|
||||||
self.path = Some(path.into());
|
self.path = Some(path.into());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add query parameters
|
|
||||||
pub fn query(mut self, params: impl Into<String>) -> Self {
|
pub fn query(mut self, params: impl Into<String>) -> Self {
|
||||||
self.query_params = Some(params.into());
|
self.query_params = Some(params.into());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Build the mock for a specific network event
|
|
||||||
pub async fn build_for<E>(
|
pub async fn build_for<E>(
|
||||||
self,
|
self,
|
||||||
network_event: E,
|
network_event: E,
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ mod radarr_ui;
|
|||||||
mod sonarr_ui;
|
mod sonarr_ui;
|
||||||
mod styles;
|
mod styles;
|
||||||
pub mod theme;
|
pub mod theme;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod ui_property_tests;
|
||||||
|
#[cfg(test)]
|
||||||
|
pub mod ui_test_utils;
|
||||||
mod utils;
|
mod utils;
|
||||||
mod widgets;
|
mod widgets;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::radarr_models::BlocklistItem;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS};
|
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::blocklist::BlocklistUi;
|
use crate::ui::radarr_ui::blocklist::BlocklistUi;
|
||||||
use strum::IntoEnumIterator;
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_blocklist_ui_accepts() {
|
fn test_blocklist_ui_accepts() {
|
||||||
@@ -15,4 +20,55 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_blocklist_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
BlocklistUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_blocklist_ui_renders_empty_blocklist() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into());
|
||||||
|
app.data.radarr_data.blocklist = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
BlocklistUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_blocklist_ui_renders_with_blocklist_items() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into());
|
||||||
|
app.data.radarr_data.blocklist = StatefulTable::default();
|
||||||
|
app.data.radarr_data.blocklist.set_items(vec![
|
||||||
|
BlocklistItem {
|
||||||
|
id: 1,
|
||||||
|
source_title: "Test.Movie.2023.1080p".to_owned(),
|
||||||
|
..BlocklistItem::default()
|
||||||
|
},
|
||||||
|
BlocklistItem {
|
||||||
|
id: 2,
|
||||||
|
source_title: "Another.Movie.2023.720p".to_owned(),
|
||||||
|
..BlocklistItem::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
BlocklistUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Movie Title Source Title Languages Quality Formats Date
|
||||||
|
=> Test.Movie.2023.1080p 1970-01-01 00:00:0
|
||||||
|
Another.Movie.2023.720p 1970-01-01 00:00:0
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::radarr_models::{Collection, CollectionMovie};
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS,
|
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
|
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collection_details_ui_accepts() {
|
fn test_collection_details_ui_accepts() {
|
||||||
@@ -33,4 +38,28 @@ mod tests {
|
|||||||
.into()
|
.into()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_collection_details_ui_renders_collection_details() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::CollectionDetails.into());
|
||||||
|
app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD - 1080p".to_owned())]);
|
||||||
|
app.data.radarr_data.collections = StatefulTable::default();
|
||||||
|
app.data.radarr_data.collections.set_items(vec![Collection {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Collection".into(),
|
||||||
|
quality_profile_id: 1,
|
||||||
|
movies: Some(vec![CollectionMovie {
|
||||||
|
title: "Movie 1".into(),
|
||||||
|
..CollectionMovie::default()
|
||||||
|
}]),
|
||||||
|
..Collection::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
CollectionDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS,
|
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::collections::CollectionsUi;
|
use crate::ui::radarr_ui::collections::CollectionsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_collections_ui_accepts() {
|
fn test_collections_ui_accepts() {
|
||||||
@@ -23,4 +27,30 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_collections_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Collections.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
CollectionsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_collections_ui_renders_empty_collections() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Collections.into());
|
||||||
|
app.data.radarr_data.collections = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
CollectionsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,19 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::radarr_models::Collection;
|
||||||
|
use crate::models::servarr_data::radarr::modals::EditCollectionModal;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS,
|
ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi;
|
use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_edit_collection_ui_accepts() {
|
fn test_edit_collection_ui_accepts() {
|
||||||
@@ -26,4 +33,29 @@ mod tests {
|
|||||||
.into()
|
.into()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_edit_collection_ui_renders_edit_collection_modal() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::EditCollectionRootFolderPathInput.into());
|
||||||
|
app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD - 1080p".to_owned())]);
|
||||||
|
app.data.radarr_data.collections = StatefulTable::default();
|
||||||
|
app.data.radarr_data.collections.set_items(vec![Collection {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Collection".into(),
|
||||||
|
quality_profile_id: 1,
|
||||||
|
root_folder_path: Some("/movies".to_owned()),
|
||||||
|
..Collection::default()
|
||||||
|
}]);
|
||||||
|
app.data.radarr_data.selected_block =
|
||||||
|
BlockSelectionState::new(EDIT_COLLECTION_SELECTION_BLOCKS);
|
||||||
|
app.data.radarr_data.edit_collection_modal =
|
||||||
|
Some(EditCollectionModal::from(&app.data.radarr_data));
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EditCollectionUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/collections/collection_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test Collection ─────────────────────────────────────────────────────────────────────╮
|
||||||
|
│Overview: │
|
||||||
|
│Root Folder Path: │
|
||||||
|
│Quality Profile: HD - 1080p │
|
||||||
|
│Minimum Availability: Announced │
|
||||||
|
│Monitored: No │
|
||||||
|
│ Movies ──────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/collections/collections_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/collections/collections_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭────────────────────── Edit - Test Collection ──────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Monitored: ╰───╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Minimum Availability: │Announced ▼ │ │
|
||||||
|
│ ╰───────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Quality Profile: │HD - 1080p ▼ │ │
|
||||||
|
│ ╰───────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Root Folder: ╰───────────────────────────────╯ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Search on Add: │ │ │
|
||||||
|
│ ╰───╯ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────╯
|
||||||
@@ -2,9 +2,13 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::radarr_models::DownloadRecord;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS};
|
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::downloads::DownloadsUi;
|
use crate::ui::radarr_ui::downloads::DownloadsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_downloads_ui_accepts() {
|
fn test_downloads_ui_accepts() {
|
||||||
@@ -16,4 +20,63 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_downloads_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Downloads.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DownloadsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_downloads_ui_renders_empty_downloads() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Downloads.into());
|
||||||
|
app.data.radarr_data.downloads = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DownloadsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_downloads_ui_renders_with_downloads() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Downloads.into());
|
||||||
|
app.data.radarr_data.downloads = StatefulTable::default();
|
||||||
|
app.data.radarr_data.downloads.set_items(vec![
|
||||||
|
DownloadRecord {
|
||||||
|
id: 1,
|
||||||
|
movie_id: 1,
|
||||||
|
title: "Test Movie Download".to_owned(),
|
||||||
|
status: "downloading".to_owned(),
|
||||||
|
size: 1024 * 1024 * 1024,
|
||||||
|
sizeleft: 512 * 1024 * 1024,
|
||||||
|
..DownloadRecord::default()
|
||||||
|
},
|
||||||
|
DownloadRecord {
|
||||||
|
id: 2,
|
||||||
|
movie_id: 2,
|
||||||
|
title: "Another Movie Download".to_owned(),
|
||||||
|
status: "completed".to_owned(),
|
||||||
|
size: 2048 * 1024 * 1024,
|
||||||
|
sizeleft: 0,
|
||||||
|
..DownloadRecord::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DownloadsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Title Percent Compl Size Output Path Indexer Download Client
|
||||||
|
=> Test Movie Download 50% 1.00 GB
|
||||||
|
Another Movie Download 100% 2.00 GB
|
||||||
@@ -1,9 +1,19 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS};
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::servarr_data::modals::EditIndexerModal;
|
||||||
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
|
ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::models::servarr_models::{Indexer, IndexerField};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
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 strum::IntoEnumIterator;
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_edit_indexer_ui_accepts() {
|
fn test_edit_indexer_ui_accepts() {
|
||||||
@@ -15,4 +25,41 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_edit_indexer_ui_renders_edit_indexer_modal() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::EditIndexerNameInput.into());
|
||||||
|
app.data.radarr_data.indexers = StatefulTable::default();
|
||||||
|
app.data.radarr_data.indexers.set_items(vec![Indexer {
|
||||||
|
id: 1,
|
||||||
|
name: Some("Test Indexer".to_owned()),
|
||||||
|
enable_rss: true,
|
||||||
|
priority: 25,
|
||||||
|
fields: Some(vec![
|
||||||
|
IndexerField {
|
||||||
|
name: Some("baseUrl".to_owned()),
|
||||||
|
value: Some(json!("https://test.indexer.com")),
|
||||||
|
},
|
||||||
|
IndexerField {
|
||||||
|
name: Some("apiKey".to_owned()),
|
||||||
|
value: Some(json!("test-api-key")),
|
||||||
|
},
|
||||||
|
IndexerField {
|
||||||
|
name: Some("seedCriteria.seedRatio".to_owned()),
|
||||||
|
value: Some(json!(1.0)),
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
..Indexer::default()
|
||||||
|
}]);
|
||||||
|
app.data.radarr_data.selected_block =
|
||||||
|
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
|
||||||
|
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.radarr_data));
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EditIndexerUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::radarr_models::IndexerSettings;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS,
|
ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS,
|
||||||
};
|
};
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
|
use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_indexer_settings_ui_accepts() {
|
fn test_indexer_settings_ui_accepts() {
|
||||||
@@ -18,4 +22,19 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexer_settings_ui_renders_indexer_settings() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into());
|
||||||
|
app.data.radarr_data.selected_block =
|
||||||
|
BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS);
|
||||||
|
app.data.radarr_data.indexer_settings = Some(IndexerSettings::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexerSettingsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS,
|
ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::servarr_models::Indexer;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::indexers::IndexersUi;
|
use crate::ui::radarr_ui::indexers::IndexersUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_indexers_ui_accepts() {
|
fn test_indexers_ui_accepts() {
|
||||||
@@ -24,4 +28,60 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexers_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexers_ui_renders_empty_indexers() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
|
||||||
|
app.data.radarr_data.indexers = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexers_ui_renders_with_indexers() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
|
||||||
|
app.data.radarr_data.indexers = StatefulTable::default();
|
||||||
|
app.data.radarr_data.indexers.set_items(vec![
|
||||||
|
Indexer {
|
||||||
|
id: 1,
|
||||||
|
name: Some("Test Indexer 1".to_owned()),
|
||||||
|
enable_rss: true,
|
||||||
|
enable_automatic_search: true,
|
||||||
|
enable_interactive_search: true,
|
||||||
|
priority: 25,
|
||||||
|
..Indexer::default()
|
||||||
|
},
|
||||||
|
Indexer {
|
||||||
|
id: 2,
|
||||||
|
name: Some("Test Indexer 2".to_owned()),
|
||||||
|
enable_rss: false,
|
||||||
|
..Indexer::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭───────────────────────────────── Edit Indexer ─────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────╮ ╭─────────────────╮ │
|
||||||
|
│ Name: ╰─────────────────╯ URL: ╰─────────────────╯ │
|
||||||
|
│ ╭───╮ ╭─────────────────╮ │
|
||||||
|
│ ╭───╮ API Key: ╰─────────────────╯ │
|
||||||
|
│ Enable Automatic Se╰───╯ ╭─────────────────╮ │
|
||||||
|
│ ╭───╮ Tags: ╰─────────────────╯ │
|
||||||
|
│ ╭─────────────────╮ │
|
||||||
|
│ Indexer Priority ▴▾╰─────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ ╭──────────────────╮╭───────────────────╮ │
|
||||||
|
│ │ Save ││ Cancel │ │
|
||||||
|
│ ╰──────────────────╯╰───────────────────╯ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭──────────────────────── Configure All Indexer Settings ────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────╮ ╭─────────────────╮ │
|
||||||
|
│ Minimum Age (minute╰─────────────────╯ Availability Delay ╰─────────────────╯ │
|
||||||
|
│ ╭─────────────────╮ ╭─────────────────╮ │
|
||||||
|
│ Retention (days) ▴▾╰─────────────────╯ RSS Sync Interval (╰─────────────────╯ │
|
||||||
|
│ ╭─────────────────╮ ╭─────────────────╮ │
|
||||||
|
│ Maximum Size (MB) ▴╰─────────────────╯ Whitelisted Subtitl╰─────────────────╯ │
|
||||||
|
│ ╭───╮ ╭───╮ │
|
||||||
|
│ Prefer Indexer Flag╰───╯ Allow Hardcoded Sub╰───╯ │
|
||||||
|
│ │
|
||||||
|
│ ╭──────────────────╮╭───────────────────╮ │
|
||||||
|
│ │ Save ││ Cancel │ │
|
||||||
|
│ ╰──────────────────╯╰───────────────────╯ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Indexer RSS Automatic Search Interactive Sea Priority Tags
|
||||||
|
=> Test Indexer 1 Enabled Enabled Enabled 25
|
||||||
|
Test Indexer 2 Disabled Disabled Disabled 0
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test All Indexers ───────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
|
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi;
|
use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_test_all_indexers_ui_accepts() {
|
fn test_test_all_indexers_ui_accepts() {
|
||||||
@@ -16,4 +18,21 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_test_all_indexers_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::TestAllIndexers.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
TestAllIndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::HorizontallyScrollableText;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock};
|
use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock};
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi;
|
use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_add_movie_ui_accepts() {
|
fn test_add_movie_ui_accepts() {
|
||||||
@@ -16,4 +19,31 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_movie_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into());
|
||||||
|
app.data.radarr_data.add_movie_search = Some(HorizontallyScrollableText::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
AddMovieUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_movie_ui_renders_search_input() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into());
|
||||||
|
app.data.radarr_data.add_movie_search = Some(HorizontallyScrollableText::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
AddMovieUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::radarr_models::Movie;
|
||||||
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
|
ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi;
|
use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_delete_movie_ui_accepts() {
|
fn test_delete_movie_ui_accepts() {
|
||||||
@@ -16,4 +24,25 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_delete_movie_ui_renders_delete_movie_prompt() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into());
|
||||||
|
app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]);
|
||||||
|
app.data.radarr_data.selected_block = BlockSelectionState::new(DELETE_MOVIE_SELECTION_BLOCKS);
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
app.data.radarr_data.movies.set_items(vec![Movie {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie".into(),
|
||||||
|
quality_profile_id: 0,
|
||||||
|
..Movie::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DeleteMovieUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,19 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::radarr_models::Movie;
|
||||||
|
use crate::models::servarr_data::radarr::modals::EditMovieModal;
|
||||||
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
|
ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi;
|
use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_edit_movie_ui_accepts() {
|
fn test_edit_movie_ui_accepts() {
|
||||||
@@ -16,4 +25,28 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_edit_movie_ui_renders_edit_movie_modal() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePathInput.into());
|
||||||
|
app.data.radarr_data.quality_profile_map =
|
||||||
|
BiMap::from_iter(vec![(1, "HD - 1080p".to_owned()), (2, "Any".to_owned())]);
|
||||||
|
app.data.radarr_data.selected_block = BlockSelectionState::new(EDIT_MOVIE_SELECTION_BLOCKS);
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
app.data.radarr_data.movies.set_items(vec![Movie {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie".into(),
|
||||||
|
path: "/movies/test".into(),
|
||||||
|
quality_profile_id: 1,
|
||||||
|
..Movie::default()
|
||||||
|
}]);
|
||||||
|
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::from(&app.data.radarr_data));
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EditMovieUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,22 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
use ratatui::style::Style;
|
use ratatui::style::Style;
|
||||||
use rstest::rstest;
|
use rstest::rstest;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::radarr_models::{Movie, RadarrRelease};
|
||||||
|
use crate::models::servarr_data::radarr::modals::MovieDetailsModal;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
|
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::library::movie_details_ui::{
|
use crate::ui::radarr_ui::library::movie_details_ui::{
|
||||||
MovieDetailsUi, style_from_download_status,
|
MovieDetailsUi, style_from_download_status,
|
||||||
};
|
};
|
||||||
use crate::ui::styles::ManagarrStyle;
|
use crate::ui::styles::ManagarrStyle;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_movie_details_ui_accepts() {
|
fn test_movie_details_ui_accepts() {
|
||||||
@@ -42,4 +48,99 @@ mod tests {
|
|||||||
expected_style
|
expected_style
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_movie_details_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into());
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
MovieDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_movie_details_ui_renders_movie_details_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into());
|
||||||
|
app.data.radarr_data.quality_profile_map =
|
||||||
|
BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]);
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
app.data.radarr_data.movies.set_items(vec![Movie {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie".into(),
|
||||||
|
..Movie::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
MovieDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_movie_details_ui_renders_movie_history_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into());
|
||||||
|
app.data.radarr_data.quality_profile_map =
|
||||||
|
BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]);
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
app.data.radarr_data.movies.set_items(vec![Movie {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie".into(),
|
||||||
|
..Movie::default()
|
||||||
|
}]);
|
||||||
|
app.data.radarr_data.movie_info_tabs.set_index(1);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
MovieDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_movie_details_ui_renders_manual_search_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into());
|
||||||
|
app.data.radarr_data.quality_profile_map =
|
||||||
|
BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]);
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
app.data.radarr_data.movies.set_items(vec![Movie {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie".into(),
|
||||||
|
..Movie::default()
|
||||||
|
}]);
|
||||||
|
app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default());
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.radarr_data
|
||||||
|
.movie_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.movie_releases = StatefulTable::default();
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.radarr_data
|
||||||
|
.movie_details_modal
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.movie_releases
|
||||||
|
.set_items(vec![RadarrRelease {
|
||||||
|
title: "Test Release".into(),
|
||||||
|
..RadarrRelease::default()
|
||||||
|
}]);
|
||||||
|
app.data.radarr_data.movie_info_tabs.set_index(2);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
MovieDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/add_movie_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭──────────────────────────────────── Add Movie ─────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
|
╭──────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/add_movie_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭──────────────────────────────────── Add Movie ─────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
|
╭──────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/delete_movie_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭───────────── Delete Movie ──────────────╮
|
||||||
|
│ Do you really want to delete: │
|
||||||
|
│ Test Movie? │
|
||||||
|
│ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Delete Movie File: │ │ │
|
||||||
|
│ ╰───╯ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Add List Exclusion: │ │ │
|
||||||
|
│ ╰───╯ │
|
||||||
|
╰───────────────────────────────────────────╯
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭──────────────────────── Edit - Test Movie ─────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Monitored: ╰───╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Minimum Availability: │Announced ▼ │ │
|
||||||
|
│ ╰───────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Quality Profile: │HD - 1080p ▼ │ │
|
||||||
|
│ ╰───────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Path: ╰───────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────╮ │
|
||||||
|
│ Tags: │ │ │
|
||||||
|
│ ╰───────────────────────────────╯ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/movie_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Cast │ Crew │ Manual Search │
|
||||||
|
│────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/movie_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Cast │ Crew │ Manual Search │
|
||||||
|
│────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/movie_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Cast │ Crew │ Manual Search │
|
||||||
|
│────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/library/movie_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Cast │ Crew │ Manual Search │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
@@ -248,3 +248,7 @@ fn draw_radarr_logo(f: &mut Frame<'_>, area: Rect) {
|
|||||||
.centered();
|
.centered();
|
||||||
f.render_widget(logo, area);
|
f.render_widget(logo, area);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[path = "radarr_ui_tests.rs"]
|
||||||
|
mod radarr_ui_tests;
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::models::radarr_models::{DownloadRecord, Movie};
|
use crate::models::radarr_models::{DownloadRecord, Movie};
|
||||||
|
use bimap::BiMap;
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
use ratatui::widgets::{Cell, Row};
|
use ratatui::widgets::{Cell, Row};
|
||||||
use rstest::rstest;
|
use rstest::rstest;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
|
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
|
||||||
use crate::ui::radarr_ui::{decorate_with_row_style, RadarrUi};
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::styles::ManagarrStyle;
|
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
|
use crate::ui::radarr_ui::{RadarrUi, decorate_with_row_style};
|
||||||
|
use crate::ui::styles::ManagarrStyle;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_radarr_ui_accepts() {
|
fn test_radarr_ui_accepts() {
|
||||||
@@ -18,6 +22,79 @@ mod tests {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_radarr_ui_renders_downloads_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
|
||||||
|
app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]);
|
||||||
|
app.data.radarr_data.main_tabs.set_index(2); // Downloads tab
|
||||||
|
app.data.radarr_data.downloads = StatefulTable::default();
|
||||||
|
app.data.radarr_data.downloads.set_items(vec![
|
||||||
|
DownloadRecord {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie 2024".to_owned(),
|
||||||
|
status: "downloading".to_owned(),
|
||||||
|
size: 2000000000,
|
||||||
|
sizeleft: 500000000,
|
||||||
|
..DownloadRecord::default()
|
||||||
|
},
|
||||||
|
DownloadRecord {
|
||||||
|
id: 2,
|
||||||
|
title: "Another Movie".to_owned(),
|
||||||
|
status: "downloading".to_owned(),
|
||||||
|
size: 1500000000,
|
||||||
|
sizeleft: 750000000,
|
||||||
|
..DownloadRecord::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RadarrUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_radarr_ui_renders_downloads_tab_empty() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
|
||||||
|
app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]);
|
||||||
|
app.data.radarr_data.main_tabs.set_index(2); // Downloads tab
|
||||||
|
app.data.radarr_data.downloads = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RadarrUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_radarr_ui_renders_library_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
|
||||||
|
app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]);
|
||||||
|
app.data.radarr_data.main_tabs.set_index(0); // Library tab
|
||||||
|
app.data.radarr_data.movies = StatefulTable::default();
|
||||||
|
app.data.radarr_data.movies.set_items(vec![Movie {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Movie".into(),
|
||||||
|
quality_profile_id: 0,
|
||||||
|
..Movie::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RadarrUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[rstest]
|
#[rstest]
|
||||||
#[case(false, Some("downloading"), false, "", RowStyle::Downloading)]
|
#[case(false, Some("downloading"), false, "", RowStyle::Downloading)]
|
||||||
#[case(false, Some("completed"), false, "", RowStyle::AwaitingImport)]
|
#[case(false, Some("completed"), false, "", RowStyle::AwaitingImport)]
|
||||||
|
|||||||
@@ -2,9 +2,14 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::HorizontallyScrollableText;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS};
|
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS};
|
||||||
|
use crate::models::servarr_models::RootFolder;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::root_folders::RootFoldersUi;
|
use crate::ui::radarr_ui::root_folders::RootFoldersUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_root_folders_ui_accepts() {
|
fn test_root_folders_ui_accepts() {
|
||||||
@@ -16,4 +21,71 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_root_folders_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RootFoldersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_root_folders_ui_renders_empty_root_folders() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into());
|
||||||
|
app.data.radarr_data.root_folders = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RootFoldersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_root_folders_ui_renders_with_root_folders() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into());
|
||||||
|
app.data.radarr_data.root_folders = StatefulTable::default();
|
||||||
|
app.data.radarr_data.root_folders.set_items(vec![
|
||||||
|
RootFolder {
|
||||||
|
path: "/movies".to_owned(),
|
||||||
|
accessible: true,
|
||||||
|
free_space: 1024 * 1024 * 1024 * 100,
|
||||||
|
..RootFolder::default()
|
||||||
|
},
|
||||||
|
RootFolder {
|
||||||
|
path: "/media/movies".to_owned(),
|
||||||
|
accessible: true,
|
||||||
|
free_space: 1024 * 1024 * 1024 * 50,
|
||||||
|
..RootFolder::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RootFoldersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_root_folders_ui_renders_add_root_folder() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::AddRootFolderPrompt.into());
|
||||||
|
app.data.radarr_data.root_folders = StatefulTable::default();
|
||||||
|
app.data.radarr_data.edit_root_folder = Some(HorizontallyScrollableText::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
RootFoldersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭────── Add Root Folder ───────╮
|
||||||
|
<esc> cancel
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Path Free Space Unmapped Folders
|
||||||
|
=> /movies 100.00 GB 0
|
||||||
|
/media/movies 50.00 GB 0
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/radarr_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │
|
||||||
|
│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/radarr_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │
|
||||||
|
│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/radarr_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │
|
||||||
|
│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ Title Year Studio Runtime Rating Languag Size Quality Pro Monitor Tags │
|
||||||
|
│=> Test Movie 0 0h 0m 0.00 GB Any │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/system/system_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/system/system_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Log Details ─────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/system/system_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ Loading ... ││ Loading ... │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯
|
||||||
|
╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/radarr_ui/system/system_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
│ ││ │
|
||||||
|
╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯
|
||||||
|
╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
@@ -2,11 +2,14 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS,
|
ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi;
|
use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_system_details_ui_accepts() {
|
fn test_system_details_ui_accepts() {
|
||||||
@@ -18,4 +21,37 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_system_details_ui_renders_loading_tasks() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::SystemTasks.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SystemDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_system_details_ui_renders_logs() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::SystemLogs.into());
|
||||||
|
app.data.radarr_data.logs.set_items(vec![
|
||||||
|
"2023-01-01T12:00:00Z | Info | Test log message 1"
|
||||||
|
.to_owned()
|
||||||
|
.into(),
|
||||||
|
"2023-01-01T12:01:00Z | Warn | Test warning message"
|
||||||
|
.to_owned()
|
||||||
|
.into(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SystemDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,13 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::radarr::radarr_data::{
|
use crate::models::servarr_data::radarr::radarr_data::{
|
||||||
ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS,
|
ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::radarr_ui::system::SystemUi;
|
use crate::ui::radarr_ui::system::SystemUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_system_ui_accepts() {
|
fn test_system_ui_accepts() {
|
||||||
@@ -22,4 +24,29 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_system_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::System.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SystemUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_system_ui_renders_system_menu() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveRadarrBlock::System.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SystemUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS};
|
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS};
|
||||||
|
use crate::models::sonarr_models::BlocklistItem;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::blocklist::BlocklistUi;
|
use crate::ui::sonarr_ui::blocklist::BlocklistUi;
|
||||||
use strum::IntoEnumIterator;
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_blocklist_ui_accepts() {
|
fn test_blocklist_ui_accepts() {
|
||||||
@@ -15,4 +20,59 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_blocklist_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
BlocklistUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_blocklist_ui_renders_empty_blocklist() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into());
|
||||||
|
app.data.sonarr_data.blocklist = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
BlocklistUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_blocklist_ui_renders_with_blocklist_items() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into());
|
||||||
|
app.data.sonarr_data.blocklist = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.blocklist.set_items(vec![
|
||||||
|
BlocklistItem {
|
||||||
|
id: 1,
|
||||||
|
source_title: "Test.Series.S01E01.1080p".to_owned(),
|
||||||
|
..BlocklistItem::default()
|
||||||
|
},
|
||||||
|
BlocklistItem {
|
||||||
|
id: 2,
|
||||||
|
source_title: "Another.Series.S02E05.720p".to_owned(),
|
||||||
|
..BlocklistItem::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
BlocklistUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Series Title Source Title Language Quality Date
|
||||||
|
=> Test.Series.S01E01.1080p 1970-01-01 00:00:0
|
||||||
|
Another.Series.S02E05.720p 1970-01-01 00:00:0
|
||||||
@@ -2,9 +2,13 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS};
|
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS};
|
||||||
|
use crate::models::sonarr_models::DownloadRecord;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::downloads::DownloadsUi;
|
use crate::ui::sonarr_ui::downloads::DownloadsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_downloads_ui_accepts() {
|
fn test_downloads_ui_accepts() {
|
||||||
@@ -16,4 +20,65 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_downloads_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Downloads.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DownloadsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_downloads_ui_renders_empty_downloads() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Downloads.into());
|
||||||
|
app.data.sonarr_data.downloads = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DownloadsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_downloads_ui_renders_with_downloads() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Downloads.into());
|
||||||
|
app.data.sonarr_data.downloads = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.downloads.set_items(vec![
|
||||||
|
DownloadRecord {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Series Download".to_owned(),
|
||||||
|
status: Default::default(),
|
||||||
|
size: 1024.0 * 1024.0 * 1024.0,
|
||||||
|
sizeleft: 512.0 * 1024.0 * 1024.0,
|
||||||
|
..DownloadRecord::default()
|
||||||
|
},
|
||||||
|
DownloadRecord {
|
||||||
|
id: 2,
|
||||||
|
title: "Another Series Download".to_owned(),
|
||||||
|
status: Default::default(),
|
||||||
|
size: 2048.0 * 1024.0 * 1024.0,
|
||||||
|
sizeleft: 0.0,
|
||||||
|
..DownloadRecord::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DownloadsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Title Percent Compl Size Output Path Indexer Download Client
|
||||||
|
=> Test Series Download 50% 1.00 GB
|
||||||
|
Another Series Download 100% 2.00 GB
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS};
|
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS};
|
||||||
|
use crate::models::sonarr_models::SonarrHistoryItem;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::history::HistoryUi;
|
use crate::ui::sonarr_ui::history::HistoryUi;
|
||||||
use strum::IntoEnumIterator;
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_history_ui_accepts() {
|
fn test_history_ui_accepts() {
|
||||||
@@ -15,4 +20,59 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_history_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::History.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
HistoryUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_history_ui_renders_empty_history() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::History.into());
|
||||||
|
app.data.sonarr_data.history = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
HistoryUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_history_ui_renders_with_history_items() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::History.into());
|
||||||
|
app.data.sonarr_data.history = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.history.set_items(vec![
|
||||||
|
SonarrHistoryItem {
|
||||||
|
id: 1,
|
||||||
|
source_title: "Test.Series.S01E01".to_owned().into(),
|
||||||
|
..SonarrHistoryItem::default()
|
||||||
|
},
|
||||||
|
SonarrHistoryItem {
|
||||||
|
id: 2,
|
||||||
|
source_title: "Another.Series.S02E05".to_owned().into(),
|
||||||
|
..SonarrHistoryItem::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
HistoryUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/history/history_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/history/history_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/history/history_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Source Title Event Type Language Quality Date
|
||||||
|
=> Test.Series.S01E01 unknown 1970-01-01 00:00:00 UTC
|
||||||
|
Another.Series.S02E05 unknown 1970-01-01 00:00:00 UTC
|
||||||
@@ -1,9 +1,19 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS};
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::servarr_data::modals::EditIndexerModal;
|
||||||
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
|
ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::models::servarr_models::{Indexer, IndexerField};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi;
|
use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi;
|
||||||
use strum::IntoEnumIterator;
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_edit_indexer_ui_accepts() {
|
fn test_edit_indexer_ui_accepts() {
|
||||||
@@ -15,4 +25,45 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_edit_indexer_ui_renders_edit_indexer_modal() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::EditIndexerNameInput.into());
|
||||||
|
app.data.sonarr_data.indexers = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.indexers.set_items(vec![Indexer {
|
||||||
|
id: 1,
|
||||||
|
name: Some("Test Indexer".to_owned()),
|
||||||
|
enable_rss: true,
|
||||||
|
priority: 25,
|
||||||
|
fields: Some(vec![
|
||||||
|
IndexerField {
|
||||||
|
name: Some("baseUrl".to_owned()),
|
||||||
|
value: Some(json!("https://test.indexer.com")),
|
||||||
|
},
|
||||||
|
IndexerField {
|
||||||
|
name: Some("apiKey".to_owned()),
|
||||||
|
value: Some(json!("test-api-key")),
|
||||||
|
},
|
||||||
|
IndexerField {
|
||||||
|
name: Some("seedCriteria.seedRatio".to_owned()),
|
||||||
|
value: Some(json!(1.0)),
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
..Indexer::default()
|
||||||
|
}]);
|
||||||
|
app.data.sonarr_data.selected_block =
|
||||||
|
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
|
||||||
|
app.data.sonarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.sonarr_data));
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EditIndexerUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS,
|
ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::sonarr_models::IndexerSettings;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
|
use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_indexer_settings_ui_accepts() {
|
fn test_indexer_settings_ui_accepts() {
|
||||||
@@ -18,4 +22,23 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexer_settings_ui_renders_indexer_settings() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::IndexerSettingsMinimumAgeInput.into());
|
||||||
|
app.data.sonarr_data.selected_block =
|
||||||
|
BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS);
|
||||||
|
app.data.sonarr_data.indexer_settings = Some(IndexerSettings::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexerSettingsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,15 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS,
|
ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::servarr_models::Indexer;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::indexers::IndexersUi;
|
use crate::ui::sonarr_ui::indexers::IndexersUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_indexers_ui_accepts() {
|
fn test_indexers_ui_accepts() {
|
||||||
@@ -24,4 +28,64 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexers_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Indexers.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexers_ui_renders_empty_indexers() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Indexers.into());
|
||||||
|
app.data.sonarr_data.indexers = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_indexers_ui_renders_with_indexers() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Indexers.into());
|
||||||
|
app.data.sonarr_data.indexers = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.indexers.set_items(vec![
|
||||||
|
Indexer {
|
||||||
|
id: 1,
|
||||||
|
name: Some("Test Indexer 1".to_owned()),
|
||||||
|
enable_rss: true,
|
||||||
|
enable_automatic_search: true,
|
||||||
|
enable_interactive_search: true,
|
||||||
|
priority: 25,
|
||||||
|
..Indexer::default()
|
||||||
|
},
|
||||||
|
Indexer {
|
||||||
|
id: 2,
|
||||||
|
name: Some("Test Indexer 2".to_owned()),
|
||||||
|
enable_rss: false,
|
||||||
|
..Indexer::default()
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
IndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭───────────────────────────────── Edit Indexer ─────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ ╭─────────────────╮ ╭─────────────────╮ │
|
||||||
|
│ Name: ╰─────────────────╯ URL: ╰─────────────────╯ │
|
||||||
|
│ ╭───╮ ╭─────────────────╮ │
|
||||||
|
│ ╭───╮ API Key: ╰─────────────────╯ │
|
||||||
|
│ Enable Automatic Se╰───╯ ╭─────────────────╮ │
|
||||||
|
│ ╭───╮ Tags: ╰─────────────────╯ │
|
||||||
|
│ ╭─────────────────╮ │
|
||||||
|
│ Indexer Priority ▴▾╰─────────────────╯ │
|
||||||
|
│ │
|
||||||
|
│ ╭──────────────────╮╭───────────────────╮ │
|
||||||
|
│ │ Save ││ Cancel │ │
|
||||||
|
│ ╰──────────────────╯╰───────────────────╯ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭───────── Configure All Indexer Settings ─────────╮
|
||||||
|
│ ╭───────────────────────╮ │
|
||||||
|
│Minimum Age (minutes) ▴▾:│0 │ │
|
||||||
|
│ ╰───────────────────────╯ │
|
||||||
|
│ ╭───────────────────────╮ │
|
||||||
|
│ Retention (days) ▴▾: │0 │ │
|
||||||
|
│ ╰───────────────────────╯ │
|
||||||
|
│ ╭───────────────────────╮ │
|
||||||
|
│ Maximum Size (MB) ▴▾: │0 │ │
|
||||||
|
│ ╰───────────────────────╯ │
|
||||||
|
│ ╭───────────────────────╮ │
|
||||||
|
│RSS Sync Interval (minute│0 │ │
|
||||||
|
│ ╰───────────────────────╯ │
|
||||||
|
╰────────────────────────────────────────────────────╯
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Indexer RSS Automatic Search Interactive Sea Priority Tags
|
||||||
|
=> Test Indexer 1 Enabled Enabled Enabled 25
|
||||||
|
Test Indexer 2 Disabled Disabled Disabled 0
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Test All Indexers ───────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
|
use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi;
|
use crate::ui::sonarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_test_all_indexers_ui_accepts() {
|
fn test_test_all_indexers_ui_accepts() {
|
||||||
@@ -16,4 +18,21 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_test_all_indexers_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::TestAllIndexers.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
TestAllIndexersUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::HorizontallyScrollableText;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock};
|
use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock};
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::library::add_series_ui::AddSeriesUi;
|
use crate::ui::sonarr_ui::library::add_series_ui::AddSeriesUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_add_series_ui_accepts() {
|
fn test_add_series_ui_accepts() {
|
||||||
@@ -16,4 +19,35 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_series_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into());
|
||||||
|
app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
AddSeriesUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_series_ui_renders_search_input() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into());
|
||||||
|
app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
AddSeriesUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,16 @@
|
|||||||
mod tests {
|
mod tests {
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS};
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
|
ActiveSonarrBlock, DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::models::sonarr_models::Series;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::library::delete_series_ui::DeleteSeriesUi;
|
use crate::ui::sonarr_ui::library::delete_series_ui::DeleteSeriesUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_delete_series_ui_accepts() {
|
fn test_delete_series_ui_accepts() {
|
||||||
@@ -16,4 +23,28 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_delete_series_ui_renders_delete_series_toggle() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::DeleteSeriesPrompt.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Series".into(),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
app.data.sonarr_data.selected_block =
|
||||||
|
BlockSelectionState::new(DELETE_SERIES_SELECTION_BLOCKS);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
DeleteSeriesUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,19 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS};
|
use crate::app::App;
|
||||||
|
use crate::models::BlockSelectionState;
|
||||||
|
use crate::models::servarr_data::sonarr::modals::EditSeriesModal;
|
||||||
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
|
ActiveSonarrBlock, EDIT_SERIES_BLOCKS, EDIT_SERIES_SELECTION_BLOCKS,
|
||||||
|
};
|
||||||
|
use crate::models::sonarr_models::Series;
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::library::edit_series_ui::EditSeriesUi;
|
use crate::ui::sonarr_ui::library::edit_series_ui::EditSeriesUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_edit_series_ui_accepts() {
|
fn test_edit_series_ui_accepts() {
|
||||||
@@ -16,4 +25,34 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_edit_series_ui_renders_edit_series_modal() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::EditSeriesPathInput.into());
|
||||||
|
app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD-1080p".to_owned())]);
|
||||||
|
app.data.sonarr_data.language_profiles_map =
|
||||||
|
BiMap::from_iter(vec![(1, "English".to_owned())]);
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Series".into(),
|
||||||
|
path: "/tv/test".to_owned(),
|
||||||
|
quality_profile_id: 1,
|
||||||
|
language_profile_id: 1,
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
app.data.sonarr_data.selected_block = BlockSelectionState::new(EDIT_SERIES_SELECTION_BLOCKS);
|
||||||
|
app.data.sonarr_data.edit_series_modal = Some(EditSeriesModal::from(&app.data.sonarr_data));
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EditSeriesUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal};
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS,
|
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::sonarr_models::{Episode, Season, Series};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi;
|
use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi;
|
||||||
use strum::IntoEnumIterator;
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_episode_details_ui_accepts() {
|
fn test_episode_details_ui_accepts() {
|
||||||
@@ -17,4 +23,111 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_episode_details_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season {
|
||||||
|
season_number: 1,
|
||||||
|
..Season::default()
|
||||||
|
}]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EpisodeDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_episode_details_ui_renders_episode_details_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season {
|
||||||
|
season_number: 1,
|
||||||
|
..Season::default()
|
||||||
|
}]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
let mut season_details_modal = SeasonDetailsModal::default();
|
||||||
|
season_details_modal
|
||||||
|
.episodes
|
||||||
|
.set_items(vec![Episode::default()]);
|
||||||
|
season_details_modal.episode_details_modal = Some(EpisodeDetailsModal::default());
|
||||||
|
app.data.sonarr_data.season_details_modal = Some(season_details_modal);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EpisodeDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_episode_details_ui_renders_episode_history_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season {
|
||||||
|
season_number: 1,
|
||||||
|
..Season::default()
|
||||||
|
}]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
let mut season_details_modal = SeasonDetailsModal::default();
|
||||||
|
season_details_modal
|
||||||
|
.episodes
|
||||||
|
.set_items(vec![Episode::default()]);
|
||||||
|
let mut episode_details_modal = EpisodeDetailsModal::default();
|
||||||
|
episode_details_modal.episode_details_tabs.set_index(1);
|
||||||
|
season_details_modal.episode_details_modal = Some(episode_details_modal);
|
||||||
|
app.data.sonarr_data.season_details_modal = Some(season_details_modal);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EpisodeDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_episode_details_ui_renders_manual_search_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season {
|
||||||
|
season_number: 1,
|
||||||
|
..Season::default()
|
||||||
|
}]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
let mut season_details_modal = SeasonDetailsModal::default();
|
||||||
|
season_details_modal
|
||||||
|
.episodes
|
||||||
|
.set_items(vec![Episode::default()]);
|
||||||
|
let mut episode_details_modal = EpisodeDetailsModal::default();
|
||||||
|
episode_details_modal.episode_details_tabs.set_index(3);
|
||||||
|
season_details_modal.episode_details_modal = Some(episode_details_modal);
|
||||||
|
app.data.sonarr_data.season_details_modal = Some(season_details_modal);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
EpisodeDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,4 +245,41 @@ mod tests {
|
|||||||
|
|
||||||
assert_eq!(style, row.indeterminate());
|
assert_eq!(style, row.indeterminate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
|
||||||
|
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
|
use crate::ui::DrawUi;
|
||||||
|
use crate::ui::sonarr_ui::library::LibraryUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_library_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Series.into());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
LibraryUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_library_ui_renders_empty_series() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::Series.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
LibraryUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
|
use crate::models::servarr_data::sonarr::modals::SeasonDetailsModal;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS,
|
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::sonarr_models::{Season, Series};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi;
|
use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_season_details_ui_accepts() {
|
fn test_season_details_ui_accepts() {
|
||||||
@@ -21,4 +27,121 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_season_details_ui_renders_loading_state() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.is_loading = true;
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season::default()]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SeasonDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_season_details_ui_renders_episodes_tab() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into());
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season::default()]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SeasonDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_season_details_ui_renders_manual_search_tab() {
|
||||||
|
use crate::models::sonarr_models::{Episode, EpisodeFile, SonarrRelease};
|
||||||
|
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into());
|
||||||
|
app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]);
|
||||||
|
app.data.sonarr_data.language_profiles_map =
|
||||||
|
BiMap::from_iter(vec![(0, "English".to_owned())]);
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season::default()]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.sonarr_data
|
||||||
|
.seasons
|
||||||
|
.set_items(vec![Season::default()]);
|
||||||
|
let mut season_details_modal = SeasonDetailsModal::default();
|
||||||
|
season_details_modal.season_details_tabs.set_index(2);
|
||||||
|
season_details_modal
|
||||||
|
.episodes
|
||||||
|
.set_items(vec![Episode::default()]);
|
||||||
|
season_details_modal
|
||||||
|
.episode_files
|
||||||
|
.set_items(vec![EpisodeFile::default()]);
|
||||||
|
season_details_modal
|
||||||
|
.season_releases
|
||||||
|
.set_items(vec![SonarrRelease::default()]);
|
||||||
|
app.data.sonarr_data.season_details_modal = Some(season_details_modal);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SeasonDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_season_details_ui_renders_season_history_tab() {
|
||||||
|
use crate::models::sonarr_models::{Episode, EpisodeFile, SonarrHistoryItem};
|
||||||
|
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into());
|
||||||
|
app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]);
|
||||||
|
app.data.sonarr_data.language_profiles_map =
|
||||||
|
BiMap::from_iter(vec![(0, "English".to_owned())]);
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
seasons: Some(vec![Season::default()]),
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
app
|
||||||
|
.data
|
||||||
|
.sonarr_data
|
||||||
|
.seasons
|
||||||
|
.set_items(vec![Season::default()]);
|
||||||
|
let mut season_details_modal = SeasonDetailsModal::default();
|
||||||
|
season_details_modal.season_details_tabs.set_index(1);
|
||||||
|
season_details_modal
|
||||||
|
.episodes
|
||||||
|
.set_items(vec![Episode::default()]);
|
||||||
|
season_details_modal
|
||||||
|
.episode_files
|
||||||
|
.set_items(vec![EpisodeFile::default()]);
|
||||||
|
season_details_modal
|
||||||
|
.season_history
|
||||||
|
.set_items(vec![SonarrHistoryItem::default()]);
|
||||||
|
app.data.sonarr_data.season_details_modal = Some(season_details_modal);
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SeasonDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use bimap::BiMap;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
|
use crate::app::App;
|
||||||
use crate::models::servarr_data::sonarr::sonarr_data::{
|
use crate::models::servarr_data::sonarr::sonarr_data::{
|
||||||
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS,
|
ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS,
|
||||||
};
|
};
|
||||||
|
use crate::models::sonarr_models::{Season, Series};
|
||||||
|
use crate::models::stateful_table::StatefulTable;
|
||||||
use crate::ui::DrawUi;
|
use crate::ui::DrawUi;
|
||||||
use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi;
|
use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi;
|
||||||
|
use crate::ui::ui_test_utils::test_utils::render_to_string_with_app;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_series_details_ui_accepts() {
|
fn test_series_details_ui_accepts() {
|
||||||
@@ -22,4 +27,33 @@ mod tests {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod snapshot_tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_series_details_ui_renders_series_details() {
|
||||||
|
let mut app = App::test_default();
|
||||||
|
app.push_navigation_stack(ActiveSonarrBlock::SeriesDetails.into());
|
||||||
|
app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD-1080p".to_owned())]);
|
||||||
|
app.data.sonarr_data.language_profiles_map =
|
||||||
|
BiMap::from_iter(vec![(1, "English".to_owned())]);
|
||||||
|
app.data.sonarr_data.series = StatefulTable::default();
|
||||||
|
app.data.sonarr_data.series.set_items(vec![Series {
|
||||||
|
id: 1,
|
||||||
|
title: "Test Series".into(),
|
||||||
|
seasons: Some(vec![Season::default()]),
|
||||||
|
quality_profile_id: 1,
|
||||||
|
language_profile_id: 1,
|
||||||
|
..Series::default()
|
||||||
|
}]);
|
||||||
|
app.data.sonarr_data.series_history = Some(StatefulTable::default());
|
||||||
|
|
||||||
|
let output = render_to_string_with_app(120, 30, &mut app, |f, app| {
|
||||||
|
SeriesDetailsUi::draw(f, app, f.area());
|
||||||
|
});
|
||||||
|
|
||||||
|
insta::assert_snapshot!(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/add_series_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭──────────────────────────────────── Add Series ────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
|
╭──────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/add_series_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭──────────────────────────────────── Add Series ────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
|
╭──────────────────────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/delete_series_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭───────────── Delete Series ─────────────╮
|
||||||
|
│ Do you really want to delete the series: │
|
||||||
|
│ Test Series? │
|
||||||
|
│ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Delete Series File: │ │ │
|
||||||
|
│ ╰───╯ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Add List Exclusion: │ │ │
|
||||||
|
│ ╰───╯ │
|
||||||
|
╰───────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭─────────────────────────── Edit - Test Series ───────────────────────────╮
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Monitored: ╰───╯ │
|
||||||
|
│ ╭───╮ │
|
||||||
|
│ Season Folder: │ │ │
|
||||||
|
│ ╰───╯ │
|
||||||
|
│ ╭───────────────────────────────────╮ │
|
||||||
|
│ Quality Profile: ╰───────────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────────╮ │
|
||||||
|
│ Language Profile: │English ▼ │ │
|
||||||
|
│ ╰───────────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────────╮ │
|
||||||
|
│ Series Type: ╰───────────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────────╮ │
|
||||||
|
│ Path: │/tv/test │ │
|
||||||
|
│ ╰───────────────────────────────────╯ │
|
||||||
|
│ ╭───────────────────────────────────╮ │
|
||||||
|
│ Tags: ╰───────────────────────────────────╯ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Episode Details ─────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Manual Search │
|
||||||
|
│────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Episode Details ─────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Manual Search │
|
||||||
|
│────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭ Episode Details ─────────────────────────────────────────────────────────────────────╮
|
||||||
|
│ Details │ History │ File │ Manual Search │
|
||||||
|
│────────────────────────────────────────────────────────────────────────────────────────│
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ Loading ... │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
│ │
|
||||||
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/library_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/library_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
Loading ...
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/season_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
source: src/ui/sonarr_ui/library/season_details_ui_tests.rs
|
||||||
|
expression: output
|
||||||
|
---
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user