use super::generate_model_axum_routes;
fn parse_first_model(source: &str) -> cratestack_core::Model {
cratestack_parser::parse_schema(source)
.expect("fixture schema should parse and validate")
.models
.remove(0)
}
fn generated_route_literals(model_name: &str) -> (String, String) {
let schema = format!(
r#"
model {model_name} {{
id Int @id
}}
"#
);
let model = parse_first_model(&schema);
let generated = generate_model_axum_routes(&model).to_string();
let literals = generated
.split('"')
.enumerate()
.filter_map(|(index, chunk)| (index % 2 == 1).then_some(chunk))
.collect::<Vec<_>>();
(literals[0].to_owned(), literals[1].to_owned())
}
#[test]
fn plain_pascal_case_name_routes() {
let (list_route, detail_route) = generated_route_literals("UserGroup");
assert_eq!(list_route, "/user_groups");
assert_eq!(detail_route, "/user_groups/{id}");
}
#[test]
fn underscore_containing_name_routes() {
let (list_route, detail_route) = generated_route_literals("User_Group");
assert_eq!(list_route, "/user__groups");
assert_eq!(detail_route, "/user__groups/{id}");
}
#[test]
fn consecutive_uppercase_run_routes() {
let (list_route, detail_route) = generated_route_literals("HTTPServer");
assert_eq!(list_route, "/h_t_t_p_servers");
assert_eq!(detail_route, "/h_t_t_p_servers/{id}");
}
#[test]
fn already_snake_case_name_is_unchanged() {
let (list_route, detail_route) = generated_route_literals("already_snake");
assert_eq!(list_route, "/already_snakes");
assert_eq!(detail_route, "/already_snakes/{id}");
}