Skip to content

Commit f18b9b0

Browse files
Copilothotlong
andcommitted
test: add executeQuery and executeCommand tests for Redis driver
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 1334a87 commit f18b9b0

1 file changed

Lines changed: 258 additions & 0 deletions

File tree

packages/drivers/redis/test/index.test.ts

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,4 +322,262 @@ describe('RedisDriver', () => {
322322
expect(results[0]).not.toHaveProperty('age');
323323
});
324324
});
325+
326+
describe('DriverInterface v4.0 - executeQuery', () => {
327+
beforeEach(async () => {
328+
if (!driver) return;
329+
330+
await driver.create(TEST_OBJECT, { name: 'Alice', age: 30, role: 'admin' });
331+
await driver.create(TEST_OBJECT, { name: 'Bob', age: 25, role: 'user' });
332+
await driver.create(TEST_OBJECT, { name: 'Charlie', age: 35, role: 'user' });
333+
});
334+
335+
it('should execute a basic query with QueryAST', async () => {
336+
if (!driver) return;
337+
338+
const result = await driver.executeQuery({
339+
object: TEST_OBJECT,
340+
fields: ['name', 'age']
341+
});
342+
343+
expect(result.value).toHaveLength(3);
344+
expect(result.count).toBe(3);
345+
expect(result.value[0]).toHaveProperty('name');
346+
expect(result.value[0]).toHaveProperty('age');
347+
});
348+
349+
it('should execute query with filter', async () => {
350+
if (!driver) return;
351+
352+
const result = await driver.executeQuery({
353+
object: TEST_OBJECT,
354+
filters: {
355+
type: 'comparison',
356+
field: 'role',
357+
operator: '=',
358+
value: 'user'
359+
}
360+
});
361+
362+
expect(result.value).toHaveLength(2);
363+
expect(result.value.every((r: any) => r.role === 'user')).toBe(true);
364+
});
365+
366+
it('should execute query with sort', async () => {
367+
if (!driver) return;
368+
369+
const result = await driver.executeQuery({
370+
object: TEST_OBJECT,
371+
sort: [{ field: 'age', order: 'asc' }]
372+
});
373+
374+
expect(result.value).toHaveLength(3);
375+
expect(result.value[0].name).toBe('Bob');
376+
expect(result.value[1].name).toBe('Alice');
377+
expect(result.value[2].name).toBe('Charlie');
378+
});
379+
380+
it('should execute query with pagination', async () => {
381+
if (!driver) return;
382+
383+
const result = await driver.executeQuery({
384+
object: TEST_OBJECT,
385+
sort: [{ field: 'age', order: 'asc' }],
386+
skip: 1,
387+
top: 1
388+
});
389+
390+
expect(result.value).toHaveLength(1);
391+
expect(result.value[0].name).toBe('Alice');
392+
});
393+
394+
it('should execute query with AND filters', async () => {
395+
if (!driver) return;
396+
397+
const result = await driver.executeQuery({
398+
object: TEST_OBJECT,
399+
filters: {
400+
type: 'and',
401+
children: [
402+
{
403+
type: 'comparison',
404+
field: 'role',
405+
operator: '=',
406+
value: 'user'
407+
},
408+
{
409+
type: 'comparison',
410+
field: 'age',
411+
operator: '>',
412+
value: 30
413+
}
414+
]
415+
}
416+
});
417+
418+
expect(result.value).toHaveLength(1);
419+
expect(result.value[0].name).toBe('Charlie');
420+
});
421+
422+
it('should execute query with OR filters', async () => {
423+
if (!driver) return;
424+
425+
const result = await driver.executeQuery({
426+
object: TEST_OBJECT,
427+
filters: {
428+
type: 'or',
429+
children: [
430+
{
431+
type: 'comparison',
432+
field: 'name',
433+
operator: '=',
434+
value: 'Alice'
435+
},
436+
{
437+
type: 'comparison',
438+
field: 'name',
439+
operator: '=',
440+
value: 'Bob'
441+
}
442+
]
443+
}
444+
});
445+
446+
expect(result.value).toHaveLength(2);
447+
});
448+
});
449+
450+
describe('DriverInterface v4.0 - executeCommand', () => {
451+
it('should execute create command', async () => {
452+
if (!driver) return;
453+
454+
const result = await driver.executeCommand({
455+
type: 'create',
456+
object: TEST_OBJECT,
457+
data: { name: 'David', email: 'david@example.com' }
458+
});
459+
460+
expect(result.success).toBe(true);
461+
expect(result.affected).toBe(1);
462+
expect(result.data).toHaveProperty('id');
463+
expect(result.data.name).toBe('David');
464+
});
465+
466+
it('should execute update command', async () => {
467+
if (!driver) return;
468+
469+
const created = await driver.create(TEST_OBJECT, { name: 'Eve', email: 'eve@example.com' });
470+
471+
const result = await driver.executeCommand({
472+
type: 'update',
473+
object: TEST_OBJECT,
474+
id: created.id,
475+
data: { email: 'eve.new@example.com' }
476+
});
477+
478+
expect(result.success).toBe(true);
479+
expect(result.affected).toBe(1);
480+
expect(result.data.email).toBe('eve.new@example.com');
481+
expect(result.data.name).toBe('Eve');
482+
});
483+
484+
it('should execute delete command', async () => {
485+
if (!driver) return;
486+
487+
const created = await driver.create(TEST_OBJECT, { name: 'Frank' });
488+
489+
const result = await driver.executeCommand({
490+
type: 'delete',
491+
object: TEST_OBJECT,
492+
id: created.id
493+
});
494+
495+
expect(result.success).toBe(true);
496+
expect(result.affected).toBe(1);
497+
498+
const found = await driver.findOne(TEST_OBJECT, created.id);
499+
expect(found).toBeNull();
500+
});
501+
502+
it('should execute bulkCreate command', async () => {
503+
if (!driver) return;
504+
505+
const result = await driver.executeCommand({
506+
type: 'bulkCreate',
507+
object: TEST_OBJECT,
508+
records: [
509+
{ name: 'Grace', age: 28 },
510+
{ name: 'Henry', age: 32 },
511+
{ name: 'Iris', age: 29 }
512+
]
513+
});
514+
515+
expect(result.success).toBe(true);
516+
expect(result.affected).toBe(3);
517+
expect(result.data).toHaveLength(3);
518+
expect(result.data[0]).toHaveProperty('id');
519+
520+
const all = await driver.find(TEST_OBJECT, {});
521+
expect(all).toHaveLength(3);
522+
});
523+
524+
it('should execute bulkUpdate command', async () => {
525+
if (!driver) return;
526+
527+
const created1 = await driver.create(TEST_OBJECT, { name: 'Jack', age: 30 });
528+
const created2 = await driver.create(TEST_OBJECT, { name: 'Kate', age: 25 });
529+
530+
const result = await driver.executeCommand({
531+
type: 'bulkUpdate',
532+
object: TEST_OBJECT,
533+
updates: [
534+
{ id: created1.id, data: { age: 31 } },
535+
{ id: created2.id, data: { age: 26 } }
536+
]
537+
});
538+
539+
expect(result.success).toBe(true);
540+
expect(result.affected).toBe(2);
541+
expect(result.data).toHaveLength(2);
542+
543+
const updated1 = await driver.findOne(TEST_OBJECT, created1.id);
544+
const updated2 = await driver.findOne(TEST_OBJECT, created2.id);
545+
expect(updated1.age).toBe(31);
546+
expect(updated2.age).toBe(26);
547+
});
548+
549+
it('should execute bulkDelete command', async () => {
550+
if (!driver) return;
551+
552+
const created1 = await driver.create(TEST_OBJECT, { name: 'Liam' });
553+
const created2 = await driver.create(TEST_OBJECT, { name: 'Mia' });
554+
const created3 = await driver.create(TEST_OBJECT, { name: 'Noah' });
555+
556+
const result = await driver.executeCommand({
557+
type: 'bulkDelete',
558+
object: TEST_OBJECT,
559+
ids: [created1.id, created2.id, created3.id]
560+
});
561+
562+
expect(result.success).toBe(true);
563+
expect(result.affected).toBe(3);
564+
565+
const all = await driver.find(TEST_OBJECT, {});
566+
expect(all).toHaveLength(0);
567+
});
568+
569+
it('should handle command errors gracefully', async () => {
570+
if (!driver) return;
571+
572+
const result = await driver.executeCommand({
573+
type: 'create',
574+
object: TEST_OBJECT,
575+
data: undefined // Missing data
576+
} as any);
577+
578+
expect(result.success).toBe(false);
579+
expect(result.error).toBeDefined();
580+
expect(result.affected).toBe(0);
581+
});
582+
});
325583
});

0 commit comments

Comments
 (0)