nushell/crates/nu-command/tests/commands/default.rs
Douglas 029f3843d3
Add default --empty to handle empty values (#15223)
# Description

Adds a new `--empty/-e` flag to the `default` command.

# User-Facing Changes

Before:

```nushell
$env.FOO = ""
$env.FOO = $env.FOO? | default bar
$env.FOO
# => Empty string
```

After:

```nushell
$env.FOO = ""
$env.FOO = $env.FOO? | default -e bar
$env.FOO
# => bar
```

* Uses `val.is_empty`, which means that empty lists and records are also
replaced
* Empty values in tables (with a column specifier) are also replaced.

# Tests + Formatting

7 tests added and 1 updated + 1 new example

- 🟢 `toolkit fmt`
- 🟢 `toolkit clippy`
- 🟢 `toolkit test`
- 🟢 `toolkit test stdlib`

# After Submitting

N/A
2025-03-13 19:50:50 +01:00

115 lines
2.8 KiB
Rust

use nu_test_support::{nu, pipeline};
#[test]
fn adds_row_data_if_column_missing() {
let sample = r#"
{
"amigos": [
{"name": "Yehuda"},
{"name": "JT", "rusty_luck": 0},
{"name": "Andres", "rusty_luck": 0},
{"name": "Michael", "rusty_luck": []},
{"name": "Darren", "rusty_luck": {}},
{"name": "Stefan", "rusty_luck": ""},
{"name": "GorbyPuff"}
]
}
"#;
let actual = nu!(pipeline(&format!(
"
{sample}
| get amigos
| default 1 rusty_luck
| where rusty_luck == 1
| length
"
)));
assert_eq!(actual.out, "2");
}
#[test]
fn default_after_empty_filter() {
let actual = nu!("[a b] | where $it == 'c' | get -i 0 | default 'd'");
assert_eq!(actual.out, "d");
}
#[test]
fn keeps_nulls_in_lists() {
let actual = nu!(r#"[null, 2, 3] | default [] | to json -r"#);
assert_eq!(actual.out, "[null,2,3]");
}
#[test]
fn replaces_null() {
let actual = nu!(r#"null | default 1"#);
assert_eq!(actual.out, "1");
}
#[test]
fn adds_row_data_if_column_missing_or_empty() {
let sample = r#"
{
"amigos": [
{"name": "Yehuda"},
{"name": "JT", "rusty_luck": 0},
{"name": "Andres", "rusty_luck": 0},
{"name": "Michael", "rusty_luck": []},
{"name": "Darren", "rusty_luck": {}},
{"name": "Stefan", "rusty_luck": ""},
{"name": "GorbyPuff"}
]
}
"#;
let actual = nu!(pipeline(&format!(
"
{sample}
| get amigos
| default -e 1 rusty_luck
| where rusty_luck == 1
| length
"
)));
assert_eq!(actual.out, "5");
}
#[test]
fn replace_empty_string() {
let actual = nu!(r#"'' | default -e foo"#);
assert_eq!(actual.out, "foo");
}
#[test]
fn do_not_replace_empty_string() {
let actual = nu!(r#"'' | default 1"#);
assert_eq!(actual.out, "");
}
#[test]
fn replace_empty_list() {
let actual = nu!(r#"[] | default -e foo"#);
assert_eq!(actual.out, "foo");
}
#[test]
fn do_not_replace_empty_list() {
let actual = nu!(r#"[] | default 1 | length"#);
assert_eq!(actual.out, "0");
}
#[test]
fn replace_empty_record() {
let actual = nu!(r#"{} | default -e foo"#);
assert_eq!(actual.out, "foo");
}
#[test]
fn do_not_replace_empty_record() {
let actual = nu!(r#"{} | default {a:5} | columns | length"#);
assert_eq!(actual.out, "0");
}