#![allow(dead_code)]
#![allow(unused_variables)]
use server_less::openrpc;
#[derive(Clone)]
struct Calculator;
#[openrpc(title = "Calculator API", version = "2.0.0")]
impl Calculator {
pub fn add(&self, a: i32, b: i32) -> i32 {
a + b
}
pub fn subtract(&self, a: i32, b: i32) -> i32 {
a - b
}
pub fn echo(&self, message: String) -> String {
message
}
pub fn is_ready(&self) -> bool {
true
}
}
#[test]
fn test_openrpc_spec_structure() {
let spec = Calculator::openrpc_spec();
assert_eq!(spec["openrpc"], "1.0.0");
assert_eq!(spec["info"]["title"], "Calculator API");
assert_eq!(spec["info"]["version"], "2.0.0");
assert!(spec["methods"].is_array());
}
#[test]
fn test_openrpc_methods_present() {
let spec = Calculator::openrpc_spec();
let methods = spec["methods"].as_array().unwrap();
let method_names: Vec<&str> = methods.iter().filter_map(|m| m["name"].as_str()).collect();
assert!(method_names.contains(&"add"));
assert!(method_names.contains(&"subtract"));
assert!(method_names.contains(&"echo"));
assert!(method_names.contains(&"isReady")); }
#[test]
fn test_openrpc_method_params() {
let spec = Calculator::openrpc_spec();
let methods = spec["methods"].as_array().unwrap();
let add_method = methods.iter().find(|m| m["name"] == "add").unwrap();
let params = add_method["params"].as_array().unwrap();
assert_eq!(params.len(), 2);
assert_eq!(params[0]["name"], "a");
assert_eq!(params[1]["name"], "b");
assert_eq!(params[0]["schema"]["type"], "integer");
}
#[test]
fn test_openrpc_method_result() {
let spec = Calculator::openrpc_spec();
let methods = spec["methods"].as_array().unwrap();
let echo_method = methods.iter().find(|m| m["name"] == "echo").unwrap();
assert_eq!(echo_method["result"]["schema"]["type"], "string");
let ready_method = methods.iter().find(|m| m["name"] == "isReady").unwrap();
assert_eq!(ready_method["result"]["schema"]["type"], "boolean");
}
#[test]
fn test_openrpc_method_description() {
let spec = Calculator::openrpc_spec();
let methods = spec["methods"].as_array().unwrap();
let add_method = methods.iter().find(|m| m["name"] == "add").unwrap();
assert_eq!(add_method["description"], "Add two numbers together");
}
#[test]
fn test_openrpc_json_output() {
let json = Calculator::openrpc_json();
assert!(json.contains("\"openrpc\""));
assert!(json.contains("Calculator API"));
assert!(json.contains("\"methods\""));
}
#[derive(Clone)]
struct SimpleService;
#[openrpc]
impl SimpleService {
pub fn ping(&self) -> String {
"pong".to_string()
}
}
#[test]
fn test_openrpc_defaults() {
let spec = SimpleService::openrpc_spec();
assert_eq!(spec["info"]["title"], "SimpleService");
assert_eq!(spec["info"]["version"], "1.0.0");
}
#[derive(Clone)]
struct OptionalService;
#[openrpc]
impl OptionalService {
pub fn search(&self, query: String, limit: Option<i32>) -> Vec<String> {
vec![]
}
}
#[test]
fn test_openrpc_optional_params() {
let spec = OptionalService::openrpc_spec();
let methods = spec["methods"].as_array().unwrap();
let search = methods.iter().find(|m| m["name"] == "search").unwrap();
let params = search["params"].as_array().unwrap();
assert_eq!(params[0]["required"], true);
assert_eq!(params[1]["required"], false);
}
#[derive(Clone)]
struct CombinedService;
#[server_less::jsonrpc]
#[openrpc(title = "Combined Service")]
impl CombinedService {
pub fn greet(&self, name: String) -> String {
format!("Hello, {}!", name)
}
}
#[test]
fn test_openrpc_with_jsonrpc() {
let spec = CombinedService::openrpc_spec();
assert_eq!(spec["info"]["title"], "Combined Service");
let methods = CombinedService::jsonrpc_methods();
assert!(methods.contains(&"greet".to_string()));
}