//! Tests the interaction of the `lint` configuration section #![cfg(not(target_family = "wasm"))] use std::fs; use std::process::Command; use std::str; use anyhow::Result; use insta_cmd::{assert_cmd_snapshot, get_cargo_bin}; use tempfile::TempDir; const BIN_NAME: &str = "ruff"; const STDIN_BASE_OPTIONS: &[&str] = &["--no-cache", "--output-format", "text"]; #[test] fn top_level_options() -> Result<()> { let tempdir = TempDir::new()?; let ruff_toml = tempdir.path().join("ruff.toml"); fs::write( &ruff_toml, r#" extend-select = ["B", "Q"] [flake8-quotes] inline-quotes = "single" "#, )?; assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME)) .args(STDIN_BASE_OPTIONS) .arg("--config") .arg(&ruff_toml) .arg("-") .pass_stdin(r#"a = "abcba".strip("aba")"#), @r###" success: false exit_code: 1 ----- stdout ----- -:1:5: Q000 [*] Double quotes found but single quotes preferred -:1:5: B005 Using `.strip()` with multi-character strings is misleading -:1:19: Q000 [*] Double quotes found but single quotes preferred Found 3 errors. [*] 2 potentially fixable with the --fix option. ----- stderr ----- "###); Ok(()) } #[test] fn lint_options() -> Result<()> { let tempdir = TempDir::new()?; let ruff_toml = tempdir.path().join("ruff.toml"); fs::write( &ruff_toml, r#" [lint] extend-select = ["B", "Q"] [lint.flake8-quotes] inline-quotes = "single" "#, )?; assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME)) .args(STDIN_BASE_OPTIONS) .arg("--config") .arg(&ruff_toml) .arg("-") .pass_stdin(r#"a = "abcba".strip("aba")"#), @r###" success: false exit_code: 1 ----- stdout ----- -:1:5: Q000 [*] Double quotes found but single quotes preferred -:1:5: B005 Using `.strip()` with multi-character strings is misleading -:1:19: Q000 [*] Double quotes found but single quotes preferred Found 3 errors. [*] 2 potentially fixable with the --fix option. ----- stderr ----- "###); Ok(()) } /// Tests that configurations from the top-level and `lint` section are merged together. #[test] fn mixed_levels() -> Result<()> { let tempdir = TempDir::new()?; let ruff_toml = tempdir.path().join("ruff.toml"); fs::write( &ruff_toml, r#" extend-select = ["B", "Q"] [lint.flake8-quotes] inline-quotes = "single" "#, )?; assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME)) .args(STDIN_BASE_OPTIONS) .arg("--config") .arg(&ruff_toml) .arg("-") .pass_stdin(r#"a = "abcba".strip("aba")"#), @r###" success: false exit_code: 1 ----- stdout ----- -:1:5: Q000 [*] Double quotes found but single quotes preferred -:1:5: B005 Using `.strip()` with multi-character strings is misleading -:1:19: Q000 [*] Double quotes found but single quotes preferred Found 3 errors. [*] 2 potentially fixable with the --fix option. ----- stderr ----- "###); Ok(()) } /// Tests that options in the `lint` section have higher precedence than top-level options (because they are more specific). #[test] fn precedence() -> Result<()> { let tempdir = TempDir::new()?; let ruff_toml = tempdir.path().join("ruff.toml"); fs::write( &ruff_toml, r#" [lint] extend-select = ["B", "Q"] [flake8-quotes] inline-quotes = "double" [lint.flake8-quotes] inline-quotes = "single" "#, )?; assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME)) .args(STDIN_BASE_OPTIONS) .arg("--config") .arg(&ruff_toml) .arg("-") .pass_stdin(r#"a = "abcba".strip("aba")"#), @r###" success: false exit_code: 1 ----- stdout ----- -:1:5: Q000 [*] Double quotes found but single quotes preferred -:1:5: B005 Using `.strip()` with multi-character strings is misleading -:1:19: Q000 [*] Double quotes found but single quotes preferred Found 3 errors. [*] 2 potentially fixable with the --fix option. ----- stderr ----- "###); Ok(()) }