pgevolve_core/render/
schema.rs1use crate::ir::schema::Schema;
4use crate::plan::rewrite::sql as rewrite_sql;
5
6#[must_use]
11pub fn render_schema(s: &Schema) -> String {
12 let mut out = rewrite_sql::create_schema(s);
13 out.push('\n');
14 if let Some(comment) = &s.comment {
15 out.push_str(&rewrite_sql::comment_on_schema(
16 &s.name,
17 Some(comment.as_str()),
18 ));
19 out.push('\n');
20 }
21 out
22}
23
24#[cfg(test)]
25mod tests {
26 use super::*;
27 use crate::identifier::Identifier;
28 use crate::ir::schema::Schema;
29
30 fn id(s: &str) -> Identifier {
31 Identifier::from_unquoted(s).unwrap()
32 }
33
34 #[test]
35 fn plain_schema_renders() {
36 let s = Schema::new(id("app"));
37 let sql = render_schema(&s);
38 assert!(sql.contains("CREATE SCHEMA app;"));
39 assert!(!sql.contains("COMMENT"));
40 let r = pg_query::parse(sql.trim());
41 assert!(r.is_ok(), "pg_query rejected: {sql:?}\nerr: {r:?}");
42 }
43
44 #[test]
45 fn schema_with_comment_renders() {
46 let s = Schema {
47 name: id("billing"),
48 comment: Some("billing namespace".into()),
49 owner: None,
50 grants: vec![],
51 };
52 let sql = render_schema(&s);
53 assert!(sql.contains("CREATE SCHEMA billing;"));
54 assert!(sql.contains("COMMENT ON SCHEMA billing IS 'billing namespace';"));
55
56 let r = pg_query::parse(&sql);
57 assert!(r.is_ok(), "pg_query rejected SQL:\n{sql}\nerr: {r:?}");
58 }
59
60 #[test]
61 fn quoted_schema_name_renders() {
62 let s = Schema::new(Identifier::from_quoted("MySchema").unwrap());
64 let sql = render_schema(&s);
65 assert!(
66 sql.contains("\"MySchema\""),
67 "expected quoted name in: {sql}"
68 );
69 let r = pg_query::parse(&sql);
70 assert!(r.is_ok(), "pg_query rejected SQL:\n{sql}\nerr: {r:?}");
71 }
72}