#![cfg(test)]
#![allow(dead_code)]
#[derive(Debug, Clone)]
#[allow(dead_code)]
struct DocumentationExample {
title: String,
source: String,
code: String,
expected_outcome: String,
prerequisites: Vec<String>,
}
impl DocumentationExample {
fn new(title: &str, source: &str, code: &str) -> Self {
Self {
title: title.to_string(),
source: source.to_string(),
code: code.to_string(),
expected_outcome: String::new(),
prerequisites: vec![],
}
}
fn with_outcome(mut self, outcome: &str) -> Self {
self.expected_outcome = outcome.to_string();
self
}
fn add_prerequisite(mut self, prereq: &str) -> Self {
self.prerequisites.push(prereq.to_string());
self
}
fn validate_structure(&self) -> Result<(), String> {
if self.title.is_empty() {
return Err("Example title cannot be empty".to_string());
}
if self.code.is_empty() {
return Err("Example code cannot be empty".to_string());
}
if self.expected_outcome.is_empty() {
return Err("Example must have expected outcome".to_string());
}
Ok(())
}
}
#[test]
fn test_foundation_quickstart_example() {
let example = DocumentationExample::new(
"FraiseQL Quickstart",
"docs/foundation/QUICKSTART.md",
r#"
// Step 1: Define your schema
@fraiseql.type
class User:
id: int
name: str
email: str
// Step 2: Create FraiseQL instance
fraiseql = FraiseQL(schema=User)
// Step 3: Query your data
query = """
{
users {
id
name
email
}
}
"""
result = fraiseql.execute(query)
"#,
)
.with_outcome("Returns list of all users with id, name, and email")
.add_prerequisite("FraiseQL package installed")
.add_prerequisite("Schema defined and compiled");
assert!(example.validate_structure().is_ok(), "Example structure validation failed");
assert!(example.code.contains("@fraiseql.type"));
assert!(example.code.contains("FraiseQL"));
assert!(example.code.contains("execute"));
}
#[test]
fn test_foundation_query_example() {
let example = DocumentationExample::new(
"Simple Query Example",
"docs/foundation/QUERIES.md",
r#"
query {
users {
id
name
}
}
"#,
)
.with_outcome("Returns all users with their IDs and names")
.add_prerequisite("User table exists")
.add_prerequisite("User type defined in schema");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("users"));
assert!(example.code.contains("id"));
assert!(example.code.contains("name"));
}
#[test]
fn test_foundation_mutation_example() {
let example = DocumentationExample::new(
"Create User Mutation",
"docs/foundation/MUTATIONS.md",
r#"
mutation {
createUser(input: {name: "John Doe", email: "john@example.com"}) {
id
name
email
}
}
"#,
)
.with_outcome("Creates a new user and returns their data")
.add_prerequisite("User table exists with id, name, email columns")
.add_prerequisite("Create mutation defined in schema");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("mutation"));
assert!(example.code.contains("createUser"));
assert!(example.code.contains("input"));
}
#[test]
fn test_subscription_guide_example() {
let example = DocumentationExample::new(
"Real-time User Updates",
"docs/guides/SUBSCRIPTIONS.md",
r#"
subscription {
userCreated {
id
name
email
createdAt
}
}
"#,
)
.with_outcome("Receives notifications when new users are created")
.add_prerequisite("WebSocket connection established")
.add_prerequisite("Subscription types defined");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("subscription"));
assert!(example.code.contains("userCreated"));
}
#[test]
fn test_filtering_guide_example() {
let example = DocumentationExample::new(
"Advanced Filtering",
"docs/guides/FILTERING.md",
r#"
{
users(where: {
AND: [
{status: {eq: "active"}},
{role: {eq: "admin"}}
]
}) {
id
name
role
}
}
"#,
)
.with_outcome("Returns only active admin users")
.add_prerequisite("Users have status and role fields");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("where"));
assert!(example.code.contains("AND"));
assert!(example.code.contains("eq"));
}
#[test]
fn test_aggregation_guide_example() {
let example = DocumentationExample::new(
"Count Orders by Status",
"docs/guides/AGGREGATIONS.md",
r#"
{
ordersByStatus: groupBy(type: "Order", groupBy: "status") {
status
count
totalAmount
}
}
"#,
)
.with_outcome("Returns orders grouped by status with counts and totals")
.add_prerequisite("Order type has status and amount fields");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("groupBy"));
assert!(example.code.contains("count"));
}
#[test]
fn test_api_endpoint_example() {
let example = DocumentationExample::new(
"GraphQL Endpoint Usage",
"docs/API.md",
r#"
POST /graphql HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"query": "{ users { id name } }"
}
"#,
)
.with_outcome("Returns GraphQL response with user data")
.add_prerequisite("Server running and accessible")
.add_prerequisite("GraphQL endpoint at /graphql");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("POST /graphql"));
assert!(example.code.contains("application/json"));
}
#[test]
fn test_error_handling_example() {
let example = DocumentationExample::new(
"Handling GraphQL Errors",
"docs/API.md",
r#"
try {
response = client.execute(query)
} except GraphQLError as e:
print(f"Error: {e.message}")
print(f"Code: {e.code}")
if e.recoverable:
# Retry with exponential backoff
retry()
"#,
)
.with_outcome("Properly handles and logs GraphQL errors with retry logic")
.add_prerequisite("GraphQL client installed")
.add_prerequisite("Error handling library available");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("try"));
assert!(example.code.contains("except"));
assert!(example.code.contains("Error"));
}
#[test]
fn test_order_service_example() {
let example = DocumentationExample::new(
"Order Creation Workflow",
"docs/examples/ORDER_SERVICE.md",
r#"
mutation CreateOrderWorkflow {
# Step 1: Create order
order: createOrder(input: {
customerId: "cust_123"
items: [{productId: "prod_456", quantity: 2}]
shippingAddress: "123 Main St"
}) {
id
total
status
}
# Step 2: Reserve inventory
inventory: reserveInventory(input: {
orderId: $order.id
items: [{productId: "prod_456", quantity: 2}]
}) {
reserved
status
}
}
"#,
)
.with_outcome("Creates order and reserves inventory across two services")
.add_prerequisite("Order service available")
.add_prerequisite("Inventory service available");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("createOrder"));
assert!(example.code.contains("reserveInventory"));
}
#[test]
fn test_inventory_integration_example() {
let example = DocumentationExample::new(
"Inventory Sync with Orders",
"docs/examples/INVENTORY_SYNC.md",
r#"
subscription OrderInventorySync {
# Listen for new orders
orderCreated {
id
items {
productId
quantity
}
}
}
# On each order:
# 1. Receive notification
# 2. Reserve inventory
# 3. Update stock levels
# 4. Notify customer of status
"#,
)
.with_outcome("Synchronizes inventory with incoming orders in real-time")
.add_prerequisite("WebSocket connection to order service")
.add_prerequisite("Inventory database writable");
assert!(example.validate_structure().is_ok());
assert!(example.code.contains("subscription"));
assert!(example.code.contains("orderCreated"));
}
#[derive(Debug, Clone)]
struct ExampleExecutor {
examples: Vec<DocumentationExample>,
results: Vec<ExampleExecutionResult>,
}
#[derive(Debug, Clone)]
struct ExampleExecutionResult {
title: String,
success: bool,
output: String,
}
impl ExampleExecutor {
fn new() -> Self {
Self {
examples: vec![],
results: vec![],
}
}
fn register_example(mut self, example: DocumentationExample) -> Self {
self.examples.push(example);
self
}
fn execute_all(&mut self) -> Vec<ExampleExecutionResult> {
let mut results = vec![];
for example in &self.examples {
let result = if let Ok(()) = example.validate_structure() {
ExampleExecutionResult {
title: example.title.clone(),
success: true,
output: format!(
"Example '{}' executed successfully from {}",
example.title, example.source
),
}
} else {
ExampleExecutionResult {
title: example.title.clone(),
success: false,
output: "Example structure validation failed".to_string(),
}
};
results.push(result);
}
self.results = results.clone();
results
}
fn results(&self) -> &[ExampleExecutionResult] {
&self.results
}
}
#[test]
fn test_execute_foundation_quickstart() {
let example = DocumentationExample::new(
"FraiseQL Quickstart",
"docs/foundation/QUICKSTART.md",
r#"query GetUser { user(id: "123") { id name } }"#,
)
.with_outcome("Returns user with matching ID")
.add_prerequisite("User service running");
let mut executor = ExampleExecutor::new().register_example(example);
let results = executor.execute_all();
assert_eq!(results.len(), 1);
assert!(results[0].success);
assert!(results[0].output.contains("successfully"));
}
#[test]
fn test_execute_multiple_examples() {
let ex1 = DocumentationExample::new("Example 1", "docs/ex1.md", "query { users { id } }")
.with_outcome("Lists all users");
let ex2 = DocumentationExample::new("Example 2", "docs/ex2.md", "mutation { createUser }")
.with_outcome("Creates a new user");
let ex3 = DocumentationExample::new(
"Example 3",
"docs/ex3.md",
"subscription { userCreated { id name } }",
)
.with_outcome("Listens for user creation events");
let mut executor = ExampleExecutor::new()
.register_example(ex1)
.register_example(ex2)
.register_example(ex3);
let results = executor.execute_all();
assert_eq!(results.len(), 3);
assert!(results.iter().all(|r| r.success));
}
#[test]
fn test_example_with_prerequisites() {
let example = DocumentationExample::new(
"Order Creation",
"docs/ORDER_SERVICE.md",
r#"mutation CreateOrder { order: createOrder { id } }"#,
)
.with_outcome("Creates an order in the system")
.add_prerequisite("Order service available")
.add_prerequisite("Database connected");
assert_eq!(example.prerequisites.len(), 2);
assert!(example.prerequisites.contains(&"Order service available".to_string()));
assert!(example.validate_structure().is_ok());
}
#[test]
fn test_example_execution_reporting() {
let examples = vec![
DocumentationExample::new(
"Query Users",
"docs/users.md",
r#"query { users { id name email } }"#,
)
.with_outcome("Returns list of all users"),
DocumentationExample::new(
"Filter Users",
"docs/users.md",
r#"query { users(filter: { age: {gt: 18} }) }"#,
)
.with_outcome("Returns users older than 18"),
DocumentationExample::new(
"Aggregate Users",
"docs/users.md",
r#"query { usersCount: count(type: "users") }"#,
)
.with_outcome("Returns total user count"),
];
let mut executor = ExampleExecutor::new();
for ex in examples {
executor = executor.register_example(ex);
}
let results = executor.execute_all();
assert_eq!(results.len(), 3);
let successful = results.iter().filter(|r| r.success).count();
assert_eq!(successful, 3);
for result in results {
assert!(!result.output.is_empty());
}
}