#![cfg(test)]
use super::parse_schema;
const DATASOURCE: &str = r#"
datasource db {
provider = "postgresql"
}
"#;
fn expect_rejected(schema: &str, expected_name: &str) {
let err = parse_schema(&format!("{DATASOURCE}{schema}"))
.expect_err("collision must be rejected at parse time");
let message = err.to_string();
assert!(
message.contains("collides with"),
"expected a collision diagnostic, got: {message}"
);
assert!(
message.contains(expected_name),
"diagnostic must name `{expected_name}`, got: {message}"
);
}
#[test]
fn derived_create_input_builder_name_rejected() {
expect_rejected(
r#"
model Task {
id Int @id
name String
}
type CreateTaskInputBuilder {
other String
}
"#,
"CreateTaskInputBuilder",
);
}
#[test]
fn dart_spelling_find_many_builder_name_rejected() {
expect_rejected(
r#"
model Widget {
id Int @id
name String
}
type WidgetFindManyBuilder {
label String
}
"#,
"WidgetFindManyBuilder",
);
}
#[test]
fn procedure_args_fallback_builder_name_rejected() {
expect_rejected(
r#"
model Widget {
id Int @id
name String
}
type EchoNameArgs {
x String
}
type EchoNameProcedureArgsBuilder {
label String
}
procedure echoName(name: String): Widget
"#,
"EchoNameProcedureArgsBuilder",
);
}
#[test]
fn procedure_named_like_a_model_builder_is_accepted() {
let schema = format!(
"{DATASOURCE}{}",
r#"
model Widget {
id Int @id
name String
}
procedure WidgetBuilder(name: String): Widget
"#
);
assert!(
parse_schema(&schema).is_ok(),
"a procedure named `WidgetBuilder` generates `WidgetBuilderArgs`, not `WidgetBuilder`, \
so it does not collide with the builder for `model Widget` and must be accepted"
);
}
#[test]
fn camel_case_set_build_field_rejected_alongside_build() {
expect_rejected(
r#"
model Gizmo {
id Int @id
build String
setBuild String
}
"#,
"setBuild",
);
}