#[cfg(test)]
mod conditional_execution_tests
{
use test_tools::process::environment;
use std::env;
fn should_run_smoke_test_local(with_smoke_value: Option<&str>, is_ci: bool) -> bool {
if let Some(value) = with_smoke_value {
matches!(value, "1" | "local")
} else {
is_ci
}
}
fn should_run_smoke_test_published(with_smoke_value: Option<&str>, is_ci: bool) -> bool {
if let Some(value) = with_smoke_value {
matches!(value, "1" | "published")
} else {
is_ci
}
}
#[test]
fn test_execution_with_with_smoke_set_to_one()
{
assert!(should_run_smoke_test_local(Some("1"), false), "Should run local test when WITH_SMOKE=1");
assert!(should_run_smoke_test_published(Some("1"), false), "Should run published test when WITH_SMOKE=1");
assert!(should_run_smoke_test_local(Some("1"), true), "Should run local test when WITH_SMOKE=1 even with CI");
assert!(should_run_smoke_test_published(Some("1"), true), "Should run published test when WITH_SMOKE=1 even with CI");
}
#[test]
fn test_execution_with_with_smoke_set_to_local()
{
assert!(should_run_smoke_test_local(Some("local"), false), "Should run local test when WITH_SMOKE=local");
assert!(!should_run_smoke_test_published(Some("local"), false), "Should NOT run published test when WITH_SMOKE=local");
assert!(should_run_smoke_test_local(Some("local"), true), "Should run local test when WITH_SMOKE=local even with CI");
assert!(!should_run_smoke_test_published(Some("local"), true), "Should NOT run published test when WITH_SMOKE=local even with CI");
}
#[test]
fn test_execution_with_with_smoke_set_to_published()
{
assert!(!should_run_smoke_test_local(Some("published"), false), "Should NOT run local test when WITH_SMOKE=published");
assert!(should_run_smoke_test_published(Some("published"), false), "Should run published test when WITH_SMOKE=published");
assert!(!should_run_smoke_test_local(Some("published"), true), "Should NOT run local test when WITH_SMOKE=published even with CI");
assert!(should_run_smoke_test_published(Some("published"), true), "Should run published test when WITH_SMOKE=published even with CI");
}
#[test]
fn test_execution_in_cicd_environment()
{
assert!(should_run_smoke_test_local(None, true), "Should run local test when CI detected");
assert!(should_run_smoke_test_published(None, true), "Should run published test when CI detected");
assert!(!should_run_smoke_test_local(None, false), "Should NOT run local test without CI or WITH_SMOKE");
assert!(!should_run_smoke_test_published(None, false), "Should NOT run published test without CI or WITH_SMOKE");
}
#[test]
fn test_skipping_when_conditions_not_met()
{
let invalid_values = ["0", "false", "true", "random", "invalid"];
for invalid_value in &invalid_values {
assert!(!should_run_smoke_test_local(Some(invalid_value), false),
"Should NOT run local test with invalid WITH_SMOKE={invalid_value}");
assert!(!should_run_smoke_test_published(Some(invalid_value), false),
"Should NOT run published test with invalid WITH_SMOKE={invalid_value}");
assert!(!should_run_smoke_test_local(Some(invalid_value), true),
"Should NOT run local test with invalid WITH_SMOKE={invalid_value} even with CI");
assert!(!should_run_smoke_test_published(Some(invalid_value), true),
"Should NOT run published test with invalid WITH_SMOKE={invalid_value} even with CI");
}
}
#[test]
fn test_cicd_environment_detection_variants()
{
let ci_vars = ["CI", "GITHUB_ACTIONS", "GITLAB_CI", "TRAVIS", "CIRCLECI", "JENKINS_URL"];
for var in &ci_vars {
env::remove_var(var);
}
assert!(!environment::is_cicd(), "Should detect no CI/CD when no variables set");
let ci_test_cases = [
("CI", "true"),
("GITHUB_ACTIONS", "true"),
("GITLAB_CI", "true"),
("TRAVIS", "true"),
("CIRCLECI", "true"),
("JENKINS_URL", "http://jenkins.example.com"),
];
for (ci_var, ci_value) in &ci_test_cases {
for var in &ci_vars {
env::remove_var(var);
}
env::set_var(ci_var, ci_value);
assert!(environment::is_cicd(), "Should detect CI/CD when {ci_var} is set");
env::remove_var(ci_var);
}
assert!(!environment::is_cicd(), "Should detect no CI/CD after cleanup");
}
#[test]
fn test_with_smoke_precedence_over_cicd()
{
assert!(!should_run_smoke_test_local(Some("invalid"), true),
"Should NOT run local test with invalid WITH_SMOKE even when CI detected");
assert!(!should_run_smoke_test_published(Some("invalid"), true),
"Should NOT run published test with invalid WITH_SMOKE even when CI detected");
assert!(should_run_smoke_test_local(Some("1"), false),
"Should run local test with WITH_SMOKE=1 without CI");
assert!(should_run_smoke_test_local(Some("1"), true),
"Should run local test with WITH_SMOKE=1 with CI");
}
#[test]
fn test_with_smoke_value_variants()
{
let test_cases = [
("1", true, true, "universal trigger"),
("local", true, false, "local-specific trigger"),
("published", false, true, "published-specific trigger"),
("0", false, false, "zero value"),
("false", false, false, "false value"),
("true", false, false, "true value"),
("random", false, false, "random value"),
("", false, false, "empty value"),
];
for (with_smoke_value, should_execute_local, should_execute_published, description) in &test_cases {
assert_eq!(should_run_smoke_test_local(Some(with_smoke_value), false), *should_execute_local,
"Local test execution should be {should_execute_local} for WITH_SMOKE={with_smoke_value} ({description})");
assert_eq!(should_run_smoke_test_published(Some(with_smoke_value), false), *should_execute_published,
"Published test execution should be {should_execute_published} for WITH_SMOKE={with_smoke_value} ({description})");
}
}
#[test]
fn test_real_environment_conditional_execution()
{
let original_with_smoke = env::var("WITH_SMOKE").ok();
let ci_vars = ["CI", "GITHUB_ACTIONS", "GITLAB_CI", "TRAVIS", "CIRCLECI", "JENKINS_URL"];
let original_ci_state: Vec<_> = ci_vars.iter()
.map(|var| (*var, env::var(var).ok()))
.collect();
env::remove_var("WITH_SMOKE");
for var in &ci_vars {
env::remove_var(var);
}
assert!(!environment::is_cicd(), "Should not detect CI in clean environment");
env::set_var("CI", "true");
assert!(environment::is_cicd(), "Should detect CI when CI=true");
env::remove_var("CI");
env::set_var("WITH_SMOKE", "1");
assert_eq!(env::var("WITH_SMOKE").unwrap(), "1");
env::remove_var("WITH_SMOKE");
if let Some(value) = original_with_smoke {
env::set_var("WITH_SMOKE", value);
}
for (var, value) in original_ci_state {
if let Some(val) = value {
env::set_var(var, val);
}
}
}
#[test]
fn test_conditional_execution_feature_availability()
{
#[cfg(feature = "process_environment_is_cicd")]
{
let _result = environment::is_cicd();
}
}
}