//! Populates the installed app's database using the app's own code paths, so //! the UI can be verified against real data without driving the file dialog. //! Run with: cargo test --test seed_real_db -- --ignored --nocapture use flighttube_lib::{db::Db, feed, models::FeedFilter, thumbs}; use std::path::PathBuf; fn app_data() -> PathBuf { PathBuf::from(std::env::var("HOME").unwrap()) .join("Library/Application Support/com.vincent.flighttube") } #[tokio::test] #[ignore] async fn seed() { let dir = app_data(); let mut db = Db::open(&dir.join("flighttube.db")).expect("open real db"); let channels = db.channel_ids().unwrap(); println!("channels in db: {}", channels.len()); assert!(!channels.is_empty(), "seed channels first"); let http = reqwest::Client::builder() .user_agent("FlightTube/0.1 (+desktop)") .timeout(std::time::Duration::from_secs(20)) .build() .unwrap(); let mut total = 0; for cid in &channels { if let Ok(v) = feed::fetch_channel(&http, cid).await { total += v.len(); db.upsert_videos(&v).unwrap(); } } println!("videos upserted: {total}"); // Cache thumbnails so the feed renders with no network. let pending = db.videos_missing_thumbs(400).unwrap(); println!("thumbnails to cache: {}", pending.len()); let tdir = thumbs::cache_dir(&dir); let mut ok = 0; for (id, url) in pending { if let Ok(p) = thumbs::cache_one(&http, &id, &url, &tdir).await { db.set_thumb_path(&id, &p.to_string_lossy()).unwrap(); ok += 1; } } println!("thumbnails cached: {ok}"); let feed_rows = db.list_feed(&FeedFilter::default()).unwrap(); println!("feed rows now: {}", feed_rows.len()); for i in feed_rows.iter().take(3) { println!(" [{}] {}", i.channel_title, i.title); } }