@@ -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