mirror of
https://github.com/nushell/nushell
synced 2025-01-04 17:28:59 +00:00
380 lines
10 KiB
Rust
380 lines
10 KiB
Rust
use nu_test_support::fs::Stub::FileWithContent;
|
|
use nu_test_support::fs::{AbsolutePath, DisplayPath};
|
|
use nu_test_support::playground::{says, Playground};
|
|
use nu_test_support::{nu, NATIVE_PATH_ENV_SEPARATOR};
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use hamcrest2::assert_that;
|
|
use hamcrest2::prelude::*;
|
|
|
|
/// Helper function that joins string literals with ':' or ';', based on host OS
|
|
fn join_env_sep(pieces: &[&str]) -> String {
|
|
let sep_string = String::from(NATIVE_PATH_ENV_SEPARATOR);
|
|
pieces.join(&sep_string)
|
|
}
|
|
|
|
// Helpers
|
|
|
|
#[cfg(windows)]
|
|
#[test]
|
|
fn joins_env_on_windows() {
|
|
let pieces = ["sausage", "bacon", "spam"];
|
|
let actual = join_env_sep(&pieces);
|
|
|
|
assert_eq!(&actual, "sausage;bacon;spam");
|
|
}
|
|
|
|
#[cfg(not(windows))]
|
|
#[test]
|
|
fn joins_env_on_non_windows() {
|
|
let pieces = ["sausage", "bacon", "spam"];
|
|
let actual = join_env_sep(&pieces);
|
|
|
|
assert_eq!(&actual, "sausage:bacon:spam");
|
|
}
|
|
|
|
// The following tests don't work on Windows likely because of this issue:
|
|
// https://github.com/nushell/nushell/issues/3831
|
|
//
|
|
// fn pathvar_correctly_reads_path_from_config_and_env()
|
|
// fn pathvar_correctly_reads_path_from_env()
|
|
// fn pathvar_saves_new_path_to_config()
|
|
//
|
|
// Requires also auto-reading other-than-path env vars from config:
|
|
// fn pathvar_correctly_reads_env_var_from_config_and_env()
|
|
// fn pathvar_correctly_reads_env_var_from_config()
|
|
|
|
// pathvar
|
|
|
|
#[test]
|
|
fn pathvar_correctly_reads_path_from_config() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
path = ["/Users/andresrobalino/.volta/bin", "/Users/mosqueteros/bin"]
|
|
"#,
|
|
)])
|
|
.with_config(&file);
|
|
|
|
let expected = "/Users/andresrobalino/.volta/bin-/Users/mosqueteros/bin";
|
|
let actual = sandbox.pipeline(r#" pathvar | first 2 | str collect '-' "#);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_correctly_reads_env_var_from_env() {
|
|
Playground::setup("hi_there", |_, sandbox| {
|
|
sandbox.with_env("BREAKFAST", &join_env_sep(&["bacon", "spam"]));
|
|
|
|
let expected = "bacon-spam";
|
|
let actual = sandbox.pipeline(r#" pathvar -v BREAKFAST | str collect '-' "#);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
// pathvar add
|
|
|
|
#[test]
|
|
fn pathvar_adds_to_path() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
path = ["/Users/mosquito/proboscis"]
|
|
"#,
|
|
)])
|
|
.with_config(&file);
|
|
|
|
let expected = "spam";
|
|
let actual = sandbox.pipeline(r#" pathvar add spam; pathvar | first "#);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_adds_to_env_var() {
|
|
Playground::setup("hi_there", |_, sandbox| {
|
|
sandbox.with_env("BREAKFAST", &join_env_sep(&["egg", "sausage", "bacon"]));
|
|
|
|
let expected = join_env_sep(&["spam", "egg", "sausage", "bacon"]);
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar add -v BREAKFAST spam
|
|
$nu.env.BREAKFAST
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(&expected));
|
|
})
|
|
}
|
|
|
|
// pathvar append
|
|
|
|
#[test]
|
|
fn pathvar_appends_to_path() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
path = ["/Users/mosquito/proboscis"]
|
|
"#,
|
|
)])
|
|
.with_config(&file);
|
|
|
|
let expected = "spam";
|
|
let actual = sandbox.pipeline(r#" pathvar append spam; pathvar | last "#);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_appends_to_env_var() {
|
|
Playground::setup("hi_there", |_, sandbox| {
|
|
sandbox.with_env("BREAKFAST", &join_env_sep(&["egg", "sausage", "bacon"]));
|
|
|
|
let expected = join_env_sep(&["egg", "sausage", "bacon", "spam"]);
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar append -v BREAKFAST spam
|
|
$nu.env.BREAKFAST
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(&expected));
|
|
})
|
|
}
|
|
|
|
// pathvar remove
|
|
|
|
#[test]
|
|
fn pathvar_removes_from_path() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
path = ["/Users/mosquito/proboscis", "spam"]
|
|
"#,
|
|
)])
|
|
.with_config(&file);
|
|
|
|
let expected = "/Users/mosquito/proboscis";
|
|
let actual = sandbox.pipeline(r#" pathvar remove 1; pathvar | first "#);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_removes_from_env_var() {
|
|
Playground::setup("hi_there", |_, sandbox| {
|
|
sandbox.with_env(
|
|
"BREAKFAST",
|
|
&join_env_sep(&["egg", "sausage", "bacon", "spam"]),
|
|
);
|
|
|
|
let expected = join_env_sep(&["egg", "sausage", "bacon"]);
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar remove -v BREAKFAST 3
|
|
$nu.env.BREAKFAST
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(&expected));
|
|
})
|
|
}
|
|
|
|
// pathvar reset
|
|
|
|
#[test]
|
|
fn pathvar_resets_path_from_config() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
path = ["/Users/andresrobalino/.volta/bin", "/Users/mosqueteros/bin"]
|
|
"#,
|
|
)])
|
|
.with_config(&file)
|
|
.with_env(
|
|
nu_test_support::NATIVE_PATH_ENV_VAR,
|
|
&PathBuf::from("/Users/mosquito/proboscis").display_path(),
|
|
);
|
|
|
|
let expected = "/Users/andresrobalino/.volta/bin-/Users/mosqueteros/bin";
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar reset
|
|
pathvar | str collect '-'
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_resets_env_var_from_config() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
breakfast = ["egg", "sausage", "bacon"]
|
|
"#,
|
|
)])
|
|
.with_config(&file)
|
|
.with_env(
|
|
"BREAKFAST",
|
|
&join_env_sep(&["egg", "sausage", "bacon", "spam"]),
|
|
);
|
|
|
|
let expected = "egg-sausage-bacon";
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar reset -v BREAKFAST
|
|
pathvar -v BREAKFAST | str collect '-'
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
// pathvar save
|
|
|
|
#[test]
|
|
fn pathvar_saves_path_to_config() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
path = ["/Users/andresrobalino/.volta/bin", "/Users/mosqueteros/bin"]
|
|
"#,
|
|
)])
|
|
.with_config(&file);
|
|
|
|
let expected = "/Users/mosquito/proboscis";
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar append "/Users/mosquito/proboscis"
|
|
pathvar save
|
|
(config).path | last
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_saves_env_var_to_config() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
|
|
breakfast = ["egg", "sausage", "bacon"]
|
|
"#,
|
|
)])
|
|
.with_config(&file)
|
|
.with_env("BREAKFAST", "spam");
|
|
|
|
let expected = "spam";
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar save -v BREAKFAST
|
|
(config).breakfast | str collect '-'
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn pathvar_saves_new_env_var_to_config() {
|
|
Playground::setup("hi_there", |dirs, sandbox| {
|
|
let file = AbsolutePath::new(dirs.test().join("config.toml"));
|
|
|
|
sandbox
|
|
.with_files(vec![FileWithContent(
|
|
"config.toml",
|
|
r#"
|
|
skip_welcome_message = true
|
|
"#,
|
|
)])
|
|
.with_config(&file)
|
|
.with_env("BREAKFAST", "spam");
|
|
|
|
let expected = "spam";
|
|
let actual = sandbox.pipeline(
|
|
r#"
|
|
pathvar save -v BREAKFAST
|
|
(config).breakfast | str collect '-'
|
|
"#,
|
|
);
|
|
|
|
assert_that!(actual, says().stdout(expected));
|
|
})
|
|
}
|
|
|
|
// test some errors
|
|
|
|
#[test]
|
|
fn pathvar_error_non_existent_env_var() {
|
|
Playground::setup("hi_there", |dirs, _| {
|
|
let actual = nu!(
|
|
cwd: dirs.test(),
|
|
"pathvar -v EGGS_BACON_SPAM_SAUSAGE_SPAM_AND_SPAM_WITH_EXTRA_SPAM"
|
|
);
|
|
|
|
assert!(actual.err.contains("Error"));
|
|
assert!(actual.err.contains("not set"));
|
|
})
|
|
}
|