use super::*;
use serde_json::json;
fn base_body() -> serde_json::Value {
json!({"model": "m", "messages": [{"role": "user", "content": "hi"}]})
}
#[test]
fn default_posture_leaves_the_request_byte_identical() {
let mut body = base_body();
let plan = resolve(
"openai",
DataControlDialect::OpenAiSse,
DataPosture::Default,
);
plan.write_body(&mut body);
assert_eq!(body, base_body(), "default posture must not touch the body");
assert!(plan.headers.is_empty());
assert_eq!(plan.receipt.outcome, DataControlsOutcome::NotRequested);
assert_eq!(
plan.receipt.control_scope,
Some(DataControlScope::PerRequest)
);
assert!(plan.receipt.applied.is_empty());
}
#[test]
fn strict_posture_puts_openai_store_false_on_the_wire() {
let mut body = base_body();
let plan = resolve(
"openai",
DataControlDialect::OpenAiSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut body);
assert_eq!(body["store"], json!(false));
assert_eq!(plan.receipt.outcome, DataControlsOutcome::Applied);
assert_eq!(plan.receipt.applied.len(), 1);
let applied = &plan.receipt.applied[0];
assert_eq!(applied.location, "body");
assert_eq!(applied.name, "store");
assert_eq!(applied.value, json!(false));
assert_eq!(applied.effect, "retention");
assert!(
applied.caveat.is_some(),
"the abuse-monitoring caveat must survive onto the receipt"
);
}
#[test]
fn strict_posture_on_a_provider_with_no_control_says_so() {
let mut body = base_body();
let plan = resolve(
"anthropic",
DataControlDialect::AnthropicSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut body);
assert_eq!(body, base_body(), "nothing may be invented on this wire");
assert!(plan.headers.is_empty());
assert_eq!(
plan.receipt.outcome,
DataControlsOutcome::NoControlAvailable
);
assert_eq!(plan.receipt.control_scope, Some(DataControlScope::Account));
assert!(
plan.receipt
.note
.as_deref()
.is_some_and(|note| note.contains("organization")),
"the receipt must carry why the strict posture was unavailable"
);
}
#[test]
fn an_unknown_provider_reads_as_unresearched_not_as_no_control() {
let mut body = base_body();
let plan = resolve(
"provider-that-does-not-exist",
DataControlDialect::OpenAiSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut body);
assert_eq!(
plan.receipt.outcome,
DataControlsOutcome::ProviderUnresearched
);
assert_eq!(plan.receipt.control_scope, None);
assert_ne!(
plan.receipt.outcome,
DataControlsOutcome::NoControlAvailable,
"absence of a declaration is not a declaration of absence"
);
}
#[test]
fn openrouter_writes_both_effects_into_a_nested_provider_object() {
let mut body = base_body();
let plan = resolve(
"openrouter",
DataControlDialect::OpenAiSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut body);
assert_eq!(body["provider"]["data_collection"], json!("deny"));
assert_eq!(body["provider"]["zdr"], json!(true));
assert_eq!(plan.receipt.outcome, DataControlsOutcome::Applied);
let effects: Vec<&str> = plan
.receipt
.applied
.iter()
.map(|control| control.effect.as_str())
.collect();
assert!(effects.contains(&"training"));
assert!(effects.contains(&"retention"));
}
#[test]
fn a_nested_path_merges_into_an_existing_provider_object() {
let mut body = base_body();
body["provider"] = json!({"order": ["a"]});
resolve(
"openrouter",
DataControlDialect::OpenAiSse,
DataPosture::StrictestAvailable,
)
.write_body(&mut body);
assert_eq!(body["provider"]["order"], json!(["a"]));
assert_eq!(body["provider"]["data_collection"], json!("deny"));
}
#[test]
fn gemini_store_applies_only_to_the_interactions_dialect() {
let mut generate_content = base_body();
let plan = resolve(
"gemini",
DataControlDialect::GeminiJson,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut generate_content);
assert_eq!(generate_content, base_body());
assert_eq!(
plan.receipt.outcome,
DataControlsOutcome::NoControlAvailable
);
let mut interactions = base_body();
let plan = resolve(
"gemini",
DataControlDialect::GeminiInteractionsSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut interactions);
assert_eq!(interactions["store"], json!(false));
assert_eq!(plan.receipt.outcome, DataControlsOutcome::Applied);
}
#[test]
fn load_bearing_rows_are_classified_in_the_right_direction() {
let acting = declaration_for("openai").expect("openai is researched");
assert_eq!(acting.control_scope, DataControlScope::PerRequest);
assert!(acting.offers_per_request_control());
let contractual = declaration_for("anthropic").expect("anthropic is researched");
assert_eq!(contractual.control_scope, DataControlScope::Account);
assert!(!contractual.offers_per_request_control());
assert!(contractual.request_controls.is_empty());
}
#[test]
fn scope_none_is_a_researched_claim_with_a_citation() {
let cerebras = declaration_for("cerebras").expect("cerebras is researched");
assert_eq!(cerebras.control_scope, DataControlScope::None);
assert!(cerebras.request_controls.is_empty());
assert!(cerebras
.sources
.iter()
.all(|source| source.starts_with("https://")));
}
#[test]
fn every_stream_protocol_maps_to_a_declared_dialect() {
for protocol in [
StreamProtocol::AnthropicSse,
StreamProtocol::OpenAiSse,
StreamProtocol::OllamaNdjson,
StreamProtocol::GeminiJson,
StreamProtocol::GeminiInteractionsSse,
] {
let dialect = dialect_of(protocol);
let mut body = base_body();
resolve("openai", dialect, DataPosture::StrictestAvailable).write_body(&mut body);
}
}
#[test]
fn the_receipt_serializes_with_the_outcome_spelled_out() {
let mut body = base_body();
let plan = resolve(
"anthropic",
DataControlDialect::AnthropicSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut body);
let json = serde_json::to_value(&plan.receipt).expect("receipt serializes");
assert_eq!(json["outcome"], json!("no_control_available"));
assert_eq!(json["requested_posture"], json!("strictest_available"));
assert_eq!(json["control_scope"], json!("account"));
}
#[test]
fn a_declared_control_overwrites_a_conflicting_caller_value() {
let mut body = base_body();
body["store"] = json!(true);
let plan = resolve(
"openai",
DataControlDialect::OpenAiSse,
DataPosture::StrictestAvailable,
);
plan.write_body(&mut body);
assert_eq!(body["store"], json!(false));
assert_eq!(plan.receipt.outcome, DataControlsOutcome::Applied);
}
#[test]
fn a_nested_control_replaces_a_non_object_on_its_path() {
let mut body = base_body();
body["provider"] = json!("openai");
resolve(
"openrouter",
DataControlDialect::OpenAiSse,
DataPosture::StrictestAvailable,
)
.write_body(&mut body);
assert_eq!(body["provider"]["zdr"], json!(true));
}