use apollo_configuration::configuration;
use apollo_configuration::parse_yaml;
use apollo_configuration::types::{MetadataKey, MetadataValue};
use serde::{Deserialize, Serialize};
#[configuration]
struct GrpcConfig {
#[config(required)]
metadata_key: MetadataKey,
#[config(required)]
metadata_value: MetadataValue,
}
#[test]
fn grpc_types_parse() {
let config: GrpcConfig = parse_yaml(
r#"
metadata_key: x-custom-header
metadata_value: some-value
"#,
&Default::default(),
)
.unwrap();
assert_eq!(config.metadata_key.as_str(), "x-custom-header");
assert_eq!(config.metadata_value.to_str().unwrap(), "some-value");
}
#[test]
fn metadata_key_error_message() {
#[configuration]
struct MetadataKeyOnly {
#[config(required)]
key: MetadataKey,
}
let result = parse_yaml::<MetadataKeyOnly>("key: \"invalid key\"", &Default::default());
let err = result.expect_err("should fail to parse invalid metadata key");
assert_eq!(
format!("{err}"),
"failed to parse value: invalid gRPC metadata key name"
);
}
#[test]
fn metadata_value_error_message() {
#[configuration]
struct MetadataValueOnly {
#[config(required)]
value: MetadataValue,
}
let result =
parse_yaml::<MetadataValueOnly>("value: \"invalid\\x00value\"", &Default::default());
let err = result.expect_err("should fail to parse invalid metadata value");
assert_eq!(
format!("{err}"),
"failed to parse value: failed to parse metadata value"
);
}
#[derive(Debug, Deserialize, Serialize)]
struct SerializableGrpcConfig {
metadata_key: MetadataKey,
metadata_value: MetadataValue,
}
#[test]
fn grpc_types_serialize() {
let config: SerializableGrpcConfig = serde_yaml::from_str(
r#"
metadata_key: x-custom-header
metadata_value: some-value
"#,
)
.unwrap();
let yaml = serde_yaml::to_string(&config).unwrap();
insta::assert_snapshot!(yaml, @r"
metadata_key: x-custom-header
metadata_value: some-value
");
}