use crate::database::versions::ops::backfill::batch_sql;
use crate::database::versions::ops::model::Migration;
use crate::database::versions::ops::plan;
use crate::database::versions::ops::trigger::{Direction, Trigger};
fn rename() -> Migration {
serde_json::from_str(
r#"{"operations":[{"alter_column":{
"table":"platform_trash_zone_mappings","column":"zone_id",
"name":"trash_zone_id","type":"uuid","nullable":false,
"up":"NEW.zone_id::text::uuid",
"down":"(right(NEW.trash_zone_id::text, 12))::int4"}}]}"#,
)
.expect("should parse")
}
#[test]
fn cursor_keys_are_cast_in_sql() {
let sql = batch_sql("t", &["id".to_string()], 10, None);
assert!(sql.contains(r#""id"::text FROM updated"#));
}
#[test]
fn search_path_is_normalized_before_comparison() {
let sql = Trigger {
table: "t",
physical_column: "c",
direction: Direction::Down,
expression: "NEW.x",
latest_schema: "public_02-rename",
rewrite: None,
}
.install()
.join("\n");
assert!(sql.contains("split_part(current_setting('search_path'), ',', 1)"));
assert!(sql.contains("btrim("));
}
#[test]
fn down_expression_is_rewritten_to_the_physical_column() {
let sql = plan(&rename(), "public_v").statements.join("\n");
assert!(sql.contains(r#"right(NEW."_rustyroad_new_zone_id"::text, 12)"#));
assert!(!sql.contains("NEW.trash_zone_id"));
}
#[test]
fn not_null_survives_a_rename() {
let completion = plan(&rename(), "public_v")
.completion_statements()
.join("\n");
assert!(completion.contains(r#"ALTER COLUMN "trash_zone_id" SET NOT NULL"#));
let rename_at = completion
.find("RENAME COLUMN \"zone_id\"")
.expect("renamed");
let not_null_at = completion.find("SET NOT NULL").expect("constrained");
assert!(rename_at < not_null_at);
}