use crate::models::authentication::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExternalResourceDefinition {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub endpoint: OneOfEndpointDefinitionOrUri,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct EndpointDefinition {
pub uri: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub authentication: Option<ReferenceableAuthenticationPolicy>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OneOfEndpointDefinitionOrUri {
Endpoint(Box<EndpointDefinition>),
Uri(String),
}
impl Default for OneOfEndpointDefinitionOrUri {
fn default() -> Self {
OneOfEndpointDefinitionOrUri::Uri(String::new())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_endpoint_uri_serialize() {
let endpoint = OneOfEndpointDefinitionOrUri::Uri("http://example.com/{id}".to_string());
let json = serde_json::to_string(&endpoint).unwrap();
assert_eq!(json, r#""http://example.com/{id}""#);
}
#[test]
fn test_endpoint_uri_deserialize() {
let json = r#""http://example.com/api""#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
match endpoint {
OneOfEndpointDefinitionOrUri::Uri(uri) => {
assert_eq!(uri, "http://example.com/api");
}
_ => panic!("Expected Uri variant"),
}
}
#[test]
fn test_endpoint_config_deserialize() {
let json = r#"{
"uri": "http://example.com/{id}",
"authentication": {
"basic": { "username": "admin", "password": "admin" }
}
}"#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
match endpoint {
OneOfEndpointDefinitionOrUri::Endpoint(ep) => {
assert_eq!(ep.uri, "http://example.com/{id}");
assert!(ep.authentication.is_some());
}
_ => panic!("Expected Endpoint variant"),
}
}
#[test]
fn test_endpoint_config_with_oauth2_reference() {
let json = r#"{
"uri": "http://example.com/{id}",
"authentication": {
"oauth2": { "use": "secret" }
}
}"#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
match endpoint {
OneOfEndpointDefinitionOrUri::Endpoint(ep) => {
assert_eq!(ep.uri, "http://example.com/{id}");
assert!(ep.authentication.is_some());
}
_ => panic!("Expected Endpoint variant"),
}
}
#[test]
fn test_endpoint_config_roundtrip() {
let json = r#"{
"uri": "http://example.com/{id}",
"authentication": {
"basic": { "username": "admin", "password": "admin" }
}
}"#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
let serialized = serde_json::to_string(&endpoint).unwrap();
let deserialized: OneOfEndpointDefinitionOrUri = serde_json::from_str(&serialized).unwrap();
assert_eq!(endpoint, deserialized);
}
#[test]
fn test_external_resource_deserialize() {
let json = r#"{
"name": "myResource",
"endpoint": "https://api.example.com/data"
}"#;
let resource: ExternalResourceDefinition = serde_json::from_str(json).unwrap();
assert_eq!(resource.name, Some("myResource".to_string()));
match resource.endpoint {
OneOfEndpointDefinitionOrUri::Uri(uri) => {
assert_eq!(uri, "https://api.example.com/data");
}
_ => panic!("Expected Uri variant"),
}
}
#[test]
fn test_runtime_expression_endpoint() {
let json = r#""${example}""#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
match endpoint {
OneOfEndpointDefinitionOrUri::Uri(expr) => {
assert_eq!(expr, "${example}");
}
_ => panic!("Expected Uri variant for runtime expression"),
}
}
#[test]
fn test_endpoint_uri_template() {
let json = r#""http://example.com/{id}""#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
match endpoint {
OneOfEndpointDefinitionOrUri::Uri(uri) => {
assert_eq!(uri, "http://example.com/{id}");
}
_ => panic!("Expected Uri variant"),
}
}
#[test]
fn test_endpoint_config_with_basic_auth_roundtrip() {
let json = r#"{
"uri": "http://example.com/{id}",
"authentication": {
"basic": {"username": "john", "password": "secret"}
}
}"#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
let serialized = serde_json::to_string(&endpoint).unwrap();
let deserialized: OneOfEndpointDefinitionOrUri = serde_json::from_str(&serialized).unwrap();
assert_eq!(endpoint, deserialized);
}
#[test]
fn test_endpoint_config_with_oauth2_use_roundtrip() {
let json = r#"{
"uri": "http://example.com/{id}",
"authentication": {
"oauth2": {"use": "secret"}
}
}"#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
let serialized = serde_json::to_string(&endpoint).unwrap();
let deserialized: OneOfEndpointDefinitionOrUri = serde_json::from_str(&serialized).unwrap();
assert_eq!(endpoint, deserialized);
}
#[test]
fn test_endpoint_config_with_runtime_expression_uri() {
let json = r#"{
"uri": "${example}",
"authentication": {
"oauth2": {"use": "secret"}
}
}"#;
let endpoint: OneOfEndpointDefinitionOrUri = serde_json::from_str(json).unwrap();
match endpoint {
OneOfEndpointDefinitionOrUri::Endpoint(ep) => {
assert_eq!(ep.uri, "${example}");
assert!(ep.authentication.is_some());
}
_ => panic!("Expected Endpoint variant"),
}
}
#[test]
fn test_endpoint_runtime_expression_roundtrip() {
let endpoint = OneOfEndpointDefinitionOrUri::Uri("${example}".to_string());
let serialized = serde_json::to_string(&endpoint).unwrap();
assert_eq!(serialized, r#""${example}""#);
let deserialized: OneOfEndpointDefinitionOrUri = serde_json::from_str(&serialized).unwrap();
assert_eq!(endpoint, deserialized);
}
#[test]
fn test_external_resource_with_endpoint_config() {
let json = r#"{
"name": "myResource",
"endpoint": {
"uri": "http://example.com/api",
"authentication": {
"basic": {"username": "admin", "password": "admin"}
}
}
}"#;
let resource: ExternalResourceDefinition = serde_json::from_str(json).unwrap();
assert_eq!(resource.name, Some("myResource".to_string()));
match resource.endpoint {
OneOfEndpointDefinitionOrUri::Endpoint(ep) => {
assert_eq!(ep.uri, "http://example.com/api");
assert!(ep.authentication.is_some());
}
_ => panic!("Expected Endpoint variant"),
}
}
#[test]
fn test_endpoint_default() {
let default = OneOfEndpointDefinitionOrUri::default();
match default {
OneOfEndpointDefinitionOrUri::Uri(s) => assert!(s.is_empty()),
_ => panic!("Expected default Uri variant"),
}
}
}