use super::*;
#[test]
fn test_config_002_detect_simple_unquoted_var() {
let line = "export PROJECT_DIR=$HOME/my projects";
let variables = analyze_unquoted_variables(line);
assert_eq!(variables.len(), 1);
assert_eq!(variables[0].variable, "$HOME");
assert_eq!(variables[0].line, 1);
}
#[test]
fn test_config_002_detect_unquoted_in_cd() {
let source = "cd $PROJECT_DIR";
let variables = analyze_unquoted_variables(source);
assert_eq!(variables.len(), 1);
assert_eq!(variables[0].variable, "$PROJECT_DIR");
}
#[test]
fn test_config_002_ignore_already_quoted() {
let source = r#"export DIR="${HOME}/projects""#;
let variables = analyze_unquoted_variables(source);
assert_eq!(
variables.len(),
0,
"Should not flag already quoted variables"
);
}
#[test]
fn test_config_002_ignore_comments() {
let source = "# export DIR=$HOME/projects";
let variables = analyze_unquoted_variables(source);
assert_eq!(variables.len(), 0, "Should ignore variables in comments");
}
#[test]
fn test_config_002_detect_multiple_on_same_line() {
let source = "cp $SOURCE $DEST";
let variables = analyze_unquoted_variables(source);
assert_eq!(variables.len(), 2);
assert_eq!(variables[0].variable, "$SOURCE");
assert_eq!(variables[1].variable, "$DEST");
}
#[test]
fn test_config_002_detect_command_substitution() {
let source = "FILES=$(ls *.txt)";
let variables = analyze_unquoted_variables(source);
assert_eq!(
variables.len(),
0,
"Command substitution on RHS is OK in assignment"
);
}
#[test]
fn test_config_002_generate_issues() {
let source = r#"export PROJECT_DIR=$HOME/my projects
cd $PROJECT_DIR"#;
let variables = analyze_unquoted_variables(source);
let issues = detect_unquoted_variables(&variables);
assert_eq!(issues.len(), 2);
assert_eq!(issues[0].rule_id, "CONFIG-002");
assert_eq!(issues[0].severity, Severity::Warning);
assert!(issues[0].message.contains("word splitting"));
}
#[test]
fn test_config_002_quote_simple_variable() {
let source = "export DIR=$HOME/projects";
let result = quote_variables(source);
assert_eq!(result, r#"export DIR="${HOME}/projects""#);
}
#[test]
fn test_config_002_quote_multiple_variables() {
let source = "cp $SOURCE $DEST";
let result = quote_variables(source);
assert_eq!(result, r#"cp "${SOURCE}" "${DEST}""#);
}
#[test]
fn test_config_002_preserve_already_quoted() {
let source = r#"export DIR="${HOME}/projects"
echo "Hello $USER""#;
let result = quote_variables(source);
assert_eq!(result, source, "Should not change already quoted variables");
}
#[test]
fn test_config_002_preserve_comments() {
let source = r#"# My config
export DIR=$HOME/projects
# End"#;
let expected = r#"# My config
export DIR="${HOME}/projects"
# End"#;
let result = quote_variables(source);
assert_eq!(result, expected);
}
#[test]
fn test_config_002_handle_braced_variables() {
let source = "export DIR=${HOME}/projects";
let result = quote_variables(source);
assert_eq!(result, r#"export DIR="${HOME}/projects""#);
}
#[test]
fn test_config_002_real_world_example() {
let source = r#"export PROJECT_DIR=$HOME/my projects
export BACKUP_DIR=$HOME/backups
cd $PROJECT_DIR
cp $PROJECT_DIR/file.txt $BACKUP_DIR/"#;
let expected = r#"export PROJECT_DIR="${HOME}/my projects"
export BACKUP_DIR="${HOME}/backups"
cd "${PROJECT_DIR}"
cp "${PROJECT_DIR}"/file.txt "${BACKUP_DIR}"/"#;
let result = quote_variables(source);
assert_eq!(result, expected);
}
#[test]
fn test_config_002_idempotent() {
let source = "export DIR=$HOME/projects";
let quoted_once = quote_variables(source);
let quoted_twice = quote_variables("ed_once);
assert_eq!(quoted_once, quoted_twice, "Quoting should be idempotent");
}
#[test]
fn test_config_002_debug_add_braces() {
let input = "$HOME/projects";
let result = add_braces_to_variables(input);
assert_eq!(
result, "${HOME}/projects",
"add_braces_to_variables should convert $HOME to ${{HOME}}"
);
}
#[test]
fn test_config_002_debug_quote_assignment() {
let input = "export DIR=$HOME/projects";
let result = quote_assignment_line(input);
println!("Input: {}", input);
println!("Result: {}", result);
assert_eq!(result, r#"export DIR="${HOME}/projects""#);
}
#[test]
fn test_config_002_empty_input() {
let source = "";
let result = quote_variables(source);
assert_eq!(result, "");
}
#[test]
fn test_config_002_no_variables() {
let source = r#"export EDITOR="vim"
alias ll='ls -la'"#;
let result = quote_variables(source);
assert_eq!(result, source, "Should not change lines without variables");
}