#![cfg(test)]
use super::parse_schema;
#[test]
fn type_vs_same_named_type_builder_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Foo {
value String
}
type FooBuilder {
other String
}
model User {
id Int @id
name String
}
"#,
)
.expect_err("type `FooBuilder` collides with the builder generated for type `Foo`");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(message.contains("FooBuilder"), "error: {message}");
assert!(message.contains("Foo"), "error: {message}");
}
#[test]
fn model_vs_type_builder_cross_module_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Order {
total Int
}
model OrderBuilder {
id Int @id
label String
}
"#,
)
.expect_err("model `OrderBuilder` collides with the builder generated for type `Order`");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(message.contains("OrderBuilder"), "error: {message}");
}
#[test]
fn view_vs_model_builder_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
model Widget {
id Int @id
name String
}
view WidgetBuilder from Widget {
id Int @from(Widget.id)
name String @from(Widget.name)
}
"#,
)
.expect_err("view `WidgetBuilder` collides with the builder generated for model `Widget`");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(message.contains("WidgetBuilder"), "error: {message}");
}
#[test]
fn enum_named_like_a_builder_is_rejected_as_target() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Status {
label String
}
enum StatusBuilder {
ACTIVE
}
model User {
id Int @id
name String
}
"#,
)
.expect_err("enum `StatusBuilder` collides with the builder generated for type `Status`");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(message.contains("StatusBuilder"), "error: {message}");
}
#[test]
fn model_build_and_set_build_fields_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
model Thing {
id Int @id
build String
set_build String
}
"#,
)
.expect_err("`build` + `set_build` fields on the same model must be rejected");
let message = err.to_string();
assert!(message.contains("build"), "error: {message}");
assert!(message.contains("set_build"), "error: {message}");
}
#[test]
fn type_build_and_set_build_fields_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Thing {
build String
set_build String
}
model User {
id Int @id
name String
}
"#,
)
.expect_err("`build` + `set_build` fields on the same type must be rejected");
let message = err.to_string();
assert!(message.contains("build"), "error: {message}");
assert!(message.contains("set_build"), "error: {message}");
}
#[test]
fn procedure_build_and_set_build_args_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Ack {
ok Boolean
}
procedure doThing(build: String, set_build: String): Ack
"#,
)
.expect_err("`build` + `set_build` procedure args must be rejected");
let message = err.to_string();
assert!(message.contains("build"), "error: {message}");
assert!(message.contains("set_build"), "error: {message}");
}
#[test]
fn model_build_field_alone_is_allowed() {
parse_schema(
r#"
datasource db {
provider = "postgresql"
}
model Thing {
id Int @id
build String
}
"#,
)
.expect("a lone `build` field is fine — the rename has nothing to collide with");
}
#[test]
fn model_find_many_input_rust_spelling_collision_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
model Widget {
id Int @id
name String
}
type WidgetFindManyInputBuilder {
label String
}
"#,
)
.expect_err(
"type `WidgetFindManyInputBuilder` collides with the Rust `{Model}FindManyInput` builder",
);
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(
message.contains("WidgetFindManyInputBuilder"),
"error: {message}"
);
}
#[test]
fn model_find_many_dart_spelling_collision_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
model Widget {
id Int @id
name String
}
type WidgetFindManyBuilder {
label String
}
"#,
)
.expect_err("type `WidgetFindManyBuilder` collides with the Dart `{Model}FindMany` builder");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(
message.contains("WidgetFindManyBuilder"),
"error: {message}"
);
}
#[test]
fn procedure_args_builder_collision_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Ack {
ok Boolean
}
type EchoNameArgsBuilder {
label String
}
procedure echoName(name: String): Ack
"#,
)
.expect_err("type `EchoNameArgsBuilder` collides with the Dart `{Proc}Args` builder");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(message.contains("EchoNameArgsBuilder"), "error: {message}");
}
#[test]
fn procedure_args_builder_camel_case_name_collision_rejected() {
let err = parse_schema(
r#"
datasource db {
provider = "postgresql"
}
type Ack {
ok Boolean
}
type FetchUserProfileArgsBuilder {
label String
}
procedure fetch_user_profile(id: String): Ack
"#,
)
.expect_err("type `FetchUserProfileArgsBuilder` collides with the Dart args builder");
let message = err.to_string();
assert!(message.contains("collides with"), "error: {message}");
assert!(
message.contains("FetchUserProfileArgsBuilder"),
"error: {message}"
);
}
#[test]
fn unrelated_builder_suffixed_name_is_allowed() {
parse_schema(
r#"
datasource db {
provider = "postgresql"
}
model QueryBuilder {
id Int @id
name String
}
"#,
)
.expect("no colliding `Query` declaration exists — must not be rejected");
}