Line data Source code
1 : #[cfg(test)]
2 : mod pg_helpers_tests {
3 : use std::fs::File;
4 :
5 : use compute_api::spec::{ComputeSpec, GenericOption, GenericOptions, PgIdent};
6 : use compute_tools::pg_helpers::*;
7 :
8 2 : #[test]
9 2 : fn params_serialize() {
10 2 : let file = File::open("../libs/compute_api/tests/cluster_spec.json").unwrap();
11 2 : let spec: ComputeSpec = serde_json::from_reader(file).unwrap();
12 2 :
13 2 : assert_eq!(
14 2 : spec.cluster.databases.first().unwrap().to_pg_options(),
15 2 : "LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0 OWNER \"alexk\""
16 2 : );
17 2 : assert_eq!(
18 2 : spec.cluster.roles.first().unwrap().to_pg_options(),
19 2 : " LOGIN PASSWORD 'md56b1d16b78004bbd51fa06af9eda75972'"
20 2 : );
21 2 : }
22 :
23 2 : #[test]
24 2 : fn settings_serialize() {
25 2 : let file = File::open("../libs/compute_api/tests/cluster_spec.json").unwrap();
26 2 : let spec: ComputeSpec = serde_json::from_reader(file).unwrap();
27 2 :
28 2 : assert_eq!(
29 2 : spec.cluster.settings.as_pg_settings(),
30 2 : r#"fsync = off
31 2 : wal_level = logical
32 2 : hot_standby = on
33 2 : neon.safekeepers = '127.0.0.1:6502,127.0.0.1:6503,127.0.0.1:6501'
34 2 : wal_log_hints = on
35 2 : log_connections = on
36 2 : shared_buffers = 32768
37 2 : port = 55432
38 2 : max_connections = 100
39 2 : max_wal_senders = 10
40 2 : listen_addresses = '0.0.0.0'
41 2 : wal_sender_timeout = 0
42 2 : password_encryption = md5
43 2 : maintenance_work_mem = 65536
44 2 : max_parallel_workers = 8
45 2 : max_worker_processes = 8
46 2 : neon.tenant_id = 'b0554b632bd4d547a63b86c3630317e8'
47 2 : max_replication_slots = 10
48 2 : neon.timeline_id = '2414a61ffc94e428f14b5758fe308e13'
49 2 : shared_preload_libraries = 'neon'
50 2 : synchronous_standby_names = 'walproposer'
51 2 : neon.pageserver_connstring = 'host=127.0.0.1 port=6400'
52 2 : test.escaping = 'here''s a backslash \\ and a quote '' and a double-quote " hooray'
53 2 : "#
54 2 : );
55 2 : }
56 :
57 2 : #[test]
58 2 : fn ident_pg_quote() {
59 2 : let ident: PgIdent = PgIdent::from("\"name\";\\n select 1;");
60 2 :
61 2 : assert_eq!(ident.pg_quote(), "\"\"\"name\"\";\\n select 1;\"");
62 2 : }
63 :
64 2 : #[test]
65 2 : fn generic_options_search() {
66 2 : let generic_options: GenericOptions = Some(vec![
67 2 : GenericOption {
68 2 : name: "present_value".into(),
69 2 : value: Some("value".into()),
70 2 : vartype: "string".into(),
71 2 : },
72 2 : GenericOption {
73 2 : name: "missed_value".into(),
74 2 : value: None,
75 2 : vartype: "int".into(),
76 2 : },
77 2 : ]);
78 2 : assert_eq!(generic_options.find("present_value"), Some("value".into()));
79 2 : assert_eq!(generic_options.find("missed_value"), None);
80 2 : assert_eq!(generic_options.find("invalid_value"), None);
81 :
82 2 : let empty_generic_options: GenericOptions = Some(vec![]);
83 2 : assert_eq!(empty_generic_options.find("present_value"), None);
84 2 : assert_eq!(empty_generic_options.find("missed_value"), None);
85 2 : assert_eq!(empty_generic_options.find("invalid_value"), None);
86 :
87 2 : let none_generic_options: GenericOptions = None;
88 2 : assert_eq!(none_generic_options.find("present_value"), None);
89 2 : assert_eq!(none_generic_options.find("missed_value"), None);
90 2 : assert_eq!(none_generic_options.find("invalid_value"), None);
91 2 : }
92 :
93 2 : #[test]
94 2 : fn test_escape_literal() {
95 2 : assert_eq!(escape_literal("test"), "'test'");
96 2 : assert_eq!(escape_literal("test'"), "'test'''");
97 2 : assert_eq!(escape_literal("test\\'"), "E'test\\\\'''");
98 2 : assert_eq!(escape_literal("test\\'\\'"), "E'test\\\\''\\\\'''");
99 2 : }
100 : }
|