use crate::config::Config;
use crate::db::Database;
use crate::downloader::{ProcessingPipeline, QueueState, RuntimeConfig, UsenetDownloader};
use crate::{post_processing, speed_limiter};
use std::sync::Arc;
use tempfile::tempdir;
pub(crate) async fn create_test_downloader() -> (UsenetDownloader, tempfile::TempDir) {
let temp_dir = tempdir().unwrap();
let db_path = temp_dir.path().join("test.db");
let mut config = Config::default();
config.persistence.database_path = db_path;
config.download.download_dir = temp_dir.path().join("downloads");
config.download.temp_dir = temp_dir.path().join("temp");
config.servers = vec![]; config.download.max_concurrent_downloads = 3;
std::fs::create_dir_all(&config.download.download_dir).unwrap();
std::fs::create_dir_all(&config.download.temp_dir).unwrap();
let db = Database::new(&config.persistence.database_path)
.await
.unwrap();
let (event_tx, _rx) = tokio::sync::broadcast::channel(1000);
let nntp_pools = Vec::new();
let queue = Arc::new(tokio::sync::Mutex::new(std::collections::BinaryHeap::new()));
let concurrent_limit = Arc::new(tokio::sync::Semaphore::new(
config.download.max_concurrent_downloads,
));
let active_downloads = Arc::new(tokio::sync::Mutex::new(std::collections::HashMap::new()));
let speed_limiter = speed_limiter::SpeedLimiter::new(config.download.speed_limit_bps);
let config_arc = Arc::new(config.clone());
let categories = Arc::new(tokio::sync::RwLock::new(
config.persistence.categories.clone(),
));
let schedule_rules = Arc::new(tokio::sync::RwLock::new(vec![]));
let next_schedule_rule_id = Arc::new(std::sync::atomic::AtomicI64::new(0));
let parity_handler: Arc<dyn crate::ParityHandler> = Arc::new(crate::NoOpParityHandler);
let db_arc = Arc::new(db);
let post_processor = Arc::new(post_processing::PostProcessor::new(
event_tx.clone(),
config_arc.clone(),
parity_handler.clone(),
db_arc.clone(),
));
let queue_state = QueueState {
queue,
concurrent_limit,
active_downloads,
accepting_new: Arc::new(std::sync::atomic::AtomicBool::new(true)),
};
let runtime_config = RuntimeConfig {
categories,
schedule_rules,
next_schedule_rule_id,
};
let processing = ProcessingPipeline {
post_processor,
parity_handler,
};
let downloader = UsenetDownloader {
db: db_arc,
event_tx,
config: config_arc,
nntp_pools: Arc::new(nntp_pools),
speed_limiter,
queue_state,
runtime_config,
processing,
};
(downloader, temp_dir)
}
pub(crate) const SAMPLE_NZB: &str = r#"<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nzb PUBLIC "-//newzBin//DTD NZB 1.1//EN" "http://www.newzbin.com/DTD/nzb/nzb-1.1.dtd">
<nzb xmlns="http://www.newzbin.com/DTD/2003/nzb">
<head>
<meta type="title">Test Download</meta>
<meta type="password">testpass123</meta>
<meta type="category">movies</meta>
</head>
<file poster="user@example.com" date="1234567890" subject="test.file.rar [1/2]">
<groups>
<group>alt.binaries.test</group>
</groups>
<segments>
<segment bytes="768000" number="1">part1of2@example.com</segment>
<segment bytes="512000" number="2">part2of2@example.com</segment>
</segments>
</file>
</nzb>"#;