223 lines
4.9 KiB
Rust
223 lines
4.9 KiB
Rust
use json_patch::{
|
|
AddOperation, CopyOperation, MoveOperation, Patch, PatchOperation, RemoveOperation,
|
|
ReplaceOperation, TestOperation,
|
|
};
|
|
use serde_json::{from_str, from_value, json, Value};
|
|
|
|
#[test]
|
|
fn parse_from_value() {
|
|
let json = json!([{"op": "add", "path": "/a/b", "value": 1}, {"op": "remove", "path": "/c"}]);
|
|
let patch: Patch = from_value(json).unwrap();
|
|
|
|
assert_eq!(
|
|
patch,
|
|
Patch(vec![
|
|
PatchOperation::Add(AddOperation {
|
|
path: "/a/b".parse().unwrap(),
|
|
value: Value::from(1),
|
|
}),
|
|
PatchOperation::Remove(RemoveOperation {
|
|
path: "/c".parse().unwrap(),
|
|
}),
|
|
])
|
|
);
|
|
|
|
let _patch: Patch =
|
|
from_str(r#"[{"op": "add", "path": "/a/b", "value": 1}, {"op": "remove", "path": "/c"}]"#)
|
|
.unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn parse_from_string() {
|
|
let patch: Patch =
|
|
from_str(r#"[{"op": "add", "path": "/a/b", "value": 1}, {"op": "remove", "path": "/c"}]"#)
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
patch,
|
|
Patch(vec![
|
|
PatchOperation::Add(AddOperation {
|
|
path: "/a/b".parse().unwrap(),
|
|
value: Value::from(1),
|
|
}),
|
|
PatchOperation::Remove(RemoveOperation {
|
|
path: "/c".parse().unwrap(),
|
|
}),
|
|
])
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn serialize_patch() {
|
|
let s = r#"[{"op":"add","path":"/a/b","value":1},{"op":"remove","path":"/c"}]"#;
|
|
let patch: Patch = from_str(s).unwrap();
|
|
|
|
let serialized = serde_json::to_string(&patch).unwrap();
|
|
assert_eq!(serialized, s);
|
|
}
|
|
|
|
#[test]
|
|
fn display_add_operation() {
|
|
let op = PatchOperation::Add(AddOperation {
|
|
path: "/a/b/c".parse().unwrap(),
|
|
value: json!(["hello", "bye"]),
|
|
});
|
|
assert_eq!(
|
|
op.to_string(),
|
|
r#"{"op":"add","path":"/a/b/c","value":["hello","bye"]}"#
|
|
);
|
|
assert_eq!(
|
|
format!("{:#}", op),
|
|
r#"{
|
|
"op": "add",
|
|
"path": "/a/b/c",
|
|
"value": [
|
|
"hello",
|
|
"bye"
|
|
]
|
|
}"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_remove_operation() {
|
|
let op = PatchOperation::Remove(RemoveOperation {
|
|
path: "/a/b/c".parse().unwrap(),
|
|
});
|
|
assert_eq!(op.to_string(), r#"{"op":"remove","path":"/a/b/c"}"#);
|
|
assert_eq!(
|
|
format!("{:#}", op),
|
|
r#"{
|
|
"op": "remove",
|
|
"path": "/a/b/c"
|
|
}"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_replace_operation() {
|
|
let op = PatchOperation::Replace(ReplaceOperation {
|
|
path: "/a/b/c".parse().unwrap(),
|
|
value: json!(42),
|
|
});
|
|
assert_eq!(
|
|
op.to_string(),
|
|
r#"{"op":"replace","path":"/a/b/c","value":42}"#
|
|
);
|
|
assert_eq!(
|
|
format!("{:#}", op),
|
|
r#"{
|
|
"op": "replace",
|
|
"path": "/a/b/c",
|
|
"value": 42
|
|
}"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_move_operation() {
|
|
let op = PatchOperation::Move(MoveOperation {
|
|
from: "/a/b/c".parse().unwrap(),
|
|
path: "/a/b/d".parse().unwrap(),
|
|
});
|
|
assert_eq!(
|
|
op.to_string(),
|
|
r#"{"op":"move","from":"/a/b/c","path":"/a/b/d"}"#
|
|
);
|
|
assert_eq!(
|
|
format!("{:#}", op),
|
|
r#"{
|
|
"op": "move",
|
|
"from": "/a/b/c",
|
|
"path": "/a/b/d"
|
|
}"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_copy_operation() {
|
|
let op = PatchOperation::Copy(CopyOperation {
|
|
from: "/a/b/d".parse().unwrap(),
|
|
path: "/a/b/e".parse().unwrap(),
|
|
});
|
|
assert_eq!(
|
|
op.to_string(),
|
|
r#"{"op":"copy","from":"/a/b/d","path":"/a/b/e"}"#
|
|
);
|
|
assert_eq!(
|
|
format!("{:#}", op),
|
|
r#"{
|
|
"op": "copy",
|
|
"from": "/a/b/d",
|
|
"path": "/a/b/e"
|
|
}"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_test_operation() {
|
|
let op = PatchOperation::Test(TestOperation {
|
|
path: "/a/b/c".parse().unwrap(),
|
|
value: json!("hello"),
|
|
});
|
|
assert_eq!(
|
|
op.to_string(),
|
|
r#"{"op":"test","path":"/a/b/c","value":"hello"}"#
|
|
);
|
|
assert_eq!(
|
|
format!("{:#}", op),
|
|
r#"{
|
|
"op": "test",
|
|
"path": "/a/b/c",
|
|
"value": "hello"
|
|
}"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_patch() {
|
|
let patch = Patch(vec![
|
|
PatchOperation::Add(AddOperation {
|
|
path: "/a/b/c".parse().unwrap(),
|
|
value: json!(["hello", "bye"]),
|
|
}),
|
|
PatchOperation::Remove(RemoveOperation {
|
|
path: "/a/b/c".parse().unwrap(),
|
|
}),
|
|
]);
|
|
|
|
assert_eq!(
|
|
patch.to_string(),
|
|
r#"[{"op":"add","path":"/a/b/c","value":["hello","bye"]},{"op":"remove","path":"/a/b/c"}]"#
|
|
);
|
|
assert_eq!(
|
|
format!("{:#}", patch),
|
|
r#"[
|
|
{
|
|
"op": "add",
|
|
"path": "/a/b/c",
|
|
"value": [
|
|
"hello",
|
|
"bye"
|
|
]
|
|
},
|
|
{
|
|
"op": "remove",
|
|
"path": "/a/b/c"
|
|
}
|
|
]"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn display_patch_default() {
|
|
let patch = Patch::default();
|
|
assert_eq!(patch.to_string(), r#"[]"#);
|
|
}
|
|
|
|
#[test]
|
|
fn display_patch_operation_default() {
|
|
let op = PatchOperation::default();
|
|
assert_eq!(op.to_string(), r#"{"op":"test","path":"","value":null}"#);
|
|
}
|