/
lib.rs
112 lines (98 loc) · 2.72 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use pgx::*;
pg_module_magic!();
#[pg_extern(immutable, strict)]
fn json_matches_schema(schema: Json, instance: Json) -> bool {
jsonschema::is_valid(&schema.0, &instance.0)
}
#[pg_extern(immutable, strict)]
fn jsonb_matches_schema(schema: Json, instance: JsonB) -> bool {
jsonschema::is_valid(&schema.0, &instance.0)
}
#[pg_schema]
#[cfg(any(test, feature = "pg_test"))]
mod tests {
use pgx::*;
use serde_json::json;
#[pg_test]
fn test_json_matches_schema_rs() {
let max_length: i32 = 5;
assert!(crate::json_matches_schema(
Json(json!({ "maxLength": max_length })),
Json(json!("foo")),
));
}
#[pg_test]
fn test_json_not_matches_schema_rs() {
let max_length: i32 = 5;
assert!(!crate::json_matches_schema(
Json(json!({ "maxLength": max_length })),
Json(json!("foobar")),
));
}
#[pg_test]
fn test_jsonb_matches_schema_rs() {
let max_length: i32 = 5;
assert!(crate::jsonb_matches_schema(
Json(json!({ "maxLength": max_length })),
JsonB(json!("foo")),
));
}
#[pg_test]
fn test_jsonb_not_matches_schema_rs() {
let max_length: i32 = 5;
assert!(!crate::jsonb_matches_schema(
Json(json!({ "maxLength": max_length })),
JsonB(json!("foobar")),
));
}
#[pg_test]
fn test_json_matches_schema_spi() {
let result = Spi::get_one::<bool>(
r#"
select json_matches_schema('{"type": "object"}', '{}')
"#,
)
.unwrap();
assert_eq!(result, false);
}
#[pg_test]
fn test_json_not_matches_schema_spi() {
let result = Spi::get_one::<bool>(
r#"
select json_matches_schema('{"type": "object"}', '1')
"#,
)
.unwrap();
assert_eq!(result, false);
}
#[pg_test]
fn test_jsonb_matches_schema_spi() {
let result = Spi::get_one::<bool>(
r#"
select json_matches_schema('{"type": "object"}', '{}')
"#,
)
.unwrap();
assert_eq!(result, false);
}
#[pg_test]
fn test_jsonb_not_matches_schema_spi() {
let result = Spi::get_one::<bool>(
r#"
select json_matches_schema('{"type": "object"}', '1')
"#,
)
.unwrap();
assert_eq!(result, false);
}
}
#[cfg(test)]
pub mod pg_test {
pub fn setup(_options: Vec<&str>) {
// perform one-off initialization when the pg_test framework starts
}
pub fn postgresql_conf_options() -> Vec<&'static str> {
// return any postgresql.conf settings that are required for your tests
vec![]
}
}