#![cfg(test)]
use super::parse_schema;
#[test]
fn rejects_list_arity_scalar_field_on_datasource_backed_model() {
let error = parse_schema(
r#"
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
auth Operator {
id Int
}
model Tagged {
id Int @id
tags String[]
@@allow("read", auth() != null)
@@allow("create", auth() != null)
}
"#,
)
.expect_err("list-arity scalar field on a database-backed model should be rejected by check");
let message = error.to_string();
assert!(
message.contains("Tagged"),
"error should name the model: {message}"
);
assert!(
message.contains("tags"),
"error should name the field: {message}"
);
assert!(
message.contains("String[]"),
"error should name the offending type: {message}",
);
}
#[test]
fn rejects_list_arity_enum_field_on_datasource_backed_model() {
let error = parse_schema(
r#"
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum MyEnum {
first
second
}
model Tagged {
id Int @id
moods MyEnum[]
}
"#,
)
.expect_err("list-arity enum field on a database-backed model should be rejected by check");
let message = error.to_string();
assert!(
message.contains("Tagged"),
"error should name the model: {message}"
);
assert!(
message.contains("moods"),
"error should name the field: {message}"
);
assert!(
message.contains("MyEnum[]"),
"error should name the offending type: {message}",
);
}
#[test]
fn rejects_list_arity_scalar_field_on_sqlite_datasource_backed_model() {
let error = parse_schema(
r#"
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model Tagged {
id Int @id
tags String[]
}
"#,
)
.expect_err("list-arity scalar field on a sqlite-backed model should be rejected by check");
assert!(error.to_string().contains("Tagged"), "error: {error}",);
}
#[test]
fn accepts_list_arity_field_on_client_only_schema_without_datasource() {
parse_schema(
r#"
enum Role {
admin
member
}
model User {
id Int @id
roles Role[]
}
"#,
)
.expect("list-arity field on a schema with no datasource (client-only) should still parse");
}
#[test]
fn accepts_to_many_relation_list_field_on_datasource_backed_model() {
parse_schema(
r#"
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id
sessions Session[] @relation(fields:[id],references:[userId])
}
model Session {
id Int @id
userId Int
}
"#,
)
.expect("a to-many @relation list field should remain accepted");
}