1
0
mirror of https://github.com/j178/prek.git synced 2026-04-03 17:34:03 +02:00
Files
prek/tests/workspace.rs
Jo ef7d73b9ac Show project line when project is not root (#637)
* Show project line when project is not root

* Update snap
2025-09-07 02:27:02 +08:00

715 lines
22 KiB
Rust

mod common;
use anyhow::Result;
use constants::env_vars::EnvVars;
use indoc::indoc;
use crate::common::{TestContext, cmd_snapshot};
#[test]
fn basic_discovery() -> Result<()> {
let context = TestContext::new();
let cwd = context.work_dir();
context.init_project();
let config = indoc! {r"
repos:
- repo: local
hooks:
- id: show-cwd
name: Show CWD
language: python
entry: python -c 'import sys, os; print(os.getcwd()); print(sys.argv[1:])'
verbose: true
"};
context.setup_workspace(
&[
"project2",
"project3",
"nested/project4",
"project3/project5",
],
config,
)?;
context.git_add(".");
// Run from the root directory
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `nested/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/nested/project4
['.pre-commit-config.yaml']
Running hooks for `project3/project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `project2`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
");
// Run from a subdirectory
cmd_snapshot!(context.filters(), context.run().current_dir(cwd.join("project2")), @r"
success: true
exit_code: 0
----- stdout -----
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().current_dir(cwd.join("project2")).arg("--all-files"), @r"
success: true
exit_code: 0
----- stdout -----
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().current_dir(cwd.join("project3")), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg("--cd").arg(cwd.join("project3")), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
----- stderr -----
");
Ok(())
}
#[test]
fn config_not_staged() -> Result<()> {
let context = TestContext::new();
let cwd = context.work_dir();
context.init_project();
let config = indoc! {r"
repos:
- repo: local
hooks:
- id: show-cwd
name: Show CWD
language: python
entry: python -c 'import sys, os; print(os.getcwd()); print(sys.argv[1:])'
verbose: true
"};
context.setup_workspace(
&[
"project2",
"project3",
"nested/project4",
"project3/project5",
],
config,
)?;
context.git_add(".");
let config = indoc! {r"
repos:
- repo: local
hooks:
- id: show-cwd-modified
name: Show CWD
language: python
entry: python -c 'import sys, os; print(os.getcwd()); print(sys.argv[1:])'
verbose: true
"};
// Setup again to modify files after git add
context.setup_workspace(
&[
"project2",
"project3",
"nested/project4",
"project3/project5",
],
config,
)?;
// Run from the root directory
cmd_snapshot!(context.filters(), context.run(), @r"
success: false
exit_code: 2
----- stdout -----
----- stderr -----
error: The following configuration files are not staged, `git add` them first:
.pre-commit-config.yaml
nested/project4/.pre-commit-config.yaml
project2/.pre-commit-config.yaml
project3/.pre-commit-config.yaml
project3/project5/.pre-commit-config.yaml
");
// Run from a subdirectory
cmd_snapshot!(context.filters(), context.run().current_dir(cwd.join("project3")), @r"
success: false
exit_code: 2
----- stdout -----
----- stderr -----
error: The following configuration files are not staged, `git add` them first:
.pre-commit-config.yaml
project5/.pre-commit-config.yaml
");
cmd_snapshot!(context.filters(), context.run().current_dir(cwd.join("project2")), @r"
success: false
exit_code: 2
----- stdout -----
----- stderr -----
error: prek configuration file is not staged, run `git add .pre-commit-config.yaml` to stage it
");
Ok(())
}
#[test]
fn run_with_selectors() -> Result<()> {
let context = TestContext::new();
context.init_project();
let config = indoc! {r"
repos:
- repo: local
hooks:
- id: show-cwd
name: Show CWD
language: python
entry: python -c 'import sys, os; print(os.getcwd()); print(sys.argv[1:])'
verbose: true
"};
context.setup_workspace(
&[
"project2",
"project3",
"nested/project4",
"project3/project5",
],
config,
)?;
context.git_add(".");
cmd_snapshot!(context.filters(), context.run().arg("project2/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project2`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("project2/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `nested/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/nested/project4
['.pre-commit-config.yaml']
Running hooks for `project3/project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("nested/").arg("--skip").arg("project3/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project2`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg("show-cwd"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `nested/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/nested/project4
['.pre-commit-config.yaml']
Running hooks for `project3/project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `project2`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg("project2:show-cwd"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project2`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg(".:show-cwd"), @r"
success: true
exit_code: 0
----- stdout -----
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("show-cwd"), @r"
success: false
exit_code: 1
----- stdout -----
----- stderr -----
error: No hooks found after filtering with the given selectors
");
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("project2:show-cwd").arg("--skip").arg("nested:show-cwd"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `nested/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/nested/project4
['.pre-commit-config.yaml']
Running hooks for `project3/project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
warning: selector `--skip=nested:show-cwd` did not match any hooks
");
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("non-exist"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `nested/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/nested/project4
['.pre-commit-config.yaml']
Running hooks for `project3/project5`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project5
['.pre-commit-config.yaml']
Running hooks for `project2`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project5/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['nested/project4/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project5/.pre-commit-config.yaml', 'project2/.pre-commit-config.yaml']
[TEMP_DIR]/
['project3/.pre-commit-config.yaml']
----- stderr -----
warning: selector `--skip=non-exist` did not match any hooks
");
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("../"), @r"
success: false
exit_code: 2
----- stdout -----
----- stderr -----
error: Invalid selector: `../`
caused by: Invalid project path: `../`
caused by: path is outside the workspace root
");
cmd_snapshot!(context.filters(), context.run().current_dir(context.work_dir().join("project2")), @r"
success: true
exit_code: 0
----- stdout -----
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project2
['.pre-commit-config.yaml']
----- stderr -----
");
Ok(())
}
#[test]
fn skips() -> Result<()> {
let context = TestContext::new();
context.init_project();
let config = indoc! {r"
repos:
- repo: local
hooks:
- id: show-cwd
name: Show CWD
language: python
entry: python -c 'import sys, os; print(os.getcwd()); print(sys.argv[1:])'
verbose: true
"};
context.setup_workspace(&["project2", "project3", "project3/project4"], config)?;
context.git_add(".");
// Test CLI skip
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("project2/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project3/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project4
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project4/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['project2/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project4/.pre-commit-config.yaml', 'project3/.pre-commit-config.yaml']
----- stderr -----
");
// Test PREK_SKIP environment variable
cmd_snapshot!(context.filters(), context.run().env(EnvVars::PREK_SKIP, "project2/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project3/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project4
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project4/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['project2/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project4/.pre-commit-config.yaml', 'project3/.pre-commit-config.yaml']
----- stderr -----
");
// Test SKIP environment variable
cmd_snapshot!(context.filters(), context.run().env(EnvVars::SKIP, "project2/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project3/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project4
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project4/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['project2/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project4/.pre-commit-config.yaml', 'project3/.pre-commit-config.yaml']
----- stderr -----
");
// Test precedence: CLI --skip overrides PREK_SKIP
cmd_snapshot!(context.filters(), context.run().arg("--skip").arg("project2/").env(EnvVars::PREK_SKIP, "project3/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project3/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project4
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project4/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['project2/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project4/.pre-commit-config.yaml', 'project3/.pre-commit-config.yaml']
----- stderr -----
");
// Test precedence: PREK_SKIP overrides SKIP
cmd_snapshot!(context.filters(), context.run().env(EnvVars::PREK_SKIP, "project2/").env(EnvVars::SKIP, "project3/"), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `project3/project4`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3/project4
['.pre-commit-config.yaml']
Running hooks for `project3`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/project3
['project4/.pre-commit-config.yaml', '.pre-commit-config.yaml']
Running hooks for `.`:
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['project2/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project4/.pre-commit-config.yaml', 'project3/.pre-commit-config.yaml']
----- stderr -----
");
// Test multiple selectors in environment variable
cmd_snapshot!(context.filters(), context.run().env("PREK_SKIP", "project2/,project3/,non-exist-hook"), @r"
success: true
exit_code: 0
----- stdout -----
Show CWD.................................................................Passed
- hook id: show-cwd
- duration: [TIME]
[TEMP_DIR]/
['project2/.pre-commit-config.yaml', '.pre-commit-config.yaml', 'project3/project4/.pre-commit-config.yaml', 'project3/.pre-commit-config.yaml']
----- stderr -----
warning: selector `PREK_SKIP=non-exist-hook` did not match any hooks
");
Ok(())
}