Files
downloader/tests/lib_tests.rs

224 lines
7.3 KiB
Rust

use std::path::{Path, PathBuf};
use chrono::{DateTime, NaiveDateTime, Utc};
// use bigquery_googleapi::BigqueryClient;
use downloader::prelude::*;
use google_bigquery_v2::prelude::*;
use downloader;
use downloader::data::{Streamers, VideoData, VideoMetadata, Videos};
use downloader::{
get_playlist_title_from_twitch_video, get_video_prefix_from_twitch_video,
get_video_title_from_twitch_video,
};
fn init_console_logging(log_level: LevelFilter) {
let _ = env_logger::builder()
.filter_level(log_level)
.is_test(true)
.try_init();
}
async fn get_sample_client() -> BigqueryClient {
BigqueryClient::new(
"twitchbackup-v1",
"backup_data",
Some("tests/test_data/auth/bigquery_service_account.json"),
)
.await
.unwrap()
}
fn get_sample_video(client: &BigqueryClient) -> VideoData {
VideoData {
video: Videos {
created_at: Some(get_utc_from_string("2021-01-01T00:00:00")),
video_id: 1,
client: client.clone(),
title: Some("Test Video".to_string()),
description: Some("Test Description".to_string()),
bool_test: Some(true),
user_login: Some("nopixelvods".to_string()),
url: Some("https://www.twitch.tv/videos/1".to_string()),
viewable: Some("public".to_string()),
language: Some("en".to_string()),
view_count: Some(1),
video_type: Some("archive".to_string()),
duration: Some(1),
thumbnail_url: Some("i dont know".to_string()),
},
metadata: VideoMetadata {
video_id: 1,
client: client.clone(),
backed_up: Some(false),
..Default::default()
},
streamer: Streamers {
display_name: Some("NoPixel VODs".to_string()),
login: "nopixelvods".to_string(),
client: client.clone(),
youtube_user: Some("NoPixel VODs".to_string()),
watched: Some(true),
public_videos_default: Some(false),
youtube_google_ident: None,
},
}
}
fn get_utc_from_string(s: &str) -> DateTime<Utc> {
let n = NaiveDateTime::parse_from_str(s, "%Y-%m-%dT%H:%M:%S").unwrap();
let utc = DateTime::<Utc>::from_utc(n, Utc);
utc
}
const LONG_TITLE: &'static str =
"long title with over a hundred characters that is definitely going to \
be cut of because it does not fit into the maximum length that youtube requires";
#[tokio::test]
async fn get_video_title() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let video = get_sample_video(&client);
let title = get_video_title_from_twitch_video(&video, 5, 20).unwrap();
assert_eq!(title, "[2021-01-01][Part 05/20] Test Video");
}
#[tokio::test]
async fn get_video_long_title() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let mut video = get_sample_video(&client);
video.video.title = Some(LONG_TITLE.to_string());
let title = get_video_title_from_twitch_video(&video, 5, 20).unwrap();
info!("part title: {}", title);
assert_eq!(title, "[2021-01-01][Part 05/20] long title with over a hundred characters that is definitely going to be...");
}
#[tokio::test]
async fn get_video_title_single_part() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let video = get_sample_video(&client);
let title = get_video_title_from_twitch_video(&video, 1, 1).unwrap();
assert_eq!(title, "[2021-01-01] Test Video");
}
#[tokio::test]
async fn get_video_long_title_single_part() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let mut video = get_sample_video(&client);
video.video.title = Some(LONG_TITLE.to_string());
let title = get_video_title_from_twitch_video(&video, 1, 1).unwrap();
info!("single part title: {}", title);
assert_eq!(
title,
"[2021-01-01] long title with over a hundred characters that is definitely going to be..."
);
}
#[tokio::test]
async fn get_playlist_title() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let video = get_sample_video(&client);
let title = get_playlist_title_from_twitch_video(&video).unwrap();
assert_eq!("[2021-01-01] Test Video", title);
}
#[tokio::test]
async fn get_playlist_long_title() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let mut video = get_sample_video(&client);
video.video.title = Some(LONG_TITLE.to_string());
let title = get_playlist_title_from_twitch_video(&video).unwrap();
info!("playlist title: {}", title);
assert_eq!(
"[2021-01-01] long title with over a hundred characters that is definitel...",
title
);
}
#[tokio::test]
async fn get_video_prefix() {
init_console_logging(LevelFilter::Debug);
let client = get_sample_client().await;
let video = get_sample_video(&client);
let prefix = get_video_prefix_from_twitch_video(&video, 5, 20).unwrap();
info!("prefix: {}", prefix);
assert_eq!(prefix, "[2021-01-01][Part 05/20]");
}
#[tokio::test]
async fn split_video_into_parts_with_join() {
init_console_logging(LevelFilter::Debug);
let (tmp_folder_path, video_path) = prepare_existing_video_test_data(1);
let parts = downloader::split_video_into_parts(
PathBuf::from(&video_path),
chrono::Duration::seconds(5),
chrono::Duration::seconds(9),
)
.await;
//region clean up
std::fs::remove_dir_all(tmp_folder_path).unwrap();
//endregion
let parts = parts.expect("failed to split video into parts");
debug!("parts: {:?}", parts);
assert_eq!(5, parts.len(),);
for (i, part) in parts.iter().enumerate() {
assert_eq!(
format!("short_video_00{}.mp4", i),
part.file_name().unwrap().to_str().unwrap()
);
}
}
#[tokio::test]
async fn split_video_into_parts_without_join() {
init_console_logging(LevelFilter::Debug);
let (tmp_folder_path, video_path) = prepare_existing_video_test_data(2);
let parts = downloader::split_video_into_parts(
PathBuf::from(&video_path),
chrono::Duration::seconds(5),
chrono::Duration::seconds(6),
)
.await;
//region clean up
std::fs::remove_dir_all(tmp_folder_path).unwrap();
//endregion
let parts = parts.expect("failed to split video into parts");
debug!("parts: {:?}", parts);
assert_eq!(6, parts.len(),);
for (i, part) in parts.iter().enumerate() {
assert_eq!(
format!("short_video_00{}.mp4", i),
part.file_name().unwrap().to_str().unwrap()
);
}
}
fn prepare_existing_video_test_data(temp_subname: i32) -> (PathBuf, PathBuf) {
let video_source = Path::new("tests/test_data/short_video/short_video.mp4");
let tmp_folder_path = format!("tests/test_data/tmp_{}", temp_subname);
let tmp_folder_path: PathBuf = tmp_folder_path.as_str().into();
let video_path = Path::join(&tmp_folder_path, "short_video/short_video.mp4");
if tmp_folder_path.exists() {
std::fs::remove_dir_all(&tmp_folder_path).unwrap();
}
std::fs::create_dir_all(video_path.parent().unwrap()).unwrap();
std::fs::copy(video_source, &video_path).unwrap();
(tmp_folder_path.to_path_buf(), video_path)
}