Skip to content

Commit a68a36f

Browse files
authoredMay 12, 2020
Miscellaneous fixes (#31)
* Create helper function for testing queries * Use ValueRecord from utils * Breaking change: disallow extra keys in spreadInsert Author: Brandon Chinn <[email protected]>
1 parent c69aa2f commit a68a36f

File tree

4 files changed

+107
-108
lines changed

4 files changed

+107
-108
lines changed
 

‎src/sql/index.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import createDebugLogger from "debug"
2-
import { escapeIdentifier, extractKeys, filterUndefined, mergeLists } from "../utils"
2+
import { escapeIdentifier, extractKeys, filterUndefined, mergeLists, ValueRecord } from "../utils"
33
import { QueryConfig } from "./config"
44
import {
55
SqlBuilder,
@@ -13,9 +13,6 @@ import {
1313
export { QueryConfig, SqlBuilder }
1414

1515
type PgQueryConfig = QueryConfig
16-
interface ValueRecord<T = any> {
17-
[key: string]: T
18-
}
1916

2017
const debugQuery = createDebugLogger("squid:query")
2118

‎src/utils.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,7 @@ function areSetsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {
5757
if (difference.has(elem)) {
5858
difference.delete(elem)
5959
} else {
60-
// FIXME: uncommenting this causes change in behavior, where spreadInsert()
61-
// currently allows extra keys to be specified in latter objects that will
62-
// be ignored
63-
// return false
60+
return false
6461
}
6562
}
6663

‎test/query.test.ts

+104-98
Original file line numberDiff line numberDiff line change
@@ -2,139 +2,145 @@ import test from "ava"
22
import dedent from "dedent"
33
import { spreadAnd, spreadInsert, spreadUpdate, sql, QueryConfig } from "../src/pg"
44

5+
function matches(t: any, actual: QueryConfig, expectedText: string, expectedValues: any[]) {
6+
t.is(dedent(actual.text), dedent(expectedText))
7+
t.deepEqual(actual.values, expectedValues)
8+
}
9+
510
const dedentQueryConfig = (queryConfig: QueryConfig) => ({
611
...queryConfig,
712
text: dedent(queryConfig.text)
813
})
914

1015
test("sql template tag creates a valid postgres query", t => {
11-
t.deepEqual(sql`SELECT email FROM users WHERE id = ${1}`, {
12-
text: "SELECT email FROM users WHERE id = $1",
13-
values: [1]
14-
})
16+
matches(
17+
t,
18+
sql`SELECT email FROM users WHERE id = ${1}`,
19+
"SELECT email FROM users WHERE id = $1",
20+
[1]
21+
)
1522
})
1623

1724
test("sql.safe() works", t => {
18-
t.deepEqual(sql`SELECT email FROM users WHERE id = ${sql.safe(1)}`, {
19-
text: "SELECT email FROM users WHERE id = $1",
20-
values: [1]
21-
})
25+
matches(
26+
t,
27+
sql`SELECT email FROM users WHERE id = ${sql.safe(1)}`,
28+
"SELECT email FROM users WHERE id = $1",
29+
[1]
30+
)
31+
2232
t.deepEqual(
2333
`SELECT email FROM users WHERE id = ${sql.safe(1)}`,
2434
`SELECT email FROM users WHERE id = [object Object]`
2535
)
2636
})
2737

2838
test("sql.raw() works", t => {
29-
t.deepEqual(sql`SELECT email FROM users WHERE id = ${sql.raw("1")}`, {
30-
text: "SELECT email FROM users WHERE id = 1",
31-
values: []
32-
})
39+
matches(
40+
t,
41+
sql`SELECT email FROM users WHERE id = ${sql.raw("1")}`,
42+
"SELECT email FROM users WHERE id = 1",
43+
[]
44+
)
3345
})
3446

3547
test("spreadAnd() works", t => {
36-
t.deepEqual(
37-
dedentQueryConfig(sql`
38-
SELECT * FROM users WHERE ${spreadAnd({
39-
name: "Hugo",
40-
age: 20,
41-
email: sql.raw("'foo@example.com'"),
42-
foo: undefined
43-
})}
44-
`),
45-
dedentQueryConfig({
46-
text: `SELECT * FROM users WHERE ("name" = $1 AND "age" = $2 AND "email" = 'foo@example.com')`,
47-
values: ["Hugo", 20]
48-
})
48+
matches(
49+
t,
50+
sql`
51+
SELECT * FROM users WHERE ${spreadAnd({
52+
name: "Hugo",
53+
age: 20,
54+
email: sql.raw("'foo@example.com'"),
55+
foo: undefined
56+
})}
57+
`,
58+
`SELECT * FROM users WHERE ("name" = $1 AND "age" = $2 AND "email" = 'foo@example.com')`,
59+
["Hugo", 20]
4960
)
5061
})
5162

5263
test("spreadInsert() works", t => {
53-
t.deepEqual(
54-
dedentQueryConfig(sql`
55-
INSERT INTO users ${spreadInsert({
56-
name: "Hugo",
57-
age: 20,
58-
created_at: sql.raw("NOW()"),
59-
foo: undefined
60-
})} RETURNING *
61-
`),
62-
dedentQueryConfig({
63-
text: `INSERT INTO users ("name", "age", "created_at") VALUES ($1, $2, NOW()) RETURNING *`,
64-
values: ["Hugo", 20]
65-
})
66-
)
67-
})
68-
69-
test("spreadInsert() works with multiple inserts", t => {
70-
t.deepEqual(
71-
dedentQueryConfig(sql`
72-
INSERT INTO users ${spreadInsert(
73-
{
64+
matches(
65+
t,
66+
sql`
67+
INSERT INTO users ${spreadInsert({
7468
name: "Hugo",
7569
age: 20,
7670
created_at: sql.raw("NOW()"),
7771
foo: undefined
78-
},
79-
{
80-
age: 25,
81-
name: "Jon",
82-
foo: undefined,
83-
created_at: sql.raw("NOW()")
84-
},
85-
{
86-
bar: 1,
87-
age: 27,
88-
name: "Hans",
89-
created_at: null
90-
}
91-
)} RETURNING *
92-
`),
93-
dedentQueryConfig({
94-
text: `INSERT INTO users ("name", "age", "created_at") VALUES ($1, $2, NOW()), ($3, $4, NOW()), ($5, $6, $7) RETURNING *`,
95-
values: ["Hugo", 20, "Jon", 25, "Hans", 27, null]
96-
})
72+
})} RETURNING *
73+
`,
74+
`INSERT INTO users ("name", "age", "created_at") VALUES ($1, $2, NOW()) RETURNING *`,
75+
["Hugo", 20]
76+
)
77+
})
78+
79+
test("spreadInsert() works with multiple inserts", t => {
80+
matches(
81+
t,
82+
sql`
83+
INSERT INTO users ${spreadInsert(
84+
{
85+
name: "Hugo",
86+
age: 20,
87+
created_at: sql.raw("NOW()"),
88+
foo: undefined
89+
},
90+
{
91+
age: 25,
92+
name: "Jon",
93+
foo: undefined,
94+
created_at: sql.raw("NOW()")
95+
},
96+
{
97+
age: 27,
98+
name: "Hans",
99+
created_at: null
100+
}
101+
)} RETURNING *
102+
`,
103+
`INSERT INTO users ("name", "age", "created_at") VALUES ($1, $2, NOW()), ($3, $4, NOW()), ($5, $6, $7) RETURNING *`,
104+
["Hugo", 20, "Jon", 25, "Hans", 27, null]
97105
)
98106
})
99107

100108
test("spreadUpdate() works", t => {
101-
t.deepEqual(
102-
dedentQueryConfig(sql`
103-
UPDATE users SET ${spreadUpdate({
104-
name: "Hugo",
105-
age: 20,
106-
created_at: sql.raw("NOW()"),
107-
foo: undefined
108-
})}
109-
`),
110-
dedentQueryConfig({
111-
text: `UPDATE users SET "name" = $1, "age" = $2, "created_at" = NOW()`,
112-
values: ["Hugo", 20]
113-
})
109+
matches(
110+
t,
111+
sql`
112+
UPDATE users SET ${spreadUpdate({
113+
name: "Hugo",
114+
age: 20,
115+
created_at: sql.raw("NOW()"),
116+
foo: undefined
117+
})}
118+
`,
119+
`UPDATE users SET "name" = $1, "age" = $2, "created_at" = NOW()`,
120+
["Hugo", 20]
114121
)
115122
})
116123

117124
test("works with multiple parameters", t => {
118-
t.deepEqual(
119-
dedentQueryConfig(sql`
120-
WITH some_users AS (
121-
SELECT * FROM users WHERE id = ${1} OR email = ${"foo@example.com"}
122-
)
123-
INSERT INTO users ${spreadInsert({
124-
name: "Hugo",
125-
age: 20,
126-
created_at: sql.raw("NOW()"),
127-
role: "user"
128-
})} UNION SELECT * FROM some_users RETURNING *
129-
`),
130-
dedentQueryConfig({
131-
text: `
132-
WITH some_users AS (
133-
SELECT * FROM users WHERE id = $1 OR email = $2
134-
)
135-
INSERT INTO users ("name", "age", "created_at", "role") VALUES ($3, $4, NOW(), $5) UNION SELECT * FROM some_users RETURNING *
125+
matches(
126+
t,
127+
sql`
128+
WITH some_users AS (
129+
SELECT * FROM users WHERE id = ${1} OR email = ${"foo@example.com"}
130+
)
131+
INSERT INTO users ${spreadInsert({
132+
name: "Hugo",
133+
age: 20,
134+
created_at: sql.raw("NOW()"),
135+
role: "user"
136+
})} UNION SELECT * FROM some_users RETURNING *
137+
`,
138+
`
139+
WITH some_users AS (
140+
SELECT * FROM users WHERE id = $1 OR email = $2
141+
)
142+
INSERT INTO users ("name", "age", "created_at", "role") VALUES ($3, $4, NOW(), $5) UNION SELECT * FROM some_users RETURNING *
136143
`,
137-
values: [1, "foo@example.com", "Hugo", 20, "user"]
138-
})
144+
[1, "foo@example.com", "Hugo", 20, "user"]
139145
)
140146
})

‎test/utils.test.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ test("extractKeys checks that the keys are all the same", t => {
4949
extractKeys([{ a: 1, b: 2 }, { a: 1 }])
5050
})
5151

52-
// see FIXME
53-
t.notThrows(() => {
52+
t.throws(() => {
5453
extractKeys([{ a: 1 }, { a: 1, b: 2 }])
5554
})
5655

0 commit comments

Comments
 (0)
Please sign in to comment.