@@ -376,7 +376,7 @@ describe('request/process tests', function () {
376376 done ( err ) ;
377377 } ) ;
378378 d . run ( ( ) => {
379- expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
379+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
380380 callback ( ) ;
381381 expect ( publishSpy ) . to . have . been . calledOnce ; // jshint ignore:line
382382 expect ( unsubscribeSpy ) . to . not . have . been . called ; // jshint ignore:line
@@ -422,7 +422,7 @@ describe('request/process tests', function () {
422422 done ( err ) ;
423423 } ) ;
424424 d . run ( ( ) => {
425- expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
425+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
426426 callback ( ) ;
427427 expect ( publishSpy ) . to . have . been . calledOnce ; // jshint ignore:line
428428 expect ( unsubscribeSpy ) . to . not . have . been . called ; // jshint ignore:line
@@ -470,7 +470,7 @@ describe('request/process tests', function () {
470470 done ( err ) ;
471471 } ) ;
472472 d . run ( ( ) => {
473- expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
473+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
474474 expect ( unsubscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
475475 expect ( subscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
476476 done ( ) ;
@@ -514,7 +514,7 @@ describe('request/process tests', function () {
514514 done ( err ) ;
515515 } ) ;
516516 d . run ( ( ) => {
517- expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
517+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
518518 expect ( unsubscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
519519 expect ( subscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
520520 callback ( ) ;
@@ -525,6 +525,151 @@ describe('request/process tests', function () {
525525 queue . process ( handler ) ;
526526 } ) ;
527527
528+ it ( 'should call connection unsubscribe in case of unsubscribing' , ( done ) => {
529+ var subscribed = false ;
530+ var unsubscribeSpy = sinon . spy ( ) ;
531+ var publishSpy = sinon . spy ( ) ;
532+ var subscribeSpy = sinon . spy ( ( name , options , callback ) => {
533+ process . nextTick ( ( ) => {
534+ if ( ! subscribed ) {
535+ subscribed = true ;
536+ callback ( Buffer ( JSON . stringify ( {
537+ data : {
538+ field : "value"
539+ }
540+ } ) , 'utf8' ) . toString ( 'base64' ) ) ;
541+ }
542+ } ) ;
543+ return 1 ;
544+ } ) ;
545+ var Queue = proxyquire ( '../lib/queue' , {
546+ 'nats' : {
547+ connect : ( ) => {
548+ return {
549+ unsubscribe : unsubscribeSpy ,
550+ subscribe : subscribeSpy ,
551+ publish : publishSpy
552+ } ;
553+ }
554+ }
555+ } ) ;
556+ var queue = new Queue ( "myChannel" , { workers : 2 } ) ;
557+ var handler = sinon . spy ( ( job , callback ) => {
558+ var d = domain . create ( ) ;
559+ d . on ( 'error' , ( err ) => {
560+ done ( err ) ;
561+ } ) ;
562+ d . run ( ( ) => {
563+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
564+ callback ( ) ;
565+ expect ( publishSpy ) . to . have . been . calledOnce ; // jshint ignore:line
566+ expect ( unsubscribeSpy ) . to . not . have . been . called ; // jshint ignore:line
567+ callback ( ) ;
568+ unsubscribe ( ) ;
569+ expect ( unsubscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
570+ done ( ) ;
571+ } ) ;
572+ } ) ;
573+ var unsubscribe = queue . process ( handler ) ; // jshint ignore:line
574+ } ) ;
575+
576+ it ( 'should not succeed to subscribe again in case unsubscribe was called and after that a handler of a previous request finishes its execution and tries to re-subscribe' , ( done ) => {
577+ var subscribed = false ;
578+ var unsubscribeSpy = sinon . spy ( ) ;
579+ var publishSpy = sinon . spy ( ) ;
580+ var subscribeSpy = sinon . spy ( ( name , options , callback ) => {
581+ setTimeout ( ( ) => {
582+ if ( ! subscribed ) {
583+ subscribed = true ;
584+ callback ( Buffer ( JSON . stringify ( {
585+ data : {
586+ field : "value"
587+ }
588+ } ) , 'utf8' ) . toString ( 'base64' ) ) ;
589+ }
590+ } , 500 ) ;
591+ return 1 ;
592+ } ) ;
593+ var Queue = proxyquire ( '../lib/queue' , {
594+ 'nats' : {
595+ connect : ( ) => {
596+ return {
597+ unsubscribe : unsubscribeSpy ,
598+ subscribe : subscribeSpy ,
599+ publish : publishSpy
600+ } ;
601+ }
602+ }
603+ } ) ;
604+ var queue = new Queue ( "myChannel" , { workers : 2 } ) ;
605+ var handler = sinon . spy ( ( job , callback ) => {
606+ var d = domain . create ( ) ;
607+ d . on ( 'error' , ( err ) => {
608+ done ( err ) ;
609+ } ) ;
610+ d . run ( ( ) => {
611+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
612+ callback ( ) ;
613+ expect ( publishSpy ) . to . have . been . calledOnce ; // jshint ignore:line
614+ expect ( unsubscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
615+ expect ( subscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
616+ callback ( ) ;
617+ done ( ) ;
618+ } ) ;
619+ } ) ;
620+ var unsubscribe = queue . process ( handler ) ;
621+ unsubscribe ( ) ;
622+ } ) ;
623+
624+ it ( 'should subscribe again in case worker reached max, completed and only after that unsubscribe was called' , ( done ) => {
625+ var subscribed = false ;
626+ var unsubscribeSpy = sinon . spy ( ) ;
627+ var publishSpy = sinon . spy ( ) ;
628+ var subscribeSpy = sinon . spy ( ( name , options , callback ) => {
629+ setTimeout ( ( ) => {
630+ if ( ! subscribed ) {
631+ subscribed = true ;
632+ callback ( Buffer ( JSON . stringify ( {
633+ data : {
634+ field : "value"
635+ }
636+ } ) , 'utf8' ) . toString ( 'base64' ) ) ;
637+ }
638+ } , 500 ) ;
639+ return 1 ;
640+ } ) ;
641+ var Queue = proxyquire ( '../lib/queue' , {
642+ 'nats' : {
643+ connect : ( ) => {
644+ return {
645+ unsubscribe : unsubscribeSpy ,
646+ subscribe : subscribeSpy ,
647+ publish : publishSpy
648+ } ;
649+ }
650+ }
651+ } ) ;
652+ var queue = new Queue ( "myChannel" , { workers : 1 } ) ;
653+ var handler = sinon . spy ( ( job , callback ) => {
654+ var d = domain . create ( ) ;
655+ d . on ( 'error' , ( err ) => {
656+ done ( err ) ;
657+ } ) ;
658+ d . run ( ( ) => {
659+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
660+ callback ( ) ;
661+ expect ( publishSpy ) . to . have . been . calledOnce ; // jshint ignore:line
662+ expect ( unsubscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
663+ expect ( subscribeSpy ) . to . have . been . calledTwice ; // jshint ignore:line
664+ unsubscribe ( ) ;
665+ expect ( unsubscribeSpy ) . to . have . been . calledTwice ; // jshint ignore:line
666+ callback ( ) ;
667+ done ( ) ;
668+ } ) ;
669+ } ) ;
670+ var unsubscribe = queue . process ( handler ) ; // jshint ignore:line
671+ } ) ;
672+
528673 } ) ;
529674
530675 describe ( 'negative tests' , ( ) => {
@@ -571,7 +716,7 @@ describe('request/process tests', function () {
571716 done ( err ) ;
572717 } ) ;
573718 d . run ( ( ) => {
574- expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
719+ expect ( job . request ) . to . deep . equal ( { field : 'value' } ) ;
575720 expect ( subscribeSpy ) . to . have . been . calledOnce ; // jshint ignore:line
576721 callback ( new Error ( "handling error" ) ) ;
577722 } ) ;
0 commit comments