Refactored the ErrorMessage widget into a generic Message widget for enhanced reuse. Added support for testing a single indexer at a time.

This commit is contained in:
2024-02-15 11:11:10 -07:00
parent b49bfaa9c1
commit a360c83431
23 changed files with 418 additions and 78 deletions
+58
View File
@@ -63,6 +63,7 @@ pub enum RadarrEvent {
HealthCheck,
SearchNewMovie,
StartTask,
TestIndexer,
TestAllIndexers,
TriggerAutomaticSearch,
UpdateAllMovies,
@@ -99,6 +100,7 @@ impl RadarrEvent {
RadarrEvent::GetTags => "/tag",
RadarrEvent::GetTasks => "/system/task",
RadarrEvent::GetUpdates => "/update",
RadarrEvent::TestIndexer => "/indexer/test",
RadarrEvent::TestAllIndexers => "/indexer/testall",
RadarrEvent::StartTask
| RadarrEvent::GetQueuedEvents
@@ -153,6 +155,7 @@ impl<'a, 'b> Network<'a, 'b> {
RadarrEvent::HealthCheck => self.get_healthcheck().await,
RadarrEvent::SearchNewMovie => self.search_movie().await,
RadarrEvent::StartTask => self.start_task().await,
RadarrEvent::TestIndexer => self.test_indexer().await,
RadarrEvent::TestAllIndexers => self.test_all_indexers().await,
RadarrEvent::TriggerAutomaticSearch => self.trigger_automatic_search().await,
RadarrEvent::UpdateAllMovies => self.update_all_movies().await,
@@ -1524,6 +1527,61 @@ impl<'a, 'b> Network<'a, 'b> {
.await;
}
async fn test_indexer(&mut self) {
let id = self
.app
.lock()
.await
.data
.radarr_data
.indexers
.current_selection()
.id;
info!("Testing Radarr indexer with ID: {id}");
info!("Fetching indexer details for indexer with ID: {id}");
let request_props = self
.radarr_request_props_from(
format!("{}/{id}", RadarrEvent::GetIndexers.resource()).as_str(),
RequestMethod::Get,
None::<()>,
)
.await;
let mut test_body: Value = Value::default();
self
.handle_request::<(), Value>(request_props, |detailed_indexer_body, _| {
test_body = detailed_indexer_body;
})
.await;
info!("Testing indexer");
let mut request_props = self
.radarr_request_props_from(
RadarrEvent::TestIndexer.resource(),
RequestMethod::Post,
Some(test_body),
)
.await;
request_props.ignore_status_code = true;
self
.handle_request::<Value, Value>(request_props, |test_results, mut app| {
if test_results.as_object().is_none() {
app.data.radarr_data.indexer_test_error = Some(
test_results.as_array().unwrap()[0]
.get("errorMessage")
.unwrap()
.to_string(),
);
};
})
.await;
}
async fn test_all_indexers(&mut self) {
info!("Testing all indexers");
+134
View File
@@ -196,6 +196,7 @@ mod test {
#[case(RadarrEvent::GetTags, "/tag")]
#[case(RadarrEvent::GetTasks, "/system/task")]
#[case(RadarrEvent::GetUpdates, "/update")]
#[case(RadarrEvent::TestIndexer, "/indexer/test")]
#[case(RadarrEvent::TestAllIndexers, "/indexer/testall")]
#[case(RadarrEvent::HealthCheck, "/health")]
fn test_resource(#[case] event: RadarrEvent, #[case] expected_uri: String) {
@@ -686,6 +687,139 @@ mod test {
);
}
#[tokio::test]
async fn test_handle_test_indexer_event_error() {
let indexer_details_json = json!({
"enableRss": true,
"enableAutomaticSearch": true,
"enableInteractiveSearch": true,
"name": "Test Indexer",
"fields": [
{
"name": "baseUrl",
"value": "https://test.com",
},
{
"name": "apiKey",
"value": "",
},
{
"name": "seedCriteria.seedRatio",
"value": "1.2",
},
],
"tags": [1],
"id": 1
});
let response_json = json!([
{
"isWarning": false,
"propertyName": "",
"errorMessage": "test failure",
"severity": "error"
}]);
let resource = format!("{}/1", RadarrEvent::GetIndexers.resource());
let (async_details_server, app_arc, mut server) = mock_radarr_api(
RequestMethod::Get,
None,
Some(indexer_details_json.clone()),
None,
&resource,
)
.await;
let async_test_server = server
.mock(
"POST",
format!("/api/v3{}", RadarrEvent::TestIndexer.resource()).as_str(),
)
.with_status(400)
.match_header("X-Api-Key", "test1234")
.match_body(Matcher::Json(indexer_details_json))
.with_body(response_json.to_string())
.create_async()
.await;
app_arc
.lock()
.await
.data
.radarr_data
.indexers
.set_items(vec![indexer()]);
let mut network = Network::new(&app_arc, CancellationToken::new());
network.handle_radarr_event(RadarrEvent::TestIndexer).await;
async_details_server.assert_async().await;
async_test_server.assert_async().await;
assert_eq!(
app_arc.lock().await.data.radarr_data.indexer_test_error,
Some("\"test failure\"".to_owned())
);
}
#[tokio::test]
async fn test_handle_test_indexer_event_success() {
let indexer_details_json = json!({
"enableRss": true,
"enableAutomaticSearch": true,
"enableInteractiveSearch": true,
"name": "Test Indexer",
"fields": [
{
"name": "baseUrl",
"value": "https://test.com",
},
{
"name": "apiKey",
"value": "",
},
{
"name": "seedCriteria.seedRatio",
"value": "1.2",
},
],
"tags": [1],
"id": 1
});
let resource = format!("{}/1", RadarrEvent::GetIndexers.resource());
let (async_details_server, app_arc, mut server) = mock_radarr_api(
RequestMethod::Get,
None,
Some(indexer_details_json.clone()),
None,
&resource,
)
.await;
let async_test_server = server
.mock(
"POST",
format!("/api/v3{}", RadarrEvent::TestIndexer.resource()).as_str(),
)
.with_status(200)
.match_header("X-Api-Key", "test1234")
.match_body(Matcher::Json(indexer_details_json))
.with_body("{}")
.create_async()
.await;
app_arc
.lock()
.await
.data
.radarr_data
.indexers
.set_items(vec![indexer()]);
let mut network = Network::new(&app_arc, CancellationToken::new());
network.handle_radarr_event(RadarrEvent::TestIndexer).await;
async_details_server.assert_async().await;
async_test_server.assert_async().await;
assert_eq!(
app_arc.lock().await.data.radarr_data.indexer_test_error,
None
);
}
#[tokio::test]
async fn test_handle_test_all_indexers_event() {
let indexers = vec![