@proteinjs/db 1.0.24 → 1.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/test/CrudTests.ts CHANGED
@@ -1,12 +1,16 @@
1
1
  import { QueryBuilder } from '@proteinjs/db-query';
2
2
  import { DbDriver, Db } from '../src/Db';
3
3
  import { withRecordColumns, Record } from '../src/Record';
4
- import { StringColumn } from '../src/Columns';
4
+ import { BooleanColumn, DateColumn, StringColumn } from '../src/Columns';
5
5
  import { Table } from '../src/Table';
6
+ import { log } from 'console';
6
7
 
7
8
  export interface Employee extends Record {
8
9
  name: string;
9
10
  department?: string;
11
+ jobTitle?: string | null;
12
+ isRemote?: boolean;
13
+ startDate?: Date;
10
14
  object?: string;
11
15
  }
12
16
 
@@ -15,21 +19,28 @@ export class EmployeeTable extends Table<Employee> {
15
19
  columns = withRecordColumns<Employee>({
16
20
  name: new StringColumn('name'),
17
21
  department: new StringColumn('department'),
22
+ isRemote: new BooleanColumn('is_remote'),
23
+ jobTitle: new StringColumn('job_title'),
24
+ startDate: new DateColumn('start_date'),
18
25
  object: new StringColumn('object'),
19
26
  });
20
27
  }
21
28
 
