use assertor::{assert_that, EqualityAssertion, StringAssertion, VecAssertion};
use std::env;
use crate::config;
use crate::display::DisplayInfo;
use crate::wallhaven;
#[test]
fn parse_cli_args_single_arg() {
let args = vec!["span".to_string(), "ocean".to_string()];
let config = config::parse_cli_args(args);
assert_that!(config.span).is_equal_to(true);
assert_that!(config.query).is_equal_to("ocean".to_string());
}
#[test]
fn parse_cli_args_two_arg() {
let args = vec!["sun".to_string(), "water".to_string()];
let config = config::parse_cli_args(args);
assert_that!(config.span).is_equal_to(false);
assert_that!(vec!["sun".to_string(), "water".to_string()]).contains(config.query);
}
#[test]
fn parse_cli_args_no_arg() {
let args = vec![];
let config = config::parse_cli_args(args);
assert_that!(config.span).is_equal_to(false);
assert_that!(config.query).is_equal_to("".to_string());
}
#[test]
fn parse_cli_args_only_span() {
let args = vec!["span".to_string()];
let config = config::parse_cli_args(args);
assert_that!(config.span).is_equal_to(true);
}
#[test]
fn is_url_true() {
let url = "https://example.org";
let is_url = config::is_url(url);
assert_that!(is_url).is_equal_to(true);
}
#[test]
fn is_url_false() {
let url = "hello";
let is_url = config::is_url(url);
assert_that!(is_url).is_equal_to(false);
}
#[test]
fn is_url_empty() {
let url = "";
let is_url = config::is_url(url);
assert_that!(is_url).is_equal_to(false);
}
#[test]
fn is_local_path_true() {
let file = "/dev/null";
let is_local_path = config::is_local_path(file);
assert_that!(is_local_path).is_equal_to(true);
}
#[test]
fn is_local_path_false() {
let file = "/this/path/does/not/exits";
let is_local_path = config::is_local_path(file);
assert_that!(is_local_path).is_equal_to(false);
}
#[test]
fn is_local_path_empty() {
let file = "";
let is_local_path = config::is_local_path(file);
assert_that!(is_local_path).is_equal_to(false);
}
#[test]
fn parse_cli_args_with_api_key_env_var() {
env::set_var("WALLHAVEN_API_KEY", "test_api_key_123");
let args = vec!["nature".to_string()];
let config = config::parse_cli_args(args);
assert_that!(config.query).is_equal_to("nature".to_string());
assert_that!(config.api_key.is_some()).is_equal_to(true);
assert_that!(config.api_key.unwrap()).is_equal_to("test_api_key_123".to_string());
env::remove_var("WALLHAVEN_API_KEY");
}
#[test]
fn parse_cli_args_without_api_key_env_var() {
env::remove_var("WALLHAVEN_API_KEY");
let args = vec!["mountains".to_string()];
let config = config::parse_cli_args(args);
assert_that!(config.query).is_equal_to("mountains".to_string());
assert_that!(config.api_key.is_none()).is_equal_to(true);
}
#[test]
fn integration_test_wallhaven_url_generation() {
use std::env;
env::remove_var("WALLHAVEN_API_KEY");
let config1 = config::parse_cli_args(vec!["nature".to_string()]);
let display_info1 = DisplayInfo {
count: 1,
resolutions: vec!["1920x1080".to_string()],
max_single_resolution: "1920x1080".to_string(),
total_resolution: "1920x1080".to_string(),
};
let url1 = wallhaven::build_request_url(&config1, &display_info1);
assert_that!(url1).contains("q=nature");
assert_that!(url1).contains("atleast=1920x1080");
assert_that!(url1).contains("categories=111");
assert_that!(url1).contains("purity=100");
assert_that!(config1.api_key.is_none()).is_equal_to(true);
env::set_var("WALLHAVEN_API_KEY", "test_key_456");
let config2 = config::parse_cli_args(vec!["span".to_string(), "landscape".to_string()]);
let display_info2 = DisplayInfo {
count: 2,
resolutions: vec!["1920x1080".to_string(), "1920x1080".to_string()],
max_single_resolution: "1920x1080".to_string(),
total_resolution: "3840x1080".to_string(),
};
let url2 = wallhaven::build_request_url(&config2, &display_info2);
assert_that!(url2).contains("q=landscape");
assert_that!(url2).contains("atleast=3840x1080");
assert_that!(url2).contains("apikey=test_key_456");
assert_that!(config2.span).is_equal_to(true);
assert_that!(config2.api_key.is_some()).is_equal_to(true);
let config3 = config::parse_cli_args(vec!["+anime".to_string(), "-nsfw".to_string()]);
let display_info3 = DisplayInfo {
count: 1,
resolutions: vec!["3840x2160".to_string()],
max_single_resolution: "3840x2160".to_string(),
total_resolution: "3840x2160".to_string(),
};
let url3 = wallhaven::build_request_url(&config3, &display_info3);
assert_that!(url3.contains("%2Banime") || url3.contains("-nsfw")).is_equal_to(true);
assert_that!(url3).contains("atleast=3840x2160");
let config4 = config::parse_cli_args(vec![]);
let display_info4 = DisplayInfo {
count: 1,
resolutions: vec!["1920x1080".to_string()],
max_single_resolution: "1920x1080".to_string(),
total_resolution: "1920x1080".to_string(),
};
let url4 = wallhaven::build_request_url(&config4, &display_info4);
assert_that!(url4.contains("q=")).is_equal_to(false);
assert_that!(url4).contains("atleast=1920x1080");
assert_that!(url4).contains("sorting=random");
env::remove_var("WALLHAVEN_API_KEY");
}