use nodedb::bridge::envelope::{ErrorCode, Status};
use nodedb_physical::physical_plan::{KvOp, PhysicalPlan};
use crate::helpers::*;
#[test]
fn kv_cross_tenant_put_does_not_overwrite() {
let (mut core, mut tx, mut rx, _dir) = make_core();
send_ok_as_tenant(
&mut core,
&mut tx,
&mut rx,
TENANT_A,
PhysicalPlan::Kv(KvOp::Put {
collection: "cache".into(),
key: b"shared_key".to_vec(),
value: b"tenant_a_value".to_vec(),
ttl_ms: 0,
surrogate: nodedb_types::Surrogate::ZERO,
}),
);
send_ok_as_tenant(
&mut core,
&mut tx,
&mut rx,
TENANT_B,
PhysicalPlan::Kv(KvOp::Put {
collection: "cache".into(),
key: b"shared_key".to_vec(),
value: b"tenant_b_value".to_vec(),
ttl_ms: 0,
surrogate: nodedb_types::Surrogate::ZERO,
}),
);
let resp_a = send_raw_as_tenant(
&mut core,
&mut tx,
&mut rx,
TENANT_A,
PhysicalPlan::Kv(KvOp::Get {
collection: "cache".into(),
key: b"shared_key".to_vec(),
rls_filters: Vec::new(),
surrogate_ceiling: None,
}),
);
assert_eq!(resp_a.status, Status::Ok);
let is_present = !resp_a.payload.is_empty()
&& resp_a.error_code != Some(ErrorCode::NotFound)
&& !payload_json(&resp_a.payload).contains("null");
assert!(
is_present,
"Tenant A's value must be intact after Tenant B's cross-tenant Put; payload len={}",
resp_a.payload.len()
);
}
#[test]
fn kv_cross_tenant_delete_does_not_affect_owner() {
let (mut core, mut tx, mut rx, _dir) = make_core();
send_ok_as_tenant(
&mut core,
&mut tx,
&mut rx,
TENANT_A,
PhysicalPlan::Kv(KvOp::Put {
collection: "sessions".into(),
key: b"sess_xyz".to_vec(),
value: b"secret_token".to_vec(),
ttl_ms: 0,
surrogate: nodedb_types::Surrogate::ZERO,
}),
);
let resp_del = send_raw_as_tenant(
&mut core,
&mut tx,
&mut rx,
TENANT_B,
PhysicalPlan::Kv(KvOp::Delete {
collection: "sessions".into(),
keys: vec![b"sess_xyz".to_vec()],
}),
);
let ok_or_not_found =
resp_del.status == Status::Ok || resp_del.error_code == Some(ErrorCode::NotFound);
assert!(
ok_or_not_found,
"Cross-tenant delete must be Ok or NotFound, got {:?}",
resp_del.error_code
);
let resp_a = send_raw_as_tenant(
&mut core,
&mut tx,
&mut rx,
TENANT_A,
PhysicalPlan::Kv(KvOp::Get {
collection: "sessions".into(),
key: b"sess_xyz".to_vec(),
rls_filters: Vec::new(),
surrogate_ceiling: None,
}),
);
assert_eq!(resp_a.status, Status::Ok);
let is_present = !resp_a.payload.is_empty()
&& resp_a.error_code != Some(ErrorCode::NotFound)
&& !payload_json(&resp_a.payload).contains("null");
assert!(
is_present,
"Tenant A's KV entry must survive Tenant B's cross-tenant delete; payload len={}",
resp_a.payload.len()
);
}