Skip to content

Commit 5c2b5b5

Browse files
committed
Added cockroach casing tests
1 parent ea2dcd9 commit 5c2b5b5

File tree

2 files changed

+624
-0
lines changed

2 files changed

+624
-0
lines changed
Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,311 @@
1+
import { beforeEach, describe, it } from 'vitest';
2+
import { relations } from '~/_relations';
3+
import { drizzle } from '~/cockroach';
4+
import { alias, boolean, cockroachSchema, cockroachTable, int4, text, union } from '~/cockroach-core';
5+
import { asc, eq, sql } from '~/sql';
6+
7+
const testSchema = cockroachSchema('test');
8+
const users = cockroachTable('users', {
9+
id: int4().primaryKey().generatedByDefaultAsIdentity(),
10+
first_name: text().notNull(),
11+
last_name: text().notNull(),
12+
// Test that custom aliases remain
13+
age: int4('AGE'),
14+
});
15+
const usersRelations = relations(users, ({ one }) => ({
16+
developers: one(developers),
17+
}));
18+
const developers = testSchema.table('developers', {
19+
user_id: int4().primaryKey().generatedByDefaultAsIdentity().references(() => users.id),
20+
uses_drizzle_orm: boolean().notNull(),
21+
});
22+
const developersRelations = relations(developers, ({ one }) => ({
23+
user: one(users, {
24+
fields: [developers.user_id],
25+
references: [users.id],
26+
}),
27+
}));
28+
const devs = alias(developers, 'devs');
29+
const schema = { users, usersRelations, developers, developersRelations };
30+
31+
const db = drizzle.mock({ schema, casing: 'camelCase' });
32+
33+
const usersCache = {
34+
'public.users.id': 'id',
35+
'public.users.first_name': 'firstName',
36+
'public.users.last_name': 'lastName',
37+
'public.users.AGE': 'age',
38+
};
39+
const developersCache = {
40+
'test.developers.user_id': 'userId',
41+
'test.developers.uses_drizzle_orm': 'usesDrizzleOrm',
42+
};
43+
const cache = {
44+
...usersCache,
45+
...developersCache,
46+
};
47+
48+
const fullName = sql`${users.first_name} || ' ' || ${users.last_name}`.as('name');
49+
50+
describe('cockroach to camel case', () => {
51+
beforeEach(() => {
52+
db.dialect.casing.clearCache();
53+
});
54+
55+
it('select', ({ expect }) => {
56+
const query = db
57+
.select({ name: fullName, age: users.age })
58+
.from(users)
59+
.leftJoin(developers, eq(users.id, developers.user_id))
60+
.orderBy(asc(users.first_name));
61+
62+
expect(query.toSQL()).toEqual({
63+
sql:
64+
'select "users"."firstName" || \' \' || "users"."lastName" as "name", "users"."AGE" from "users" left join "test"."developers" on "users"."id" = "test"."developers"."userId" order by "users"."firstName" asc',
65+
params: [],
66+
});
67+
expect(db.dialect.casing.cache).toEqual(cache);
68+
});
69+
70+
it('select (with alias)', ({ expect }) => {
71+
const query = db
72+
.select({ first_name: users.first_name })
73+
.from(users)
74+
.leftJoin(devs, eq(users.id, devs.user_id));
75+
76+
expect(query.toSQL()).toEqual({
77+
sql:
78+
'select "users"."firstName" from "users" left join "test"."developers" "devs" on "users"."id" = "devs"."userId"',
79+
params: [],
80+
});
81+
expect(db.dialect.casing.cache).toEqual(cache);
82+
});
83+
84+
it('with CTE', ({ expect }) => {
85+
const cte = db.$with('cte').as(db.select({ name: fullName }).from(users));
86+
const query = db.with(cte).select().from(cte);
87+
88+
expect(query.toSQL()).toEqual({
89+
sql: 'with "cte" as (select "firstName" || \' \' || "lastName" as "name" from "users") select "name" from "cte"',
90+
params: [],
91+
});
92+
expect(db.dialect.casing.cache).toEqual(usersCache);
93+
});
94+
95+
it('with CTE (with query builder)', ({ expect }) => {
96+
const cte = db.$with('cte').as((qb) => qb.select({ name: fullName }).from(users));
97+
const query = db.with(cte).select().from(cte);
98+
99+
expect(query.toSQL()).toEqual({
100+
sql: 'with "cte" as (select "firstName" || \' \' || "lastName" as "name" from "users") select "name" from "cte"',
101+
params: [],
102+
});
103+
expect(db.dialect.casing.cache).toEqual(usersCache);
104+
});
105+
106+
it('set operator', ({ expect }) => {
107+
const query = db
108+
.select({ first_name: users.first_name })
109+
.from(users)
110+
.union(db.select({ first_name: users.first_name }).from(users));
111+
112+
expect(query.toSQL()).toEqual({
113+
sql: '(select "firstName" from "users") union (select "firstName" from "users")',
114+
params: [],
115+
});
116+
expect(db.dialect.casing.cache).toEqual(usersCache);
117+
});
118+
119+
it('set operator (function)', ({ expect }) => {
120+
const query = union(
121+
db.select({ first_name: users.first_name }).from(users),
122+
db.select({ first_name: users.first_name }).from(users),
123+
);
124+
125+
expect(query.toSQL()).toEqual({
126+
sql: '(select "firstName" from "users") union (select "firstName" from "users")',
127+
params: [],
128+
});
129+
expect(db.dialect.casing.cache).toEqual(usersCache);
130+
});
131+
132+
it('query (find first)', ({ expect }) => {
133+
const query = db._query.users.findFirst({
134+
columns: {
135+
id: true,
136+
age: true,
137+
},
138+
extras: {
139+
fullName,
140+
},
141+
where: eq(users.id, 1),
142+
with: {
143+
developers: {
144+
columns: {
145+
uses_drizzle_orm: true,
146+
},
147+
},
148+
},
149+
});
150+
151+
expect(query.toSQL()).toEqual({
152+
sql:
153+
'select "users"."id", "users"."AGE", "users"."firstName" || \' \' || "users"."lastName" as "name", "users_developers"."data" as "developers" from "users" "users" left join lateral (select json_build_array("users_developers"."usesDrizzleOrm") as "data" from (select * from "test"."developers" "users_developers" where "users_developers"."userId" = "users"."id" limit $1) "users_developers") "users_developers" on true where "users"."id" = $2 limit $3',
154+
params: [1, 1, 1],
155+
typings: ['none', 'none', 'none'],
156+
});
157+
expect(db.dialect.casing.cache).toEqual(cache);
158+
});
159+
160+
it('query (find many)', ({ expect }) => {
161+
const query = db._query.users.findMany({
162+
columns: {
163+
id: true,
164+
age: true,
165+
},
166+
extras: {
167+
fullName,
168+
},
169+
where: eq(users.id, 1),
170+
with: {
171+
developers: {
172+
columns: {
173+
uses_drizzle_orm: true,
174+
},
175+
},
176+
},
177+
});
178+
179+
expect(query.toSQL()).toEqual({
180+
sql:
181+
'select "users"."id", "users"."AGE", "users"."firstName" || \' \' || "users"."lastName" as "name", "users_developers"."data" as "developers" from "users" "users" left join lateral (select json_build_array("users_developers"."usesDrizzleOrm") as "data" from (select * from "test"."developers" "users_developers" where "users_developers"."userId" = "users"."id" limit $1) "users_developers") "users_developers" on true where "users"."id" = $2',
182+
params: [1, 1],
183+
typings: ['none', 'none'],
184+
});
185+
expect(db.dialect.casing.cache).toEqual(cache);
186+
});
187+
188+
it('insert (on conflict do nothing)', ({ expect }) => {
189+
const query = db
190+
.insert(users)
191+
.values({ first_name: 'John', last_name: 'Doe', age: 30 })
192+
.onConflictDoNothing({ target: users.first_name })
193+
.returning({ first_name: users.first_name, age: users.age });
194+
195+
expect(query.toSQL()).toEqual({
196+
sql:
197+
'insert into "users" ("id", "firstName", "lastName", "AGE") values (default, $1, $2, $3) on conflict ("firstName") do nothing returning "firstName", "AGE"',
198+
params: ['John', 'Doe', 30],
199+
});
200+
expect(db.dialect.casing.cache).toEqual(usersCache);
201+
});
202+
203+
it('insert (on conflict do update)', ({ expect }) => {
204+
const query = db
205+
.insert(users)
206+
.values({ first_name: 'John', last_name: 'Doe', age: 30 })
207+
.onConflictDoUpdate({ target: users.first_name, set: { age: 31 } })
208+
.returning({ first_name: users.first_name, age: users.age });
209+
210+
expect(query.toSQL()).toEqual({
211+
sql:
212+
'insert into "users" ("id", "firstName", "lastName", "AGE") values (default, $1, $2, $3) on conflict ("firstName") do update set "AGE" = $4 returning "firstName", "AGE"',
213+
params: ['John', 'Doe', 30, 31],
214+
});
215+
expect(db.dialect.casing.cache).toEqual(usersCache);
216+
});
217+
218+
it('update', ({ expect }) => {
219+
const query = db
220+
.update(users)
221+
.set({ first_name: 'John', last_name: 'Doe', age: 30 })
222+
.where(eq(users.id, 1))
223+
.returning({ first_name: users.first_name, age: users.age });
224+
225+
expect(query.toSQL()).toEqual({
226+
sql:
227+
'update "users" set "firstName" = $1, "lastName" = $2, "AGE" = $3 where "users"."id" = $4 returning "firstName", "AGE"',
228+
params: ['John', 'Doe', 30, 1],
229+
});
230+
expect(db.dialect.casing.cache).toEqual(usersCache);
231+
});
232+
233+
it('delete', ({ expect }) => {
234+
const query = db
235+
.delete(users)
236+
.where(eq(users.id, 1))
237+
.returning({ first_name: users.first_name, age: users.age });
238+
239+
expect(query.toSQL()).toEqual({
240+
sql: 'delete from "users" where "users"."id" = $1 returning "firstName", "AGE"',
241+
params: [1],
242+
});
243+
expect(db.dialect.casing.cache).toEqual(usersCache);
244+
});
245+
246+
it('select columns as', ({ expect }) => {
247+
const query = db
248+
.select({ age: users.age.as('ageOfUser'), id: users.id.as('userId') })
249+
.from(users)
250+
.orderBy(asc(users.id.as('userId')));
251+
252+
expect(query.toSQL()).toEqual({
253+
sql: 'select "AGE" as "ageOfUser", "id" as "userId" from "users" order by "userId" asc',
254+
params: [],
255+
});
256+
});
257+
258+
it('select join columns as', ({ expect }) => {
259+
const query = db
260+
.select({ name: fullName, age: users.age.as('ageOfUser'), id: users.id.as('userId') })
261+
.from(users)
262+
.leftJoin(developers, eq(users.id.as('userId'), developers.user_id))
263+
.orderBy(asc(users.first_name));
264+
265+
expect(query.toSQL()).toEqual({
266+
sql:
267+
'select "users"."firstName" || \' \' || "users"."lastName" as "name", "users"."AGE" as "ageOfUser", "users"."id" as "userId" from "users" left join "test"."developers" on "userId" = "test"."developers"."userId" order by "users"."firstName" asc',
268+
params: [],
269+
});
270+
});
271+
272+
it('insert (on conflict do update) returning as', ({ expect }) => {
273+
const query = db
274+
.insert(users)
275+
.values({ first_name: 'John', last_name: 'Doe', age: 30 })
276+
.onConflictDoUpdate({ target: users.first_name.as('userFirstName'), set: { age: 31 } })
277+
.returning({ firstName: users.first_name, age: users.age.as('userAge') });
278+
279+
expect(query.toSQL()).toEqual({
280+
sql:
281+
'insert into "users" ("id", "firstName", "lastName", "AGE") values (default, $1, $2, $3) on conflict ("userFirstName") do update set "AGE" = $4 returning "firstName", "AGE" as "userAge"',
282+
params: ['John', 'Doe', 30, 31],
283+
});
284+
});
285+
286+
it('update returning as', ({ expect }) => {
287+
const query = db
288+
.update(users)
289+
.set({ first_name: 'John', last_name: 'Doe', age: 30 })
290+
.where(eq(users.id, 1))
291+
.returning({ firstName: users.first_name.as('usersName'), age: users.age });
292+
293+
expect(query.toSQL()).toEqual({
294+
sql:
295+
'update "users" set "firstName" = $1, "lastName" = $2, "AGE" = $3 where "users"."id" = $4 returning "firstName" as "usersName", "AGE"',
296+
params: ['John', 'Doe', 30, 1],
297+
});
298+
});
299+
300+
it('delete returning as', ({ expect }) => {
301+
const query = db
302+
.delete(users)
303+
.where(eq(users.id, 1))
304+
.returning({ firstName: users.first_name, age: users.age.as('usersAge') });
305+
306+
expect(query.toSQL()).toEqual({
307+
sql: 'delete from "users" where "users"."id" = $1 returning "firstName", "AGE" as "usersAge"',
308+
params: [1],
309+
});
310+
});
311+
});

0 commit comments

Comments
 (0)