use openapi_to_rust::test_helpers::*;
use serde_json::json;
#[test]
fn test_content_union_structured() {
let spec = minimal_spec(json!({
"InputMessage": {
"type": "object",
"properties": {
"role": {"type": "string"},
"content": {
"anyOf": [
{"type": "string"},
{
"type": "array",
"items": {"$ref": "#/components/schemas/ContentBlock"}
}
]
}
},
"required": ["role", "content"]
},
"ContentBlock": {
"type": "object",
"properties": {
"type": {"type": "string"},
"text": {"type": "string"}
},
"required": ["type", "text"]
}
}));
let result = test_generation("content_union_structured", spec).expect("Generation failed");
assert!(result.contains("pub struct InputMessage"));
assert!(result.contains("pub struct ContentBlock"));
assert!(result.contains("pub enum InputMessageContent"));
assert!(result.contains("String") || result.contains("InputMessageContentString"));
assert!(result.contains("ContentBlockArray") || result.contains("Array"));
assert!(!result.contains("Input_Message"));
assert!(!result.contains("Content_Block"));
}
#[test]
fn test_underscore_properties_structured() {
let spec = minimal_spec(json!({
"ConfigSchema": {
"type": "object",
"properties": {
"allowed_tools": {
"anyOf": [
{"type": "null"},
{
"type": "array",
"items": {"type": "string"}
}
]
},
"cache_control": {
"anyOf": [
{"type": "null"},
{"type": "string"}
]
}
}
}
}));
let result = test_generation("underscore_props_structured", spec).expect("Generation failed");
assert!(result.contains("pub struct ConfigSchema"));
assert!(
result.contains("ConfigSchemaAllowedTools")
|| result.contains("pub allowed_tools: Option<Vec<String>>")
);
assert!(
result.contains("ConfigSchemaCacheControl")
|| result.contains("pub cache_control: Option<String>")
);
assert!(!result.contains("Config_Schema"));
assert!(!result.contains("Allowed_Tools"));
assert!(!result.contains("Cache_Control"));
}
#[test]
fn test_discriminated_union_structured() {
let spec = minimal_spec(json!({
"Response": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {"const": "success"},
"data": {"type": "string"}
}
},
{
"type": "object",
"properties": {
"type": {"const": "error"},
"message": {"type": "string"}
}
}
],
"discriminator": {
"propertyName": "type"
}
}
}));
let result =
test_generation("discriminated_union_structured", spec).expect("Generation failed");
assert!(result.contains("pub enum Response"));
assert!(result.contains("Success") || result.contains("ResponseSuccess"));
assert!(result.contains("Error") || result.contains("ResponseError"));
}
#[test]
fn test_complex_nested_schema() {
let spec = minimal_spec(json!({
"BetaListResponse_MessageBatch": {
"type": "object",
"properties": {
"last_id": {
"anyOf": [
{"type": "null"},
{"type": "string"}
]
},
"data": {
"type": "array",
"items": {"$ref": "#/components/schemas/MessageBatch"}
}
}
},
"MessageBatch": {
"type": "object",
"properties": {
"id": {"type": "string"},
"status": {"type": "string", "enum": ["pending", "completed", "failed"]}
}
}
}));
let result = test_generation("complex_nested", spec).expect("Generation failed");
assert!(result.contains("pub struct BetaListResponseMessageBatch"));
assert!(result.contains("pub struct MessageBatch"));
assert!(result.contains("pub enum MessageBatchStatus"));
assert!(result.contains("BetaListResponseMessageBatchLastId"));
assert!(!result.contains("Beta_List_Response"));
assert!(!result.contains("Message_Batch"));
assert!(!result.contains("Last_Id"));
}
#[test]
fn test_nullable_fields_structured() {
let spec = minimal_spec(json!({
"User": {
"type": "object",
"properties": {
"id": {"type": "string"},
"name": {"type": "string"},
"email": {
"anyOf": [
{"type": "string"},
{"type": "null"}
]
},
"metadata": {
"anyOf": [
{"type": "object"},
{"type": "null"}
]
}
},
"required": ["id", "name"]
}
}));
let result = test_generation("nullable_fields", spec).expect("Generation failed");
assert!(result.contains("pub struct User"));
assert!(
result.contains("email: Option<UserEmail>") || result.contains("email: Option<String>")
);
assert!(
result.contains("metadata: Option<UserMetadata>")
|| result.contains("metadata: Option<serde_json::Value>")
);
}