Skip to content
This repository was archived by the owner on Mar 1, 2023. It is now read-only.

Commit 218d889

Browse files
committed
Move postgres-derive in-tree
1 parent 3185514 commit 218d889

File tree

16 files changed

+1076
-0
lines changed

16 files changed

+1076
-0
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
members = [
33
"codegen",
44
"postgres",
5+
"postgres-derive",
6+
"postgres-derive-test",
57
"postgres-native-tls",
68
"postgres-openssl",
79
"postgres-protocol",

postgres-derive-test/Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "postgres-derive-test"
3+
version = "0.1.0"
4+
authors = ["Steven Fackler <[email protected]>"]
5+
edition = "2018"
6+
7+
[dependencies]
8+
postgres-types = { path = "../postgres-types", features = ["derive"] }
9+
postgres = { path = "../postgres" }
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
use crate::test_type;
2+
use postgres::{Client, NoTls};
3+
use postgres_types::{FromSql, ToSql, WrongType};
4+
use std::error::Error;
5+
6+
#[test]
7+
fn defaults() {
8+
#[derive(FromSql, ToSql, Debug, PartialEq)]
9+
struct InventoryItem {
10+
name: String,
11+
supplier_id: i32,
12+
price: Option<f64>,
13+
}
14+
15+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
16+
conn.batch_execute(
17+
"CREATE TYPE pg_temp.\"InventoryItem\" AS (
18+
name TEXT,
19+
supplier_id INT,
20+
price DOUBLE PRECISION
21+
);",
22+
)
23+
.unwrap();
24+
25+
let item = InventoryItem {
26+
name: "foobar".to_owned(),
27+
supplier_id: 100,
28+
price: Some(15.50),
29+
};
30+
31+
let item_null = InventoryItem {
32+
name: "foobar".to_owned(),
33+
supplier_id: 100,
34+
price: None,
35+
};
36+
37+
test_type(
38+
&mut conn,
39+
"\"InventoryItem\"",
40+
&[
41+
(item, "ROW('foobar', 100, 15.50)"),
42+
(item_null, "ROW('foobar', 100, NULL)"),
43+
],
44+
);
45+
}
46+
47+
#[test]
48+
fn name_overrides() {
49+
#[derive(FromSql, ToSql, Debug, PartialEq)]
50+
#[postgres(name = "inventory_item")]
51+
struct InventoryItem {
52+
#[postgres(name = "name")]
53+
_name: String,
54+
#[postgres(name = "supplier_id")]
55+
_supplier_id: i32,
56+
#[postgres(name = "price")]
57+
_price: Option<f64>,
58+
}
59+
60+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
61+
conn.batch_execute(
62+
"CREATE TYPE pg_temp.inventory_item AS (
63+
name TEXT,
64+
supplier_id INT,
65+
price DOUBLE PRECISION
66+
);",
67+
)
68+
.unwrap();
69+
70+
let item = InventoryItem {
71+
_name: "foobar".to_owned(),
72+
_supplier_id: 100,
73+
_price: Some(15.50),
74+
};
75+
76+
let item_null = InventoryItem {
77+
_name: "foobar".to_owned(),
78+
_supplier_id: 100,
79+
_price: None,
80+
};
81+
82+
test_type(
83+
&mut conn,
84+
"inventory_item",
85+
&[
86+
(item, "ROW('foobar', 100, 15.50)"),
87+
(item_null, "ROW('foobar', 100, NULL)"),
88+
],
89+
);
90+
}
91+
92+
#[test]
93+
fn wrong_name() {
94+
#[derive(FromSql, ToSql, Debug, PartialEq)]
95+
struct InventoryItem {
96+
name: String,
97+
supplier_id: i32,
98+
price: Option<f64>,
99+
}
100+
101+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
102+
conn.batch_execute(
103+
"CREATE TYPE pg_temp.inventory_item AS (
104+
name TEXT,
105+
supplier_id INT,
106+
price DOUBLE PRECISION
107+
);",
108+
)
109+
.unwrap();
110+
111+
let item = InventoryItem {
112+
name: "foobar".to_owned(),
113+
supplier_id: 100,
114+
price: Some(15.50),
115+
};
116+
117+
let err = conn
118+
.execute("SELECT $1::inventory_item", &[&item])
119+
.unwrap_err();
120+
assert!(err.source().unwrap().is::<WrongType>());
121+
}
122+
123+
#[test]
124+
fn extra_field() {
125+
#[derive(FromSql, ToSql, Debug, PartialEq)]
126+
#[postgres(name = "inventory_item")]
127+
struct InventoryItem {
128+
name: String,
129+
supplier_id: i32,
130+
price: Option<f64>,
131+
foo: i32,
132+
}
133+
134+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
135+
conn.batch_execute(
136+
"CREATE TYPE pg_temp.inventory_item AS (
137+
name TEXT,
138+
supplier_id INT,
139+
price DOUBLE PRECISION
140+
);",
141+
)
142+
.unwrap();
143+
144+
let item = InventoryItem {
145+
name: "foobar".to_owned(),
146+
supplier_id: 100,
147+
price: Some(15.50),
148+
foo: 0,
149+
};
150+
151+
let err = conn
152+
.execute("SELECT $1::inventory_item", &[&item])
153+
.unwrap_err();
154+
assert!(err.source().unwrap().is::<WrongType>());
155+
}
156+
157+
#[test]
158+
fn missing_field() {
159+
#[derive(FromSql, ToSql, Debug, PartialEq)]
160+
#[postgres(name = "inventory_item")]
161+
struct InventoryItem {
162+
name: String,
163+
supplier_id: i32,
164+
}
165+
166+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
167+
conn.batch_execute(
168+
"CREATE TYPE pg_temp.inventory_item AS (
169+
name TEXT,
170+
supplier_id INT,
171+
price DOUBLE PRECISION
172+
);",
173+
)
174+
.unwrap();
175+
176+
let item = InventoryItem {
177+
name: "foobar".to_owned(),
178+
supplier_id: 100,
179+
};
180+
181+
let err = conn
182+
.execute("SELECT $1::inventory_item", &[&item])
183+
.unwrap_err();
184+
assert!(err.source().unwrap().is::<WrongType>());
185+
}
186+
187+
#[test]
188+
fn wrong_type() {
189+
#[derive(FromSql, ToSql, Debug, PartialEq)]
190+
#[postgres(name = "inventory_item")]
191+
struct InventoryItem {
192+
name: String,
193+
supplier_id: i32,
194+
price: i32,
195+
}
196+
197+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
198+
conn.batch_execute(
199+
"CREATE TYPE pg_temp.inventory_item AS (
200+
name TEXT,
201+
supplier_id INT,
202+
price DOUBLE PRECISION
203+
);",
204+
)
205+
.unwrap();
206+
207+
let item = InventoryItem {
208+
name: "foobar".to_owned(),
209+
supplier_id: 100,
210+
price: 0,
211+
};
212+
213+
let err = conn
214+
.execute("SELECT $1::inventory_item", &[&item])
215+
.unwrap_err();
216+
assert!(err.source().unwrap().is::<WrongType>());
217+
}

