#![allow(clippy::unwrap_used)]
use fraiseql_core::federation::types::{FederatedType, FederationMetadata, KeyDirective};
#[test]
fn test_federation_postgres_to_postgres() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: true, external_fields: vec!["user_id".to_string()],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
let user_type = metadata.types.iter().find(|t| t.name == "User").unwrap();
assert!(!user_type.is_extends);
let order_type = metadata.types.iter().find(|t| t.name == "Order").unwrap();
assert!(order_type.is_extends);
}
#[test]
fn test_federation_postgres_to_mysql() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false, external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false, external_fields: vec![],
shareable_fields: vec!["user_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 2);
assert!(metadata.types.iter().all(|t| !t.is_extends));
}
#[test]
fn test_federation_postgres_to_sqlserver() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "Product".to_string(),
keys: vec![KeyDirective {
fields: vec!["sku".to_string()],
resolvable: true,
}],
is_extends: false, external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
let product_type = metadata.types.iter().find(|t| t.name == "Product").unwrap();
assert_eq!(product_type.keys[0].fields[0], "sku");
}
#[test]
fn test_federation_three_database_chain() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["user_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Product".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["order_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 3);
let names: Vec<&str> = metadata.types.iter().map(|t| t.name.as_str()).collect();
assert!(names.contains(&"User"));
assert!(names.contains(&"Order"));
assert!(names.contains(&"Product"));
}
#[test]
fn test_federation_two_subgraph_simple() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["user_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
assert_eq!(metadata.version, "v2");
assert_eq!(metadata.types.len(), 2);
}
#[test]
fn test_federation_three_subgraph_federation() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["user_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Product".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["order_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 3);
assert!(metadata.types.iter().all(|t| !t.is_extends));
}
#[test]
fn test_federation_chain_federation() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: true, external_fields: vec!["user_id".to_string()],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Product".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: true, external_fields: vec!["order_id".to_string()],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 3);
let user_type = metadata.types.iter().find(|t| t.name == "User").unwrap();
assert!(!user_type.is_extends);
let order_type = metadata.types.iter().find(|t| t.name == "Order").unwrap();
assert!(order_type.is_extends);
let product_type = metadata.types.iter().find(|t| t.name == "Product").unwrap();
assert!(product_type.is_extends);
}
#[test]
fn test_federation_multi_tenant_composite_key() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["tenant_id".to_string(), "id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
let order_type = metadata.types.iter().find(|t| t.name == "Order").unwrap();
assert_eq!(order_type.keys[0].fields.len(), 2);
assert_eq!(order_type.keys[0].fields[0], "tenant_id");
assert_eq!(order_type.keys[0].fields[1], "id");
}
#[test]
fn test_federation_multi_tenant_isolation() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["tenant_id".to_string(), "id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Organization".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: true,
external_fields: vec!["tenant_id".to_string()],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
let user_type = metadata.types.iter().find(|t| t.name == "User").unwrap();
assert!(user_type.keys[0].fields.contains(&"tenant_id".to_string()));
}
#[test]
fn test_federation_circular_references_handling() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["posts".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Post".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["author".to_string()], inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 2);
let user_type = metadata.types.iter().find(|t| t.name == "User").unwrap();
assert!(user_type.shareable_fields.contains(&"posts".to_string()));
let post_type = metadata.types.iter().find(|t| t.name == "Post").unwrap();
assert!(post_type.shareable_fields.contains(&"author".to_string()));
}
#[test]
fn test_federation_shared_entity_fields() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["email".to_string(), "name".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "UserProfile".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: true,
external_fields: vec!["id".to_string(), "email".to_string()],
shareable_fields: vec!["bio".to_string(), "avatar".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
let user_type = metadata.types.iter().find(|t| t.name == "User").unwrap();
assert!(!user_type.shareable_fields.is_empty());
}
#[test]
fn test_federation_batching_across_subgraphs() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 2);
}
#[test]
fn test_federation_parallel_subgraph_resolution() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Product".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 3);
}
#[test]
fn test_federation_large_batch_1000_entities() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "Entity".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
}
#[test]
fn test_federation_concurrent_requests() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 1);
}
#[test]
fn test_federation_subgraph_timeout() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "RemoteEntity".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: true,
external_fields: vec!["id".to_string()],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
let remote_type = metadata.types.iter().find(|t| t.name == "RemoteEntity").unwrap();
assert!(remote_type.is_extends);
}
#[test]
fn test_federation_subgraph_partial_failure() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
}
#[test]
fn test_federation_entity_not_found() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.types.len(), 1);
}
#[test]
fn test_federation_invalid_key_format() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
let user_type = metadata.types.iter().find(|t| t.name == "User").unwrap();
assert_eq!(user_type.keys[0].fields.len(), 1);
}
#[test]
fn test_federation_apollo_router_composition() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Order".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec!["user_id".to_string()],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert_eq!(metadata.version, "v2");
assert_eq!(metadata.types.len(), 2);
}
#[test]
fn test_federation_apollo_router_query_planning() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![
FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
FederatedType {
name: "Product".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
},
],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
}
#[test]
fn test_federation_apollo_router_variables() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "Query".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
}
#[test]
fn test_federation_apollo_router_mutations() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "User".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
}
#[test]
fn test_federation_apollo_router_subscriptions() {
let metadata = FederationMetadata {
enabled: true,
version: "v2".to_string(),
types: vec![FederatedType {
name: "Event".to_string(),
keys: vec![KeyDirective {
fields: vec!["id".to_string()],
resolvable: true,
}],
is_extends: false,
external_fields: vec![],
shareable_fields: vec![],
inaccessible_fields: vec![],
field_directives: std::collections::HashMap::new(),
type_shareable: false,
}],
remote_subscription_fields: std::collections::HashMap::new(),
};
assert!(metadata.enabled);
}