refactor: Network module is now broken out into similar directory structures for each servarr to mimic the rest of the project to make it easier to develop and maintain
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
use crate::models::radarr_models::DownloadsResponse;
|
||||
use crate::models::servarr_models::CommandBody;
|
||||
use crate::network::radarr_network::RadarrEvent;
|
||||
use crate::network::{Network, RequestMethod};
|
||||
use anyhow::Result;
|
||||
use log::info;
|
||||
use serde_json::Value;
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "radarr_downloads_network_tests.rs"]
|
||||
mod radarr_downloads_network_tests;
|
||||
|
||||
impl Network<'_, '_> {
|
||||
pub(in crate::network::radarr_network) async fn delete_radarr_download(
|
||||
&mut self,
|
||||
download_id: i64,
|
||||
) -> Result<()> {
|
||||
let event = RadarrEvent::DeleteDownload(download_id);
|
||||
info!("Deleting Radarr download for download with id: {download_id}");
|
||||
|
||||
let request_props = self
|
||||
.request_props_from(
|
||||
event,
|
||||
RequestMethod::Delete,
|
||||
None::<()>,
|
||||
Some(format!("/{download_id}")),
|
||||
None,
|
||||
)
|
||||
.await;
|
||||
|
||||
self
|
||||
.handle_request::<(), ()>(request_props, |_, _| ())
|
||||
.await
|
||||
}
|
||||
|
||||
pub(in crate::network::radarr_network) async fn get_radarr_downloads(
|
||||
&mut self,
|
||||
count: u64,
|
||||
) -> Result<DownloadsResponse> {
|
||||
info!("Fetching Radarr downloads");
|
||||
let event = RadarrEvent::GetDownloads(count);
|
||||
|
||||
let request_props = self
|
||||
.request_props_from(
|
||||
event,
|
||||
RequestMethod::Get,
|
||||
None::<()>,
|
||||
None,
|
||||
Some(format!("pageSize={count}")),
|
||||
)
|
||||
.await;
|
||||
|
||||
self
|
||||
.handle_request::<(), DownloadsResponse>(request_props, |queue_response, mut app| {
|
||||
app
|
||||
.data
|
||||
.radarr_data
|
||||
.downloads
|
||||
.set_items(queue_response.records);
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
pub(in crate::network::radarr_network) async fn update_radarr_downloads(
|
||||
&mut self,
|
||||
) -> Result<Value> {
|
||||
info!("Updating Radarr downloads");
|
||||
let event = RadarrEvent::UpdateDownloads;
|
||||
let body = CommandBody {
|
||||
name: "RefreshMonitoredDownloads".to_owned(),
|
||||
};
|
||||
|
||||
let request_props = self
|
||||
.request_props_from(event, RequestMethod::Post, Some(body), None, None)
|
||||
.await;
|
||||
|
||||
self
|
||||
.handle_request::<CommandBody, Value>(request_props, |_, _| ())
|
||||
.await
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::models::radarr_models::{DownloadsResponse, RadarrSerdeable};
|
||||
use crate::network::network_tests::test_utils::mock_servarr_api;
|
||||
use crate::network::radarr_network::radarr_network_test_utils::test_utils::downloads_response;
|
||||
use crate::network::radarr_network::RadarrEvent;
|
||||
use crate::network::{Network, RequestMethod};
|
||||
use reqwest::Client;
|
||||
use serde_json::json;
|
||||
use tokio_util::sync::CancellationToken;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_handle_delete_radarr_download_event() {
|
||||
let (async_server, app_arc, _server) = mock_servarr_api(
|
||||
RequestMethod::Delete,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
RadarrEvent::DeleteDownload(1),
|
||||
Some("/1"),
|
||||
None,
|
||||
)
|
||||
.await;
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
assert!(network
|
||||
.handle_radarr_event(RadarrEvent::DeleteDownload(1))
|
||||
.await
|
||||
.is_ok());
|
||||
|
||||
async_server.assert_async().await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_handle_get_radarr_downloads_event() {
|
||||
let downloads_response_json = json!({
|
||||
"records": [{
|
||||
"title": "Test Download Title",
|
||||
"status": "downloading",
|
||||
"id": 1,
|
||||
"movieId": 1,
|
||||
"size": 3543348019u64,
|
||||
"sizeleft": 1771674009,
|
||||
"outputPath": "/nfs/movies/Test",
|
||||
"indexer": "kickass torrents",
|
||||
"downloadClient": "transmission",
|
||||
}]
|
||||
});
|
||||
let response: DownloadsResponse =
|
||||
serde_json::from_value(downloads_response_json.clone()).unwrap();
|
||||
let (async_server, app_arc, _server) = mock_servarr_api(
|
||||
RequestMethod::Get,
|
||||
None,
|
||||
Some(downloads_response_json),
|
||||
None,
|
||||
RadarrEvent::GetDownloads(500),
|
||||
None,
|
||||
Some("pageSize=500"),
|
||||
)
|
||||
.await;
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
if let RadarrSerdeable::DownloadsResponse(downloads) = network
|
||||
.handle_radarr_event(RadarrEvent::GetDownloads(500))
|
||||
.await
|
||||
.unwrap()
|
||||
{
|
||||
async_server.assert_async().await;
|
||||
pretty_assertions::assert_eq!(
|
||||
app_arc.lock().await.data.radarr_data.downloads.items,
|
||||
downloads_response().records
|
||||
);
|
||||
pretty_assertions::assert_eq!(downloads, response);
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_handle_update_radarr_downloads_event() {
|
||||
let (async_server, app_arc, _server) = mock_servarr_api(
|
||||
RequestMethod::Post,
|
||||
Some(json!({
|
||||
"name": "RefreshMonitoredDownloads"
|
||||
})),
|
||||
Some(json!({})),
|
||||
None,
|
||||
RadarrEvent::UpdateDownloads,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
.await;
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
assert!(network
|
||||
.handle_radarr_event(RadarrEvent::UpdateDownloads)
|
||||
.await
|
||||
.is_ok());
|
||||
|
||||
async_server.assert_async().await;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user