mod common;
use engenho_diff::{JsonPath, Operation, volatile_meta};
use serde_json::json;
const KNOWN_DIVERGENCES: &[&str] = &[];
#[tokio::test(flavor = "multi_thread")]
async fn patch_parity() {
let engenho = common::boot_engenho(&["ConfigMap", "Namespace", "Pod"]).await;
let k3s = common::load_oracle().await;
let norm = volatile_meta();
let suffix = common::unique_suffix();
let ns = {
let mut s = String::from("engenho-diff-patch-");
s.push_str(&suffix);
s
};
let mut findings = Vec::new();
let cm = "patch-cm";
let setup = [
Operation::create_namespace(&ns),
Operation::create_configmap(&ns, cm, json!({"greeting": "ola", "keep": "yes"})),
];
let cm_ops = [
Operation::merge_patch(
&ns,
"configmaps",
cm,
json!({"data": {"greeting": null, "mp": "1"}}),
),
Operation::strategic_patch(&ns, "configmaps", cm, json!({"data": {"sp": "1"}})),
Operation::json_patch(
&ns,
"configmaps",
cm,
json!([
{"op": "remove", "path": "/data/keep"},
{"op": "add", "path": "/data/jp", "value": "1"},
]),
),
Operation::get_configmap(&ns, cm),
];
let pod = "patch-pod";
let c0 = JsonPath::parse("spec.containers[0].image");
let c1 = JsonPath::parse("spec.containers[1].image");
let lbl_mp = JsonPath::parse("metadata.labels.mp");
let lbl_jp = JsonPath::parse("metadata.labels.jp");
let pod_setup = [Operation::create_pod_containers(
&ns,
pod,
&[("main", "nginx:1.27"), ("sidecar", "envoy:1.30")],
)];
let pod_ops = [
Operation::strategic_patch(
&ns,
"pods",
pod,
json!({"spec": {"containers": [{"name": "main", "image": "nginx:1.28"}]}}),
)
.with_focus(c0.clone()),
Operation::get(&ns, "pods", pod).with_focus(c1.clone()),
Operation::merge_patch(
&ns,
"pods",
pod,
json!({"metadata": {"labels": {"mp": "1"}}}),
)
.with_focus(lbl_mp.clone()),
Operation::json_patch(
&ns,
"pods",
pod,
json!([{"op": "add", "path": "/metadata/labels/jp", "value": "1"}]),
)
.with_focus(lbl_jp.clone()),
];
for op in setup.iter().chain(pod_setup.iter()) {
common::exec_only(op, &engenho, &k3s).await;
}
for op in cm_ops.iter().chain(pod_ops.iter()) {
findings.push(common::run_one(op, &engenho, &k3s, &norm).await);
}
common::cleanup(&k3s, &Operation::delete_namespace(&ns).path).await;
common::print_report("PATCH", &findings);
engenho.shutdown().await.expect("engenho shuts down");
common::assert_ratchet(&findings, KNOWN_DIVERGENCES);
}