@@ -17,6 +17,7 @@ const createTestHook = (name = 'Test Hook') => ({
1717 beforeIdentify : jest . fn ( ) ,
1818 afterIdentify : jest . fn ( ) ,
1919 afterTrack : jest . fn ( ) ,
20+ afterEventEnqueue : jest . fn ( ) ,
2021} ) ;
2122
2223describe ( 'Given a logger, runner, and hook' , ( ) => {
@@ -379,12 +380,114 @@ describe('Given a logger, runner, and hook', () => {
379380 expect ( logger . error ) . not . toHaveBeenCalled ( ) ;
380381 } ) ;
381382
383+ it ( 'should execute afterEventEnqueue hooks' , ( ) => {
384+ const context = { kind : 'user' , key : 'user-123' } ;
385+ const event = {
386+ kind : 'feature' ,
387+ key : 'test-flag' ,
388+ context,
389+ value : true ,
390+ variation : 1 ,
391+ default : false ,
392+ creationDate : new Date ( ) . getTime ( ) ,
393+ version : 42 ,
394+ trackEvents : true ,
395+ } ;
396+
397+ hookRunner . afterEventEnqueue ( event ) ;
398+
399+ expect ( testHook . afterEventEnqueue ) . toHaveBeenCalledWith ( event ) ;
400+ } ) ;
401+
402+ it ( 'should handle errors in afterEventEnqueue hooks' , ( ) => {
403+ const errorHook = {
404+ getMetadata : jest . fn ( ) . mockReturnValue ( { name : 'Error Hook' } ) ,
405+ afterEventEnqueue : jest . fn ( ) . mockImplementation ( ( ) => {
406+ throw new Error ( 'Hook error' ) ;
407+ } ) ,
408+ } ;
409+
410+ const errorHookRunner = createHookRunner ( logger , [ errorHook ] ) ;
411+
412+ errorHookRunner . afterEventEnqueue ( {
413+ kind : 'custom' ,
414+ key : 'test-event' ,
415+ context : { kind : 'user' , key : 'user-123' } ,
416+ creationDate : new Date ( ) . getTime ( ) ,
417+ } ) ;
418+
419+ expect ( logger . error ) . toHaveBeenCalledWith (
420+ expect . stringContaining (
421+ 'An error was encountered in "afterEventEnqueue" of the "Error Hook" hook: Error: Hook error'
422+ )
423+ ) ;
424+ } ) ;
425+
426+ it ( 'should skip afterEventEnqueue execution if there are no hooks' , ( ) => {
427+ const emptyHookRunner = createHookRunner ( logger , [ ] ) ;
428+
429+ emptyHookRunner . afterEventEnqueue ( {
430+ kind : 'identify' ,
431+ context : { kind : 'user' , key : 'user-123' } ,
432+ creationDate : new Date ( ) . getTime ( ) ,
433+ } ) ;
434+
435+ expect ( logger . error ) . not . toHaveBeenCalled ( ) ;
436+ } ) ;
437+
438+ it ( 'should execute afterEventEnqueue hooks for different event types' , ( ) => {
439+ const context = { kind : 'user' , key : 'user-123' } ;
440+ const creationDate = new Date ( ) . getTime ( ) ;
441+
442+ // Test feature event
443+ const featureEvent = {
444+ kind : 'feature' ,
445+ key : 'test-flag' ,
446+ context,
447+ value : true ,
448+ variation : 1 ,
449+ default : false ,
450+ creationDate,
451+ version : 42 ,
452+ } ;
453+
454+ hookRunner . afterEventEnqueue ( featureEvent ) ;
455+ expect ( testHook . afterEventEnqueue ) . toHaveBeenCalledWith ( featureEvent ) ;
456+
457+ // Test custom event
458+ const customEvent = {
459+ kind : 'custom' ,
460+ key : 'test-event' ,
461+ context,
462+ data : { custom : 'data' } ,
463+ metricValue : 123 ,
464+ creationDate,
465+ url : 'https://example.com' ,
466+ } ;
467+
468+ hookRunner . afterEventEnqueue ( customEvent ) ;
469+ expect ( testHook . afterEventEnqueue ) . toHaveBeenCalledWith ( customEvent ) ;
470+
471+ // Test identify event
472+ const identifyEvent = {
473+ kind : 'identify' ,
474+ context,
475+ creationDate,
476+ } ;
477+
478+ hookRunner . afterEventEnqueue ( identifyEvent ) ;
479+ expect ( testHook . afterEventEnqueue ) . toHaveBeenCalledWith ( identifyEvent ) ;
480+
481+ expect ( testHook . afterEventEnqueue ) . toHaveBeenCalledTimes ( 3 ) ;
482+ } ) ;
483+
382484 it ( 'executes hook stages in the specified order' , ( ) => {
383485 const beforeEvalOrder = [ ] ;
384486 const afterEvalOrder = [ ] ;
385487 const beforeIdentifyOrder = [ ] ;
386488 const afterIdentifyOrder = [ ] ;
387489 const afterTrackOrder = [ ] ;
490+ const afterEventEnqueueOrder = [ ] ;
388491
389492 const createMockHook = id => ( {
390493 getMetadata : jest . fn ( ) . mockReturnValue ( { name : `Hook ${ id } ` } ) ,
@@ -407,6 +510,9 @@ describe('Given a logger, runner, and hook', () => {
407510 afterTrack : jest . fn ( ) . mockImplementation ( ( ) => {
408511 afterTrackOrder . push ( id ) ;
409512 } ) ,
513+ afterEventEnqueue : jest . fn ( ) . mockImplementation ( ( ) => {
514+ afterEventEnqueueOrder . push ( id ) ;
515+ } ) ,
410516 } ) ;
411517
412518 const hookA = createMockHook ( 'a' ) ;
@@ -435,6 +541,14 @@ describe('Given a logger, runner, and hook', () => {
435541 metricValue : 42 ,
436542 } ) ;
437543
544+ // Test event enqueue order
545+ runner . afterEventEnqueue ( {
546+ kind : 'custom' ,
547+ key : 'test-event' ,
548+ context : { kind : 'user' , key : 'bob' } ,
549+ creationDate : new Date ( ) . getTime ( ) ,
550+ } ) ;
551+
438552 // Verify evaluation hooks order
439553 expect ( beforeEvalOrder ) . toEqual ( [ 'a' , 'b' , 'c' ] ) ;
440554 expect ( afterEvalOrder ) . toEqual ( [ 'c' , 'b' , 'a' ] ) ;
@@ -445,5 +559,8 @@ describe('Given a logger, runner, and hook', () => {
445559
446560 // Verify track hooks order
447561 expect ( afterTrackOrder ) . toEqual ( [ 'c' , 'b' , 'a' ] ) ;
562+
563+ // Verify event enqueue hooks order
564+ expect ( afterEventEnqueueOrder ) . toEqual ( [ 'c' , 'b' , 'a' ] ) ;
448565 } ) ;
449566} ) ;
0 commit comments