@@ -7,49 +7,37 @@ import { ProcessService } from '@/process/process.service';
77import { WebhookService } from '@/notify/webhook/webhook.service' ;
88import { AmqpService } from '@/notify/amqp/ampq.service' ;
99
10+ jest . mock ( '@letsflow/core/process' , ( ) => ( {
11+ determineTrigger : jest . fn ( ) ,
12+ } ) ) ;
13+ import { determineTrigger } from '@letsflow/core/process' ;
14+
1015describe ( 'NotifyService' , ( ) => {
1116 let service : NotifyService ;
17+ let config : { get : jest . Mock } ;
18+ let processes : { step : jest . Mock } ;
19+ let amqp : { notify : jest . Mock } ;
20+ let webhook : { notify : jest . Mock } ;
21+ let zeromq : { notify : jest . Mock } ;
22+ let logger : { error : jest . Mock } ;
1223
1324 beforeEach ( async ( ) => {
25+ config = { get : jest . fn ( ) } as any ;
26+ processes = { step : jest . fn ( ) } as any ;
27+ amqp = { notify : jest . fn ( ) } as any ;
28+ webhook = { notify : jest . fn ( ) } as any ;
29+ zeromq = { notify : jest . fn ( ) } as any ;
30+ logger = { error : jest . fn ( ) } as any ;
31+
1432 const module : TestingModule = await Test . createTestingModule ( {
1533 providers : [
1634 NotifyService ,
17- {
18- provide : ConfigService ,
19- useValue : {
20- get : jest . fn ( ) ,
21- } ,
22- } ,
23- {
24- provide : ProcessService ,
25- useValue : {
26- get : jest . fn ( ) ,
27- } ,
28- } ,
29- {
30- provide : AmqpService ,
31- useValue : {
32- notify : jest . fn ( ) ,
33- } ,
34- } ,
35- {
36- provide : WebhookService ,
37- useValue : {
38- notify : jest . fn ( ) ,
39- } ,
40- } ,
41- {
42- provide : ZeromqService ,
43- useValue : {
44- notify : jest . fn ( ) ,
45- } ,
46- } ,
47- {
48- provide : Logger ,
49- useValue : {
50- error : jest . fn ( ) ,
51- } ,
52- } ,
35+ { provide : ConfigService , useValue : config } ,
36+ { provide : ProcessService , useValue : processes } ,
37+ { provide : AmqpService , useValue : amqp } ,
38+ { provide : WebhookService , useValue : webhook } ,
39+ { provide : ZeromqService , useValue : zeromq } ,
40+ { provide : Logger , useValue : logger } ,
5341 ] ,
5442 } ) . compile ( ) ;
5543
@@ -59,4 +47,75 @@ describe('NotifyService', () => {
5947 it ( 'should be defined' , ( ) => {
6048 expect ( service ) . toBeDefined ( ) ;
6149 } ) ;
50+
51+ describe ( 'getProvider' , ( ) => {
52+ it ( 'returns provider based on config' , ( ) => {
53+ config . get . mockReturnValue ( {
54+ email : { provider : 'amqp' } ,
55+ hook : { provider : 'webhook' } ,
56+ zmq : { provider : 'zeromq' } ,
57+ } ) ;
58+ expect ( ( service as any ) [ 'getProvider' ] ( 'email' ) ) . toBe ( amqp ) ;
59+ expect ( ( service as any ) [ 'getProvider' ] ( 'hook' ) ) . toBe ( webhook ) ;
60+ expect ( ( service as any ) [ 'getProvider' ] ( 'zmq' ) ) . toBe ( zeromq ) ;
61+ } ) ;
62+
63+ it ( 'throws when service not configured' , ( ) => {
64+ config . get . mockReturnValue ( { } ) ;
65+ expect ( ( ) => ( service as any ) [ 'getProvider' ] ( 'foo' ) ) . toThrow ( "Service 'foo' not configured" ) ;
66+ } ) ;
67+
68+ it ( 'throws when provider unspecified' , ( ) => {
69+ config . get . mockReturnValue ( { foo : { } } ) ;
70+ expect ( ( ) => ( service as any ) [ 'getProvider' ] ( 'foo' ) ) . toThrow ( "Provider not specified for service 'foo'" ) ;
71+ } ) ;
72+
73+ it ( 'throws on unsupported provider' , ( ) => {
74+ config . get . mockReturnValue ( { foo : { provider : 'unknown' } } ) ;
75+ expect ( ( ) => ( service as any ) [ 'getProvider' ] ( 'foo' ) ) . toThrow ( "Unsupported provider 'unknown' for service 'foo'" ) ;
76+ } ) ;
77+ } ) ;
78+
79+ describe ( 'step' , ( ) => {
80+ it ( 'calls processes.step when action determined' , async ( ) => {
81+ ( determineTrigger as unknown as jest . Mock ) . mockReturnValue ( 'complete' ) ;
82+ const process : any = { current : { key : 'initial' } } ;
83+ // Access private for test
84+ await ( service as any ) [ 'step' ] ( process , 'email' , { ok : true } ) ;
85+ expect ( processes . step ) . toHaveBeenCalledWith ( process , 'complete' , { key : 'service:email' } , { ok : true } ) ;
86+ } ) ;
87+
88+ it ( 'throws if action cannot be determined' , async ( ) => {
89+ ( determineTrigger as unknown as jest . Mock ) . mockReturnValue ( undefined ) ;
90+ const process : any = { current : { key : 'initial' } } ;
91+ await expect (
92+ // Access private for test
93+ ( service as any ) [ 'step' ] ( process , 'email' , { ok : true } ) ,
94+ ) . rejects . toThrow ( "Service 'email' gave a response, but unable to determine which action was executed" ) ;
95+ } ) ;
96+ } ) ;
97+
98+ describe ( 'notify' , ( ) => {
99+ it ( 'logs error if provider throws' , async ( ) => {
100+ config . get . mockReturnValue ( { email : { provider : 'amqp' } } ) ;
101+ amqp . notify . mockRejectedValue ( new Error ( 'boom' ) ) ;
102+ await service . notify ( { } as any , { service : 'email' } as any ) ;
103+ expect ( logger . error ) . toHaveBeenCalledWith ( 'boom' ) ;
104+ } ) ;
105+
106+ it ( 'steps when provider returns response' , async ( ) => {
107+ config . get . mockReturnValue ( { email : { provider : 'amqp' } } ) ;
108+ amqp . notify . mockResolvedValue ( { ok : true } ) ;
109+ ( determineTrigger as unknown as jest . Mock ) . mockReturnValue ( 'complete' ) ;
110+ await service . notify ( { } as any , { service : 'email' } as any ) ;
111+ expect ( processes . step ) . toHaveBeenCalled ( ) ;
112+ } ) ;
113+
114+ it ( 'does nothing when provider returns undefined' , async ( ) => {
115+ config . get . mockReturnValue ( { email : { provider : 'amqp' } } ) ;
116+ amqp . notify . mockResolvedValue ( undefined ) ;
117+ await service . notify ( { } as any , { service : 'email' } as any ) ;
118+ expect ( processes . step ) . not . toHaveBeenCalled ( ) ;
119+ } ) ;
120+ } ) ;
62121} ) ;
0 commit comments