29
+ /**
30
+ * Used for testing purposes only.
31
+ * */
32
+ export const getTestTable = (tableName: string) => {
33
+ const employeeTable = new EmployeeTable();
34
+ if (employeeTable.name == tableName) {
35
+ return employeeTable;
36
+ }
37
+
38
+ throw new Error(`Cannot find test table: ${tableName}`);
39
+ };
40
+
22
41
  export const crudTests = (driver: DbDriver, dropTable: (table: Table<any>) => Promise<void>) => {
23
42
  return () => {
24
- const getTable = (tableName: string) => {
25
- const employeeTable = new EmployeeTable();
26
- if (employeeTable.name == tableName) {
27
- return employeeTable;
28
- }
29
-
30
- throw new Error('Cannot find test table');
31
- };
32
- const db = new Db(driver, getTable);
43
+ const db = new Db(driver, getTestTable);
33
44
 
34
45
  beforeAll(async () => {
35
46
  if (driver.start) {
@@ -126,5 +137,173 @@ export const crudTests = (driver: DbDriver, dropTable: (table: Table<any>) => Pr
126
137
  });
127
138
  await db.delete(emplyeeTable, qb);
128
139
  });
140
+
141
+ test('Insert with null values', async () => {
142
+ const testEmployee: Omit<Employee, keyof Record> = {
143
+ name: 'Veronica',
144
+ department: 'Cake Factory',
145
+ jobTitle: null,
146
+ isRemote: false,
147
+ };
148
+ const emplyeeTable: Table<Employee> = new EmployeeTable();
149
+ const insertedEmployee = await db.insert(emplyeeTable, testEmployee);
150
+ const fetchedEmployee = await db.get(emplyeeTable, { id: insertedEmployee.id });
151
+
152
+ expect(fetchedEmployee).toBeTruthy();
153
+ expect(fetchedEmployee.jobTitle).toBeNull();
154
+
155
+ await db.delete(emplyeeTable, { id: fetchedEmployee.id });
156
+ });
157
+
158
+ test('Update with null values', async () => {
159
+ const testEmployee: Omit<Employee, keyof Record> = {
160
+ name: 'Cassidy',
161
+ jobTitle: 'Cowboy',
162
+ isRemote: false,
163
+ };
164
+ const emplyeeTable: Table<Employee> = new EmployeeTable();
165
+ const insertedEmployee = await db.insert(emplyeeTable, testEmployee);
166
+ const fetchedEmployee = await db.get(emplyeeTable, { id: insertedEmployee.id });
167
+ expect(fetchedEmployee).toBeTruthy();
168
+
169
+ const nullUpdateCount = await db.update(emplyeeTable, { jobTitle: null }, { id: insertedEmployee.id });
170
+ expect(nullUpdateCount).toBe(1);
171
+ await db.delete(emplyeeTable, { id: fetchedEmployee.id });
172
+ });
173
+
174
+ test('Query with null values', async () => {
175
+ const testEmployee: Omit<Employee, keyof Record> = {
176
+ name: 'Cassidy',
177
+ jobTitle: null,
178
+ isRemote: false,
179
+ };
180
+ const emplyeeTable: Table<Employee> = new EmployeeTable();
181
+ const insertedEmployee = await db.insert(emplyeeTable, testEmployee);
182
+
183
+ const qb = new QueryBuilder<Employee>(emplyeeTable.name)
184
+ .condition({
185
+ field: 'jobTitle',
186
+ operator: 'IS NULL',
187
+ })
188
+ .condition({ field: 'id', operator: '=', value: insertedEmployee.id });
189
+ const rows = await db.query(emplyeeTable, qb);
190
+ expect(rows.length).toEqual(1);
191
+ await db.delete(emplyeeTable, { id: insertedEmployee.id });
192
+ });
193
+
194
+ test('Query with IN and NOT IN operators, including null values', async () => {
195
+ const testEmployee1: Omit<Employee, keyof Record> = { name: 'Veronica', jobTitle: 'Engineer' };
196
+ const testEmployee2: Omit<Employee, keyof Record> = { name: 'Zenyatta', jobTitle: null };
197
+ const testEmployee3: Omit<Employee, keyof Record> = { name: 'Cassidy', jobTitle: 'Cowboy' };
198
+ const emplyeeTable: Table<Employee> = new EmployeeTable();
199
+ const insertedEmployee1 = await db.insert(emplyeeTable, testEmployee1);
200
+ const insertedEmployee2 = await db.insert(emplyeeTable, testEmployee2);
201
+ const insertedEmployee3 = await db.insert(emplyeeTable, testEmployee3);
202
+
203
+ const inQuery = new QueryBuilder<Employee>(emplyeeTable.name).condition({
204
+ field: 'jobTitle',
205
+ operator: 'IN',
206
+ value: ['Engineer', null],
207
+ });
208
+ const inResults = await db.query(emplyeeTable, inQuery);
209
+ expect(inResults.length).toBe(1);
210
+ expect(inResults.some((emp) => emp.jobTitle === 'Engineer')).toBe(true);
211
+
212
+ const notInQuery = new QueryBuilder<Employee>(emplyeeTable.name).condition({
213
+ field: 'jobTitle',
214
+ operator: 'NOT IN',
215
+ value: ['Engineer', null],
216
+ });
217
+ const notInResults = await db.query(emplyeeTable, notInQuery);
218
+ expect(notInResults.length).toBe(0);
219
+
220
+ // Clean up
221
+ const qb = new QueryBuilder<Employee>(emplyeeTable.name).condition({
222
+ field: 'id',
223
+ operator: 'IN',
224
+ value: [insertedEmployee1.id, insertedEmployee2.id, insertedEmployee3.id],
225
+ });
226
+ await db.delete(emplyeeTable, qb);
227
+ });
228
+
229
+ test('Query with BETWEEN operator', async () => {
230
+ const testEmployee1: Omit<Employee, keyof Record> = {
231
+ name: 'Veronica',
232
+ jobTitle: 'Engineer',
233
+ startDate: new Date('1997-10-24T00:00:00Z'),
234
+ };
235
+ const testEmployee2: Omit<Employee, keyof Record> = {
236
+ name: 'Kiriko',
237
+ jobTitle: null,
238
+ startDate: new Date('2022-10-04T00:00:00Z'),
239
+ };
240
+ const testEmployee3: Omit<Employee, keyof Record> = {
241
+ name: 'Cassidy',
242
+ jobTitle: 'Cowboy',
243
+ startDate: new Date('2016-05-24T00:00:00Z'),
244
+ };
245
+ const employeeTable: Table<Employee> = new EmployeeTable();
246
+
247
+ const insertedEmployee1 = await db.insert(employeeTable, testEmployee1);
248
+ const insertedEmployee2 = await db.insert(employeeTable, testEmployee2);
249
+ const insertedEmployee3 = await db.insert(employeeTable, testEmployee3);
250
+
251
+ const betweenQuery = new QueryBuilder<Employee>(employeeTable.name).condition({
252
+ field: 'startDate',
253
+ operator: 'BETWEEN',
254
+ value: ['2000-06-05T00:00:00Z', '2024-06-05T00:00:00Z'],
255
+ });
256
+ const betweenResults = await db.query(employeeTable, betweenQuery);
257
+ expect(betweenResults.length).toBe(2);
258
+ expect(betweenResults.some((emp) => emp.name === 'Kiriko')).toBe(true);
259
+ expect(betweenResults.some((emp) => emp.name === 'Cassidy')).toBe(true);
260
+
261
+ // Clean up
262
+ const qb = new QueryBuilder<Employee>(employeeTable.name).condition({
263
+ field: 'id',
264
+ operator: 'IN',
265
+ value: [insertedEmployee1.id, insertedEmployee2.id, insertedEmployee3.id],
266
+ });
267
+ await db.delete(employeeTable, qb);
268
+ });
269
+
270
+ test('Query with sort', async () => {
271
+ const testEmployee1: Omit<Employee, keyof Record> = {
272
+ name: 'Veronica',
273
+ jobTitle: 'Engineer',
274
+ };
275
+ const testEmployee2: Omit<Employee, keyof Record> = {
276
+ name: 'Kiriko',
277
+ jobTitle: null,
278
+ };
279
+ const testEmployee3: Omit<Employee, keyof Record> = {
280
+ name: 'Cassidy',
281
+ jobTitle: 'Cowboy',
282
+ };
283
+ const employeeTable: Table<Employee> = new EmployeeTable();
284
+
285
+ const insertedEmployee1 = await db.insert(employeeTable, testEmployee1);
286
+ const insertedEmployee2 = await db.insert(employeeTable, testEmployee2);
287
+ const insertedEmployee3 = await db.insert(employeeTable, testEmployee3);
288
+
289
+ const sortQuery = new QueryBuilder<Employee>(employeeTable.name).sort([
290
+ { field: 'name', byValues: ['Cassidy', 'Veronica', 'Kiriko'] },
291
+ ]);
292
+ const sortResults = await db.query(employeeTable, sortQuery);
293
+
294
+ // Assertions
295
+ expect(sortResults.length).toBe(3);
296
+ expect(sortResults[0].name).toBe('Cassidy');
297
+ expect(sortResults[1].name).toBe('Veronica');
298
+ expect(sortResults[2].name).toBe('Kiriko');
299
+
300
+ // Clean up
301
+ const qb = new QueryBuilder<Employee>(employeeTable.name).condition({
302
+ field: 'id',
303
+ operator: 'IN',
304
+ value: [insertedEmployee1.id, insertedEmployee2.id, insertedEmployee3.id],
305
+ });
306
+ await db.delete(employeeTable, qb);
307
+ });
129
308
  };
130
309
  };