#![allow(clippy::unwrap_used)]
use fraiseql_core::{security::SecurityContext, types::TenantId};
use serde_json::json;
use super::{SOURCE_TENANT_VAR, resolve_identity, split_tenant_override};
fn base(tenant: Option<&str>) -> SecurityContext {
SecurityContext::system_job(
"orders",
"fire-1",
vec!["ingest_writer".to_string()],
vec!["write:order".to_string()],
tenant.map(TenantId::from),
)
}
#[test]
fn multi_tenant_source_scopes_to_the_per_message_tenant() {
let ctx = resolve_identity(&base(None), Some("acme"));
assert_eq!(ctx.tenant_id.as_ref().map(TenantId::as_str), Some("acme"));
assert!(ctx.has_role("ingest_writer"));
assert!(ctx.has_scope("write:order"));
}
#[test]
fn pinned_source_ignores_a_tenant_override() {
let ctx = resolve_identity(&base(Some("corp")), Some("acme"));
assert_eq!(ctx.tenant_id.as_ref().map(TenantId::as_str), Some("corp"));
}
#[test]
fn global_source_without_override_stays_global() {
let ctx = resolve_identity(&base(None), None);
assert!(ctx.tenant_id.is_none());
assert!(ctx.has_role("ingest_writer"));
}
#[test]
fn split_extracts_and_strips_the_reserved_tenant() {
let vars = json!({ SOURCE_TENANT_VAR: "acme", "id": 1 });
let (cleaned, tenant) = split_tenant_override(Some(&vars));
assert_eq!(tenant.as_deref(), Some("acme"));
let cleaned = cleaned.unwrap();
assert!(cleaned.get(SOURCE_TENANT_VAR).is_none());
assert_eq!(cleaned.get("id"), Some(&json!(1)));
}
#[test]
fn split_passes_variables_through_untouched_when_absent() {
let vars = json!({ "id": 1 });
let (cleaned, tenant) = split_tenant_override(Some(&vars));
assert!(tenant.is_none());
assert_eq!(cleaned, Some(json!({ "id": 1 })));
let (cleaned, tenant) = split_tenant_override(None);
assert!(cleaned.is_none());
assert!(tenant.is_none());
}
#[test]
fn split_strips_a_blank_tenant_without_scoping() {
let vars = json!({ SOURCE_TENANT_VAR: " ", "id": 1 });
let (cleaned, tenant) = split_tenant_override(Some(&vars));
assert!(tenant.is_none(), "a blank tenant scopes nothing");
assert!(cleaned.unwrap().get(SOURCE_TENANT_VAR).is_none(), "but the key is stripped");
}