use anyhow::Result;
use assert_fs::assert::PathAssert;
use assert_fs::fixture::PathChild;
use prek_consts::env_vars::EnvVars;
use crate::common::{TestContext, cmd_snapshot};
#[test]
fn language_version() -> Result<()> {
if !EnvVars::is_set(EnvVars::CI) {
return Ok(());
}
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: local
hooks:
- id: rust-system
name: rust-system
language: rust
entry: rustc --version
language_version: system
pass_filenames: false
always_run: true
- id: rust-1.70 # should auto install 1.70.X
name: rust-1.70
language: rust
entry: rustc --version
language_version: '1.70'
always_run: true
pass_filenames: false
- id: rust-1.70 # run again to ensure reusing the installed version
name: rust-1.70
language: rust
entry: rustc --version
language_version: '1.70'
always_run: true
pass_filenames: false
"});
context.git_add(".");
let rust_dir = context.home_dir().child("tools/rustup/toolchains");
rust_dir.assert(predicates::path::missing());
let filters = [
(r"rustc (1\.70)\.\d{1,2} .+", "rustc $1.X"), (r"rustc 1\.\d{1,3}\.\d{1,2} .+", "rustc 1.X.X"), ]
.into_iter()
.chain(context.filters())
.collect::<Vec<_>>();
cmd_snapshot!(filters, context.run().arg("-v"), @r#"
success: true
exit_code: 0
----- stdout -----
rust-system..............................................................Passed
- hook id: rust-system
- duration: [TIME]
rustc 1.X.X
rust-1.70................................................................Passed
- hook id: rust-1.70
- duration: [TIME]
rustc 1.70.X
rust-1.70................................................................Passed
- hook id: rust-1.70
- duration: [TIME]
rustc 1.70.X
----- stderr -----
"#);
let installed_versions = rust_dir
.read_dir()?
.flatten()
.filter_map(|d| {
let filename = d.file_name().to_string_lossy().to_string();
if filename.starts_with('.') {
None
} else {
Some(filename)
}
})
.collect::<Vec<_>>();
assert_eq!(
installed_versions.len(),
1,
"Expected only one Rust version to be installed, but found: {installed_versions:?}"
);
assert!(
installed_versions.iter().any(|v| v.starts_with("1.70")),
"Expected Rust 1.70.X to be installed, but found: {installed_versions:?}"
);
Ok(())
}
#[test]
fn rustup_installer() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: local
hooks:
- id: rustup-test
name: rustup-test
language: rust
entry: rustc --version
"});
context.git_add(".");
let filters = [(r"rustc 1\.\d{1,3}\.\d{1,2} .+", "rustc 1.X.X")]
.into_iter()
.chain(context.filters())
.collect::<Vec<_>>();
cmd_snapshot!(filters, context.run().arg("-v").env(EnvVars::PREK_INTERNAL__RUSTUP_BINARY_NAME, "non-exist-rustup"), @r#"
success: true
exit_code: 0
----- stdout -----
rustup-test..............................................................Passed
- hook id: rustup-test
- duration: [TIME]
rustc 1.X.X
----- stderr -----
"#);
}
#[test]
fn additional_dependencies_cli() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r#"
repos:
- repo: local
hooks:
- id: rust-cli
name: rust-cli
language: rust
entry: prek-rust-echo Hello, Prek!
additional_dependencies: ["cli:prek-rust-echo"]
always_run: true
verbose: true
pass_filenames: false
"#});
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
rust-cli.................................................................Passed
- hook id: rust-cli
- duration: [TIME]
Hello, Prek!
----- stderr -----
");
}
#[test]
fn remote_hooks() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r#"
repos:
- repo: https://github.com/prek-test-repos/rust-hooks
rev: v1.0.0
hooks:
- id: hello-world
verbose: true
pass_filenames: false
always_run: true
args: ["Hello World"]
"#});
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
Hello World..............................................................Passed
- hook id: hello-world
- duration: [TIME]
Hello World
----- stderr -----
");
}
#[test]
fn remote_hook_non_workspace() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: https://github.com/prek-test-repos/rust-hooks-non-workspace
rev: v1.0.0
hooks:
- id: hello-world
verbose: true
pass_filenames: false
always_run: true
"});
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
hello-world..............................................................Passed
- hook id: hello-world
- duration: [TIME]
Hello, Prek!
----- stderr -----
");
}
#[test]
fn remote_hooks_with_lib_deps() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r#"
repos:
- repo: https://github.com/prek-test-repos/rust-hooks
rev: v1.0.0
hooks:
- id: hello-world-lib-deps
additional_dependencies: ["itoa:1"]
verbose: true
pass_filenames: false
always_run: true
"#});
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
Hello World Lib Deps.....................................................Passed
- hook id: hello-world-lib-deps
- duration: [TIME]
42
----- stderr -----
");
}