use super::*;
use crate::hir::{
Annotation, AnnotationParams, OpDcl, OpTypeSpec, ParamDcl, ParameterDcls, SimpleDeclarator,
StringType, TypeSpec,
};
use crate::rest_hir::HttpMethod;
fn builtin(name: &str, raw: &str) -> Annotation {
Annotation::Builtin {
name: name.to_string(),
params: Some(AnnotationParams::Raw(raw.to_string())),
}
}
fn param(name: &str, annotations: Vec<Annotation>) -> ParamDcl {
ParamDcl {
annotations,
attr: None,
ty: TypeSpec::StringType(StringType { bound: None }),
declarator: SimpleDeclarator(name.to_string()),
}
}
#[test]
fn project_params_infers_kinds_and_tracks_bindings() {
let op = OpDcl {
annotations: Vec::new(),
ty: OpTypeSpec::Void,
ident: "get_city".to_string(),
parameter: Some(ParameterDcls(vec![
param(
"id",
vec![
builtin("path", ""),
Annotation::Rename {
name: "cityId".to_string(),
},
],
),
param(
"region",
vec![
builtin("query", ""),
Annotation::Rename {
name: "r".to_string(),
},
],
),
param("payload", vec![builtin("flatten", "")]),
])),
raises: None,
};
let routes = [super::super::HttpRoute {
path: "/{cityId}".into(),
path_params: vec!["cityId".into()],
query_params: vec!["r".into()],
}];
let sources = ParameterSources::new(HttpMethod::Post, None, &routes);
let (request, response, path_counts, query_counts) =
project_params(&op, &sources).expect("project params");
assert!(response.is_empty());
assert_eq!(request[0].kind, HttpParamKind::Path);
assert_eq!(request[1].kind, HttpParamKind::Query);
assert_eq!(request[2].kind, HttpParamKind::Body);
assert!(request[2].flatten);
assert_eq!(path_counts.get("cityId"), Some(&1));
assert_eq!(query_counts.get("r"), Some(&1));
}