use pushkin_compiler::{compile, CompileError, CompileRequest, Target};
fn request(contract_name: &str, schema_json: &str, target: Target) -> CompileRequest {
CompileRequest {
contract_name: contract_name.to_owned(),
schema_json: schema_json.to_owned(),
target,
epoch: 1,
}
}
#[test]
fn sql_quotes_reserved_word_table_and_column_names() {
let schema = r#"{
"type":"object",
"properties":{
"order":{"type":"string"},
"group":{"type":"string","enum":["a","b"]}
},
"required":["order"],
"additionalProperties":false
}"#;
let sql = compile(&request("user", schema, Target::Sql))
.unwrap()
.content;
assert!(sql.contains("CREATE TABLE \"user\""), "{sql}");
assert!(sql.contains("\"order\" TEXT NOT NULL"), "{sql}");
assert!(sql.contains("\"group\" TEXT"), "{sql}");
assert!(sql.contains("CHECK (\"group\" IN ('a', 'b'))"), "{sql}");
}
#[test]
fn sql_quoting_is_total_over_ordinary_names() {
let schema = r#"{
"type":"object",
"properties":{"name":{"type":"string","maxLength":10}},
"required":["name"],
"additionalProperties":false
}"#;
let sql = compile(&request("profile", schema, Target::Sql))
.unwrap()
.content;
assert!(sql.contains("CREATE TABLE \"profile\""), "{sql}");
assert!(sql.contains("\"name\" VARCHAR(10) NOT NULL"), "{sql}");
}
#[test]
fn required_property_with_default_rejects_naming_both_keywords() {
let schema = r#"{
"type":"object",
"properties":{"role":{"type":"string","default":"member"}},
"required":["role"],
"additionalProperties":false
}"#;
for target in [Target::Zod, Target::Pydantic, Target::Rust, Target::Sql] {
let error = compile(&request("user", schema, target)).unwrap_err();
let message = error.to_string();
assert!(
matches!(error, CompileError::InvalidSchema { .. }),
"{message}"
);
assert!(message.contains("role"), "{message}");
assert!(message.contains("required"), "{message}");
assert!(message.contains("default"), "{message}");
}
}
#[test]
fn optional_property_with_default_still_compiles() {
let schema = r#"{
"type":"object",
"properties":{"role":{"type":"string","default":"member"}},
"required":[],
"additionalProperties":false
}"#;
for target in [Target::Zod, Target::Pydantic, Target::Rust, Target::Sql] {
compile(&request("user", schema, target)).unwrap();
}
}