postgres-derive-test/src/domains.rs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
use crate::test_type;
2+
use postgres::{Client, NoTls};
3+
use postgres_types::{FromSql, ToSql, WrongType};
4+
use std::error::Error;
5+
6+
#[test]
7+
fn defaults() {
8+
#[derive(FromSql, ToSql, Debug, PartialEq)]
9+
struct SessionId(Vec<u8>);
10+
11+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
12+
conn.execute(
13+
"CREATE DOMAIN pg_temp.\"SessionId\" AS bytea CHECK(octet_length(VALUE) = 16);",
14+
&[],
15+
)
16+
.unwrap();
17+
18+
test_type(
19+
&mut conn,
20+
"\"SessionId\"",
21+
&[(
22+
SessionId(b"0123456789abcdef".to_vec()),
23+
"'0123456789abcdef'",
24+
)],
25+
);
26+
}
27+
28+
#[test]
29+
fn name_overrides() {
30+
#[derive(FromSql, ToSql, Debug, PartialEq)]
31+
#[postgres(name = "session_id")]
32+
struct SessionId(Vec<u8>);
33+
34+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
35+
conn.execute(
36+
"CREATE DOMAIN pg_temp.session_id AS bytea CHECK(octet_length(VALUE) = 16);",
37+
&[],
38+
)
39+
.unwrap();
40+
41+
test_type(
42+
&mut conn,
43+
"session_id",
44+
&[(
45+
SessionId(b"0123456789abcdef".to_vec()),
46+
"'0123456789abcdef'",
47+
)],
48+
);
49+
}
50+
51+
#[test]
52+
fn wrong_name() {
53+
#[derive(FromSql, ToSql, Debug, PartialEq)]
54+
struct SessionId(Vec<u8>);
55+
56+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
57+
conn.execute(
58+
"CREATE DOMAIN pg_temp.session_id AS bytea CHECK(octet_length(VALUE) = 16);",
59+
&[],
60+
)
61+
.unwrap();
62+
63+
let err = conn
64+
.execute("SELECT $1::session_id", &[&SessionId(vec![])])
65+
.unwrap_err();
66+
assert!(err.source().unwrap().is::<WrongType>());
67+
}
68+
69+
#[test]
70+
fn wrong_type() {
71+
#[derive(FromSql, ToSql, Debug, PartialEq)]
72+
#[postgres(name = "session_id")]
73+
struct SessionId(i32);
74+
75+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
76+
conn.execute(
77+
"CREATE DOMAIN pg_temp.session_id AS bytea CHECK(octet_length(VALUE) = 16);",
78+
&[],
79+
)
80+
.unwrap();
81+
82+
let err = conn
83+
.execute("SELECT $1::session_id", &[&SessionId(0)])
84+
.unwrap_err();
85+
assert!(err.source().unwrap().is::<WrongType>());
86+
}
87+
88+
#[test]
89+
fn domain_in_composite() {
90+
#[derive(FromSql, ToSql, Debug, PartialEq)]
91+
#[postgres(name = "domain")]
92+
struct Domain(String);
93+
94+
#[derive(FromSql, ToSql, Debug, PartialEq)]
95+
#[postgres(name = "composite")]
96+
struct Composite {
97+
domain: Domain,
98+
}
99+
100+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
101+
conn.batch_execute(
102+
"
103+
CREATE DOMAIN pg_temp.domain AS TEXT;\
104+
CREATE TYPE pg_temp.composite AS (
105+
domain domain
106+
);
107+
",
108+
)
109+
.unwrap();
110+
111+
test_type(
112+
&mut conn,
113+
"composite",
114+
&[(
115+
Composite {
116+
domain: Domain("hello".to_string()),
117+
},
118+
"ROW('hello')",
119+
)],
120+
);
121+
}

0 commit comments

Comments
 (0)