use super::*;
use super::test_data_factories::*;
use super::test_data_factories::{ constants, scenarios };
use api_openai::exposed::components::responses::{ CreateResponseRequest, ResponseInput };
use api_openai::exposed::components::input::{ InputItem, InputMessage, InputContentPart, InputText, InputImage }; use api_openai::exposed::components::tools::
{
Tool,
ToolChoice,
ToolChoiceFunction,
FunctionTool,
FunctionParameters,
FileSearchTool,
FileSearchRankingOptions,
WebSearchTool,
ComputerTool,
};
use api_openai::exposed::components::common::Metadata;
use serde_json::
{
self,
json,
};
#[ test ]
fn create_request_simple_string_input()
{
let request = CreateResponseRequestFactory::with_simple_string( constants::DEFAULT_MODEL, "Hello!" );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed" );
let json_string = json_result.unwrap();
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ), "Model field should be gpt-4o" );
assert!( json_string.contains( r#""input": "Hello!""# ), "Input field should be Hello!" );
}
#[ test ]
fn create_request_with_optional_params()
{
let request = CreateResponseRequestFactory::with_optional_params(
constants ::DEFAULT_MODEL_MINI,
"Write a poem.",
Some( constants::DEFAULT_TEMPERATURE ),
Some( constants::DEFAULT_TOP_P ),
Some( false )
);
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed" );
let json_string = json_result.unwrap();
assert!( json_string.contains( r#""model": "gpt-5-mini""# ) ); assert!( json_string.contains( r#""input": "Write a poem.""# ) );
assert!( json_string.contains( r#""temperature": 0.8"# ) );
assert!( json_string.contains( r#""top_p": 0.9"# ) );
assert!( json_string.contains( r#""store": false"# ) );
assert!( !json_string.contains( r#""text":"# ) );
assert!( !json_string.contains( r#""metadata":"# ) );
}
#[ test ]
fn create_request_item_input()
{
let message = InputMessageFactory::text_message( "user", "User query" );
let request = CreateResponseRequestFactory::with_message_items( constants::DEFAULT_MODEL, vec![ message ] );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ), "Model field should be gpt-4o" );
assert!( json_string.contains( r#""type": "message""# ), "Should contain message type" );
assert!( json_string.contains( r#""role": "user""# ), "Should contain user role" );
assert!( json_string.contains( r#""type": "input_text""# ), "Should contain input_text type" );
assert!( json_string.contains( r#""text": "User query""# ), "Should contain the query text" );
}
#[ test ]
fn create_request_with_metadata()
{
let request = CreateResponseRequestFactory::with_metadata(
constants ::DEFAULT_MODEL,
"Hello with metadata!",
vec![ ( "user_id", "abc-123" ), ( "session_id", "xyz-789" ) ]
);
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with Metadata:\n{json_string}" );
assert!( json_string.contains( r#""metadata":"# ) );
assert!( json_string.contains( r#""user_id": "abc-123""# ) );
assert!( json_string.contains( r#""session_id": "xyz-789""# ) );
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ) ); assert!( json_string.contains( r#""input": "Hello with metadata!""# ) );
assert!( !json_string.contains( r#""temperature":"# ) );
assert!( !json_string.contains( r#""store":"# ) );
}
#[ test ]
fn create_request_multiple_messages()
{
let request = scenarios::multi_turn_conversation();
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with Multiple Messages:\n{json_string}" );
assert!( json_string.starts_with( '{' ) );
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ) ); assert!( json_string.contains( r#""input": ["# ) );
assert!( json_string.contains( r#""role": "user""# ) );
assert!( json_string.contains( r#""role": "assistant""# ) );
assert!( json_string.contains( r#""text": "Who won the world series in 2020?""# ) );
assert!( json_string.contains( r#""text": "Where was it played?""# ) );
assert!( json_string.contains( r#""type": "message""# ) );
assert!( json_string.contains( r#""type": "input_text""# ) );
}
#[ test ]
fn create_request_with_function_tool()
{
}
#[ test ]
fn create_request_with_file_search_tool()
{
let request = scenarios::file_search( "Search my files for info on project X." );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with File Search Tool:\n{json_string}" );
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ) ); assert!( json_string.contains( r#""input": "Search my files for info on project X.""# ) );
assert!( json_string.contains( r#""tools": ["# ) );
assert!( json_string.contains( r#""type": "file_search""# ) );
assert!( json_string.contains( r#""tool_choice": "auto""# ) );
}
#[ test ]
fn create_request_with_web_search_tool()
{
let request = scenarios::web_search( "What's the latest news?" );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with Web Search Tool:\n{json_string}" );
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ) ); assert!( json_string.contains( r#""input": "What's the latest news?""# ) );
assert!( json_string.contains( r#""tools": ["# ) );
assert!( json_string.contains( r#""type": "web_search_preview""# ) );
assert!( json_string.contains( r#""tool_choice": "auto""# ) );
assert!( !json_string.contains( r#""web_search_preview": {}"# ) );
}
#[ test ]
fn create_request_with_computer_tool()
{
let request = scenarios::computer_use( "Open the calculator app." );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with Computer Use Tool:\n{json_string}" );
assert!( json_string.contains( r#""model": "computer-use-preview""# ) ); assert!( json_string.contains( r#""input": "Open the calculator app.""# ) );
assert!( json_string.contains( r#""tools": ["# ) );
assert!( json_string.contains( r#""type": "computer_use_preview""# ) );
assert!( json_string.contains( r#""display_width": 1920.0"# ) );
assert!( json_string.contains( r#""display_height": 1080.0"# ) );
assert!( json_string.contains( r#""environment": "macos""# ) );
assert!( json_string.contains( r#""tool_choice": "auto""# ) );
}
#[ test ]
fn create_request_tool_choice_none()
{
let tools = vec![ ToolFactory::function_tool( "dummy_func", None ) ];
let tool_choice = Some( ToolChoiceFactory::string_choice( "none" ) );
let request = CreateResponseRequestFactory::with_tools( constants::DEFAULT_MODEL, "Just chat.", tools, tool_choice );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with tool_choice=none:\n{json_string}" );
assert!( json_string.contains( r#""tool_choice": "none""# ) );
assert!( json_string.contains( r#""tools":"# ) );
}
#[ test ]
fn create_request_tool_choice_auto()
{
let tools = vec![ ToolFactory::function_tool( "dummy_func", None ) ];
let tool_choice = Some( ToolChoiceFactory::string_choice( "auto" ) );
let request = CreateResponseRequestFactory::with_tools( constants::DEFAULT_MODEL, "Maybe use a tool?", tools, tool_choice );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with tool_choice=auto:\n{json_string}" );
assert!( json_string.contains( r#""tool_choice": "auto""# ) );
assert!( json_string.contains( r#""tools":"# ) );
}
#[ test ]
fn create_request_tool_choice_required()
{
let tools = vec![ ToolFactory::function_tool( "dummy_func", None ) ];
let tool_choice = Some( ToolChoiceFactory::string_choice( "required" ) );
let request = CreateResponseRequestFactory::with_tools( constants::DEFAULT_MODEL, "Must use a tool!", tools, tool_choice );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with tool_choice=required:\n{json_string}" );
assert!( json_string.contains( r#""tool_choice": "required""# ) );
assert!( json_string.contains( r#""tools":"# ) );
}
#[ test ]
fn create_request_with_image_input()
{
let request = scenarios::multimodal_with_image( "What is in this image?" );
let json_result = serde_json::to_string_pretty( &request );
assert!( json_result.is_ok(), "Serialization failed : {:?}", json_result.err() );
let json_string = json_result.unwrap();
println!( "Serialized JSON with Image Input:\n{json_string}" );
assert!( json_string.contains( r#""model": "gpt-5.1-chat-latest""# ) ); assert!( json_string.contains( r#""input": ["# ) );
assert!( json_string.contains( r#""role": "user""# ) );
assert!( json_string.contains( r#""content": ["# ) );
assert!( json_string.contains( r#""type": "input_text""# ) );
assert!( json_string.contains( r#""text": "What is in this image?""# ) );
assert!( json_string.contains( r#""type": "input_image""# ) );
assert!( json_string.contains( r#""image_url": "https:// example.com/image.jpg""# ) );
assert!( json_string.contains( r#""detail": "high""# ) );
assert!( !json_string.contains( r#""file_id":"# ) );
}