nushell/crates/nu-command/tests/commands/get.rs

206 lines
5.6 KiB
Rust
Raw Normal View History

2019-12-17 18:54:39 +00:00
use nu_test_support::fs::Stub::FileWithContent;
use nu_test_support::playground::Playground;
use nu_test_support::{nu, pipeline};
2019-10-31 09:42:18 +00:00
2022-12-21 22:54:39 +00:00
#[test]
fn simple_get_record() {
let actual = nu!(r#"({foo: 'bar'} | get foo) == "bar""#);
assert_eq!(actual.out, "true");
}
#[test]
fn simple_get_list() {
let actual = nu!(r#"([{foo: 'bar'}] | get foo) == [bar]"#);
assert_eq!(actual.out, "true");
}
2019-10-31 09:36:08 +00:00
#[test]
fn fetches_a_row() {
2019-10-31 09:36:08 +00:00
Playground::setup("get_test_1", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
nu_party_venue = "zion"
"#,
)]);
let actual = nu!( cwd: dirs.test(), "open sample.toml | get nu_party_venue");
2019-10-31 09:36:08 +00:00
assert_eq!(actual.out, "zion");
2019-10-31 09:36:08 +00:00
})
}
#[test]
fn fetches_by_index() {
2019-10-31 09:36:08 +00:00
Playground::setup("get_test_2", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[package]
name = "nu"
version = "0.4.1"
authors = ["Yehuda Katz <wycats@gmail.com>", "JT Turner <547158+jntrnr@users.noreply.github.com>", "Andrés N. Robalino <andres@androbtech.com>"]
2019-10-31 09:36:08 +00:00
description = "When arepas shells are tasty and fun."
"#,
)]);
let actual = nu!( cwd: dirs.test(), "open sample.toml | get package.authors.2");
2019-10-31 09:36:08 +00:00
assert_eq!(actual.out, "Andrés N. Robalino <andres@androbtech.com>");
2019-10-31 09:36:08 +00:00
})
}
2022-02-16 01:48:32 +00:00
#[test]
fn fetches_by_column_path() {
Playground::setup("get_test_3", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[package]
name = "nu"
"#,
)]);
let actual = nu!( cwd: dirs.test(), "open sample.toml | get package.name");
assert_eq!(actual.out, "nu");
})
}
#[test]
fn column_paths_are_either_double_quoted_or_regular_unquoted_words_separated_by_dot() {
Playground::setup("get_test_4", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[package]
9999 = ["Yehuda Katz <wycats@gmail.com>", "JT Turner <jtd.turner@gmail.com>", "Andrés N. Robalino <andres@androbtech.com>"]
description = "When arepas shells are tasty and fun."
"#,
)]);
let actual = nu!( cwd: dirs.test(), r#"open sample.toml | get package."9999" | length"#);
assert_eq!(actual.out, "3");
})
}
2019-10-31 09:36:08 +00:00
#[test]
fn fetches_more_than_one_column_path() {
Playground::setup("get_test_5", |dirs, sandbox| {
2019-10-31 09:36:08 +00:00
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[[fortune_tellers]]
name = "Andrés N. Robalino"
arepas = 1
[[fortune_tellers]]
2022-02-09 14:59:40 +00:00
name = "JT"
2019-10-31 09:36:08 +00:00
arepas = 1
[[fortune_tellers]]
name = "Yehuda Katz"
arepas = 1
"#,
)]);
let actual = nu!(
cwd: dirs.test(), pipeline(
"
2019-10-31 09:36:08 +00:00
open sample.toml
| get fortune_tellers.2.name fortune_tellers.0.name fortune_tellers.1.name
| get 2
"
2019-10-31 09:36:08 +00:00
));
2022-02-09 14:59:40 +00:00
assert_eq!(actual.out, "JT");
2019-10-31 09:36:08 +00:00
})
}
#[test]
fn errors_fetching_by_column_not_present() {
Playground::setup("get_test_6", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[tacos]
sentence_words = ["Yo", "quiero", "tacos"]
[pizzanushell]
sentence-words = ["I", "want", "pizza"]
"#,
)]);
let actual = nu!( cwd: dirs.test(), "open sample.toml | get taco");
2022-02-16 01:48:32 +00:00
assert!(actual.err.contains("Name not found"),);
assert!(actual.err.contains("did you mean 'tacos'"),);
})
}
2019-10-31 09:36:08 +00:00
#[test]
fn errors_fetching_by_column_using_a_number() {
Playground::setup("get_test_7", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[spanish_lesson]
0 = "can only be fetched with 0 double quoted."
"#,
)]);
let actual = nu!( cwd: dirs.test(), "open sample.toml | get spanish_lesson.0");
assert!(actual.err.contains("Type mismatch"),);
})
}
#[test]
fn errors_fetching_by_index_out_of_bounds() {
Playground::setup("get_test_8", |dirs, sandbox| {
2019-10-31 09:36:08 +00:00
sandbox.with_files(vec![FileWithContent(
"sample.toml",
r#"
[spanish_lesson]
sentence_words = ["Yo", "quiero", "taconushell"]
"#,
)]);
let actual = nu!(
cwd: dirs.test(), " open sample.toml | get spanish_lesson.sentence_words.3 ");
2019-10-31 09:36:08 +00:00
assert!(actual.err.contains("Row number too large (max: 2)"),);
2022-02-16 01:48:32 +00:00
assert!(actual.err.contains("too large"),);
2019-10-31 09:36:08 +00:00
})
}
#[test]
fn errors_fetching_by_accessing_empty_list() {
Removes unnecessary cwd and pipeline from various tests (#9202) # Description <!-- Thank you for improving Nushell. Please, check our [contributing guide](../CONTRIBUTING.md) and talk to the core team before making major changes. Description of your pull request goes here. **Provide examples and/or screenshots** if your changes affect the user experience. --> Cleans up various tests that unnecessarily use the `cwd` argument of `nu!`, and the `pipeline` function for single line commands. Also replaces some unnecessary raw strings with normal strings. Part of #8670. # User-Facing Changes <!-- List of all changes that impact the user experience here. This helps us keep track of breaking changes. --> None # Tests + Formatting <!-- Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect -A clippy::result_large_err` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass - `cargo run -- crates/nu-std/tests/run.nu` to run the tests for the standard library > **Note** > from `nushell` you can also use the `toolkit` as follows > ```bash > use toolkit.nu # or use an `env_change` hook to activate it automatically > toolkit check pr > ``` --> All checks pass # After Submitting <!-- If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. -->
2023-05-17 23:55:26 +00:00
let actual = nu!("[] | get 3");
assert!(actual.err.contains("Row number too large (empty content)"),);
}
#[test]
fn quoted_column_access() {
let actual = nu!(
cwd: "tests/fixtures/formats",
2022-10-26 16:36:42 +00:00
r#"'[{"foo bar": {"baz": 4}}]' | from json | get "foo bar".baz.0 "#
);
assert_eq!(actual.out, "4");
}
#[test]
fn get_does_not_delve_too_deep_in_nested_lists() {
let actual = nu!(r#"[[{foo: bar}]] | get foo"#);
Make `get` hole errors and cell path hole errors identical (improvement on #7002) (#7647) # Description This closes #7498, as well as fixes an issue reported in https://github.com/nushell/nushell/pull/7002#issuecomment-1368340773 BEFORE: ``` 〉[{foo: 'bar'} {}] | get foo Error: nu::shell::column_not_found (link) × Cannot find column ╭─[entry #5:1:1] 1 │ [{foo: 'bar'} {}] | get foo · ────────┬──────── ─┬─ · │ ╰── value originates here · ╰── cannot find column 'Empty cell' ╰──── 〉[{foo: 'bar'} {}].foo ╭───┬─────╮ │ 0 │ bar │ │ 1 │ │ ╰───┴─────╯ ``` AFTER: ``` 〉[{foo: 'bar'} {}] | get foo Error: nu::shell::column_not_found (link) × Cannot find column ╭─[entry #1:1:1] 1 │ [{foo: 'bar'} {}] | get foo · ─┬ ─┬─ · │ ╰── cannot find column 'foo' · ╰── value originates here ╰──── 〉[{foo: 'bar'} {}].foo Error: nu::shell::column_not_found (link) × Cannot find column ╭─[entry #3:1:1] 1 │ [{foo: 'bar'} {}].foo · ─┬ ─┬─ · │ ╰── cannot find column 'foo' · ╰── value originates here ╰──── ``` EDIT: This also changes the semantics of `get`/`select` `-i` somewhat. I've decided to leave it like this because it works more intuitively with `default` and `compact`. BEFORE: ``` 〉[{a:1} {b:2} {a:3}] | select -i foo | to nuon null ``` AFTER: ``` 〉[{a:1} {b:2} {a:3}] | select -i foo | to nuon [[foo]; [null], [null], [null]] ``` # User-Facing Changes See above. EDIT: the issue with holes in cases like ` [{foo: 'bar'} {}].foo.0` versus ` [{foo: 'bar'} {}].0.foo` has been resolved. # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date.
2023-01-02 22:45:43 +00:00
assert!(actual.err.contains("cannot find column"));
}
#[test]
fn ignore_errors_works() {
let actual = nu!(r#" let path = "foo"; {} | get -i $path | to nuon "#);
assert_eq!(actual.out, "null");
}