#[cfg(feature = "cargo-workspace")]
use clippier::{OutputType, handle_features_command};
#[cfg(feature = "cargo-workspace")]
use clippier_test_utilities::test_resources::load_test_workspace;
#[cfg(feature = "cargo-workspace")]
use std::collections::HashSet;
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_filter_single_package() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None, None, None, None, None, false, false, None, None, None, None, Some(&["api".to_string()]), None, #[cfg(feature = "git-diff")]
None, #[cfg(feature = "git-diff")]
None, false, None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
for config in &json {
assert_eq!(config["name"], "api");
}
assert!(
!json.is_empty(),
"Should have at least one config for api package"
);
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_filter_multiple_packages() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&["api".to_string(), "web".to_string(), "cli".to_string()]),
None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
let package_names: HashSet<String> = json
.iter()
.map(|config| config["name"].as_str().unwrap().to_string())
.collect();
assert_eq!(package_names.len(), 4); assert!(package_names.contains("api"));
assert!(package_names.contains("frontend-build") || package_names.contains("ssr-build"));
assert!(package_names.contains("cli"));
assert!(!package_names.contains("core"));
assert!(!package_names.contains("models"));
assert!(!package_names.contains("shared-utils"));
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_filter_empty_list() {
let (temp_dir, _) = load_test_workspace("complex");
let result_empty = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&[]), None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
let result_none = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
None, None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result_empty.is_ok());
assert!(result_none.is_ok());
let json_empty: Vec<serde_json::Value> = serde_json::from_str(&result_empty.unwrap()).unwrap();
let json_none: Vec<serde_json::Value> = serde_json::from_str(&result_none.unwrap()).unwrap();
let package_names: HashSet<String> = json_none
.iter()
.map(|config| config["name"].as_str().unwrap().to_string())
.collect();
assert_eq!(package_names.len(), 7);
assert_eq!(json_empty.len(), json_none.len());
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_with_os_filter() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
Some("ubuntu"), None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&["api".to_string(), "web".to_string()]),
None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
for config in &json {
assert_eq!(config["os"], "ubuntu");
let name = config["name"].as_str().unwrap();
assert!(name == "api" || name == "web" || name == "frontend-build" || name == "ssr-build");
}
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_with_chunking() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
Some(2), false,
false,
None,
None,
None,
None,
Some(&["web".to_string()]), None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
for config in &json {
let name = config["name"].as_str().unwrap();
assert!(
name == "frontend-build" || name == "ssr-build",
"Should only have web package configs"
);
let features = config["features"].as_array();
if let Some(features) = features {
assert!(
!features.is_empty(),
"Each config should have at least one feature"
);
}
}
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_with_features_filter() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
Some("default"), Some("advanced"), None,
Some(&["web".to_string()]),
None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
for config in &json {
let name = config["name"].as_str().unwrap();
assert!(
name == "frontend-build" || name == "ssr-build",
"Should only have web package configs"
);
let features = config["features"].as_array();
if let Some(_features) = features {
}
}
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_nonexistent_package() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&["nonexistent_package".to_string()]),
None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
assert_eq!(json.len(), 0);
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_mixed_valid_invalid() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&[
"api".to_string(),
"nonexistent".to_string(),
"web".to_string(),
"fake_package".to_string(),
]),
None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
let package_names: HashSet<String> = json
.iter()
.map(|config| config["name"].as_str().unwrap().to_string())
.collect();
assert!(package_names.contains("api"));
assert!(package_names.contains("frontend-build") || package_names.contains("ssr-build"));
assert!(!package_names.contains("nonexistent"));
assert!(!package_names.contains("fake_package"));
assert!(package_names.len() >= 2); }
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_case_sensitivity() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&["API".to_string(), "Web".to_string()]), None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Json,
)
.await;
assert!(result.is_ok());
let json: Vec<serde_json::Value> = serde_json::from_str(&result.unwrap()).unwrap();
assert_eq!(json.len(), 0);
}
#[cfg(feature = "cargo-workspace")]
#[switchy_async::test]
async fn test_packages_raw_output_format() {
let (temp_dir, _) = load_test_workspace("complex");
let result = handle_features_command(
temp_dir.path().to_str().unwrap(),
None,
None,
None,
None,
None,
false,
false,
None,
None,
None,
None,
Some(&["api".to_string()]),
None,
#[cfg(feature = "git-diff")]
None,
#[cfg(feature = "git-diff")]
None,
false,
None,
&[],
&[],
#[cfg(feature = "_transforms")]
&[],
#[cfg(feature = "_transforms")]
false,
#[cfg(feature = "_workspace")]
None, OutputType::Raw,
)
.await;
assert!(result.is_ok());
let output = result.unwrap();
assert!(!output.is_empty());
for line in output.lines() {
assert!(!line.is_empty());
}
}