nushell/crates/nu-command/tests/commands/network/http/post.rs
Gonçalo Gomes ce4ea16c08
fix #10319: allow json request of value type list (#10356)
# Description

this commit adds the handling of Value::List when BodyType is Json
it also adds the corresponding test (trying to send a list)

Fixes #10319

# User-Facing Changes

Added the ability to send a json list in the POST message

# Tests + Formatting
- [x] `cargo fmt --all -- --check` to check standard code formatting
(`cargo fmt --all` applies these changes)
- [x] `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used`
to check that you're using the standard code style
- [x] `cargo test --workspace` to check that all tests pass (on Windows
make sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- [x] `cargo run -- -c "use std testing; testing run-tests --path
crates/nu-std"` to run the tests for the standard library

Also ran `nc -l -p 8080` in other terminal and `http post -fe -t
application/json http://localhost:8080 [{ field: true }]` I see the
following appear in the output of nc:
```
POST / HTTP/1.1
Host: localhost:8080
User-Agent: nushell
Accept: */*
Content-Type: application/json
accept-encoding: gzip
Content-Length: 16

[{"field":true}]%
```
2023-09-13 16:54:03 +02:00

115 lines
2.3 KiB
Rust

use mockito::Server;
use nu_test_support::{nu, pipeline};
#[test]
fn http_post_is_success() {
let mut server = Server::new();
let _mock = server.mock("POST", "/").match_body("foo").create();
let actual = nu!(pipeline(
format!(
r#"
http post {url} "foo"
"#,
url = server.url()
)
.as_str()
));
assert!(actual.out.is_empty())
}
#[test]
fn http_post_failed_due_to_server_error() {
let mut server = Server::new();
let _mock = server.mock("POST", "/").with_status(400).create();
let actual = nu!(pipeline(
format!(
r#"
http post {url} "body"
"#,
url = server.url()
)
.as_str()
));
assert!(actual.err.contains("Bad request (400)"))
}
#[test]
fn http_post_failed_due_to_missing_body() {
let mut server = Server::new();
let _mock = server.mock("POST", "/").create();
let actual = nu!(pipeline(
format!(
r#"
http post {url}
"#,
url = server.url()
)
.as_str()
));
assert!(actual.err.contains("Usage: http post"))
}
#[test]
fn http_post_failed_due_to_unexpected_body() {
let mut server = Server::new();
let _mock = server.mock("POST", "/").match_body("foo").create();
let actual = nu!(pipeline(
format!(
r#"
http post {url} "bar"
"#,
url = server.url()
)
.as_str()
));
assert!(actual.err.contains("Cannot make request"))
}
#[test]
fn http_post_json_is_success() {
let mut server = Server::new();
let mock = server
.mock("POST", "/")
.match_body(r#"{"foo":"bar"}"#)
.create();
let actual = nu!(format!(
r#"http post -t 'application/json' {url} {{foo: 'bar'}}"#,
url = server.url()
));
mock.assert();
assert!(actual.out.is_empty())
}
#[test]
fn http_post_json_list_is_success() {
let mut server = Server::new();
let mock = server
.mock("POST", "/")
.match_body(r#"[{"foo":"bar"}]"#)
.create();
let actual = nu!(format!(
r#"http post -t 'application/json' {url} [{{foo: "bar"}}]"#,
url = server.url()
));
mock.assert();
assert!(actual.out.is_empty())
}