1
0
mirror of https://github.com/j178/prek.git synced 2026-04-03 17:34:03 +02:00
Files
prek/tests/languages/script.rs
Jo 6dda4aa9f6 Do not dim the hook output (#1126)
* Do not dim the hook output

* Update snapshots
2025-11-20 19:16:55 +08:00

207 lines
5.6 KiB
Rust

use anyhow::Result;
use assert_fs::fixture::{FileWriteStr, PathChild};
use crate::common::{TestContext, cmd_snapshot};
#[cfg(unix)]
mod unix {
use super::*;
use assert_fs::fixture::{FileWriteStr, PathChild, PathCreateDir};
use prek_consts::CONFIG_FILE;
use std::os::unix::fs::PermissionsExt;
#[test]
fn script_run() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: https://github.com/prek-test-repos/script-hooks
rev: main
hooks:
- id: echo
verbose: true
"});
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r#"
success: true
exit_code: 0
----- stdout -----
echo.....................................................................Passed
- hook id: echo
- duration: [TIME]
.pre-commit-config.yaml
----- stderr -----
warning: The following repos have mutable `rev` fields (moving tag / branch):
https://github.com/prek-test-repos/script-hooks: main
Mutable references are never updated after first install and are not supported.
See https://pre-commit.com/#using-the-latest-version-for-a-repository for more details.
Hint: `prek autoupdate` often fixes this",
"#);
}
#[test]
fn workspace_script_run() -> Result<()> {
let context = TestContext::new();
context.init_project();
let config = indoc::indoc! {r"
repos:
- repo: local
hooks:
- id: script
name: script
language: script
entry: ./script.sh
verbose: true
"};
context.write_pre_commit_config(config);
context
.work_dir()
.child("script.sh")
.write_str(indoc::indoc! {r#"
#!/usr/bin/env bash
echo "Hello, World!"
"#})?;
let child = context.work_dir().child("child");
child.create_dir_all()?;
child.child(CONFIG_FILE).write_str(config)?;
child.child("script.sh").write_str(indoc::indoc! {r#"
#!/usr/bin/env bash
echo "Hello, World from child!"
"#})?;
fs_err::set_permissions(
context.work_dir().child("script.sh"),
std::fs::Permissions::from_mode(0o755),
)?;
fs_err::set_permissions(
child.child("script.sh"),
std::fs::Permissions::from_mode(0o755),
)?;
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
Running hooks for `child`:
script...................................................................Passed
- hook id: script
- duration: [TIME]
Hello, World from child!
Running hooks for `.`:
script...................................................................Passed
- hook id: script
- duration: [TIME]
Hello, World!
----- stderr -----
");
cmd_snapshot!(context.filters(), context.run().current_dir(&child), @r"
success: true
exit_code: 0
----- stdout -----
script...................................................................Passed
- hook id: script
- duration: [TIME]
Hello, World from child!
----- stderr -----
");
Ok(())
}
#[test]
fn local_repo_bash_shebang() -> Result<()> {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: local
hooks:
- id: echo
name: echo
language: script
entry: ./echo.sh
verbose: true
"});
let script = context.work_dir().child("echo.sh");
script.write_str(indoc::indoc! {r#"
#!/usr/bin/env bash
echo "Hello, World!"
"#})?;
fs_err::set_permissions(&script, std::fs::Permissions::from_mode(0o755))?;
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
echo.....................................................................Passed
- hook id: echo
- duration: [TIME]
Hello, World!
----- stderr -----
");
Ok(())
}
}
/// Test that a script with a shebang line works correctly on Windows.
/// The interpreter must exist in the PATH, the script is not needed to be executable.
#[test]
fn windows_script_run() -> Result<()> {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: local
hooks:
- id: echo
name: echo
language: script
entry: ./echo.sh
verbose: true
"});
let script = context.work_dir().child("echo.sh");
script.write_str(indoc::indoc! {r#"
#!/usr/bin/env python3
print("Hello, World!")
"#})?;
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
echo.....................................................................Passed
- hook id: echo
- duration: [TIME]
Hello, World!
----- stderr -----
");
Ok(())
}