feat(readarr): trigger Readarr tasks and expose the command on the CLI

The task name is sent as the shared CommandBody, matching the Radarr, Sonarr, and Lidarr implementations. The response is returned verbatim and no app state is mutated.
This commit is contained in:
Dark-Alex-17 committed 2026-08-20 21:49:28 -06:00
1 parent bd0274411c
commit ab3992c372
6 files changed
+182 -3

No files matched your search

+86
View File
@@ -2,6 +2,8 @@
mod tests {
mod cli {
use clap::CommandFactory;
use clap::error::ErrorKind;
use pretty_assertions::assert_eq;
use crate::Cli;
@@ -11,5 +13,89 @@ mod tests {
assert_err!(&result);
}
#[test]
fn test_start_task_requires_task_name() {
let result = Cli::command().try_get_matches_from(["managarr", "readarr", "start-task"]);
assert_err!(&result);
assert_eq!(
result.unwrap_err().kind(),
ErrorKind::MissingRequiredArgument
);
}
#[test]
fn test_start_task_task_name_validation() {
let result = Cli::command().try_get_matches_from([
"managarr",
"readarr",
"start-task",
"--task-name",
"test",
]);
assert_err!(&result);
assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue);
}
#[test]
fn test_start_task_requirements_satisfied() {
let result = Cli::command().try_get_matches_from([
"managarr",
"readarr",
"start-task",
"--task-name",
"check-health",
]);
assert_ok!(&result);
}
}
mod handler {
use std::sync::Arc;
use mockall::predicate::eq;
use serde_json::json;
use tokio::sync::Mutex;
use crate::models::readarr_models::{ReadarrSerdeable, ReadarrTaskName};
use crate::{
app::App,
cli::{
CliCommandHandler,
readarr::{ReadarrCliHandler, ReadarrCommand},
},
models::Serdeable,
network::{MockNetworkTrait, NetworkEvent, readarr_network::ReadarrEvent},
};
#[tokio::test]
async fn test_start_task_command() {
let expected_task_name = ReadarrTaskName::CheckHealth;
let mut mock_network = MockNetworkTrait::new();
mock_network
.expect_handle_network_event()
.with(eq::<NetworkEvent>(
ReadarrEvent::StartTask(expected_task_name).into(),
))
.times(1)
.returning(|_| {
Ok(Serdeable::Readarr(ReadarrSerdeable::Value(
json!({"testResponse": "response"}),
)))
});
let app_arc = Arc::new(Mutex::new(App::test_default()));
let start_task_command = ReadarrCommand::StartTask {
task_name: ReadarrTaskName::CheckHealth,
};
let result = ReadarrCliHandler::with(&app_arc, start_task_command, &mut mock_network)
.handle()
.await;
assert_ok!(&result);
}
}
}