11import { expect } from 'chai' ;
22import * as sinon from 'sinon' ;
3- import { NO_MESSAGE_HANDLER } from '../../constants' ;
4- import { ServerTCP } from '../../server/server-tcp' ;
53import { ServerKafka } from '../../server' ;
6- import { Consumer , IHeaders , KafkaMessage } from '../../external/kafka.interface' ;
4+ import { Logger } from '@nestjs/common' ;
5+ import { MessageHandler } from '@nestjs/microservices' ;
6+ import { Observable } from 'rxjs' ;
7+ import { KafkaSerializer } from '../../helpers' ;
8+ import { EachMessagePayload , KafkaMessage } from '@nestjs/microservices/external/kafka.interface' ;
9+ import { KafkaHeaders } from '../../enums' ;
10+
11+ class NoopLogger extends Logger {
12+ log ( message : any , context ?: string ) : void { }
13+ error ( message : any , trace ?: string , context ?: string ) : void { }
14+ warn ( message : any , context ?: string ) : void { }
15+ }
716
817describe ( 'ServerKafka' , ( ) => {
918 let server : ServerKafka ;
1019
20+ let callback : sinon . SinonSpy ;
21+ let bindEventsStub : sinon . SinonStub ;
22+ let connect : sinon . SinonSpy ;
23+ let subscribe : sinon . SinonSpy ;
24+ let run : sinon . SinonSpy ;
25+ let consumerStub : sinon . SinonStub ;
26+ let producerStub : sinon . SinonStub ;
27+ let client ;
1128 beforeEach ( ( ) => {
1229 server = new ServerKafka ( { } ) ;
30+ callback = sinon . spy ( ) ;
31+ connect = sinon . spy ( ) ;
32+ subscribe = sinon . spy ( ) ;
33+ run = sinon . spy ( ) ;
34+
35+ consumerStub = sinon . stub ( server , 'consumer' )
36+ . callsFake ( ( ) => {
37+ return {
38+ connect,
39+ subscribe,
40+ run,
41+ } ;
42+ } ) ;
43+ producerStub = sinon . stub ( server , 'producer' )
44+ . callsFake ( ( ) => {
45+ return {
46+ connect,
47+ } ;
48+ } ) ;
49+ client = {
50+ consumer : consumerStub ,
51+ producer : producerStub ,
52+ } ;
53+ sinon . stub ( server , 'createClient' ) . callsFake ( ( ) => client ) ;
54+ } ) ;
55+
56+ const messageHandler : MessageHandler = ( data ) : Promise < Observable < any > > => {
57+ Logger . log ( 'something happened' ) ;
58+ const ob = new Observable ( ) ;
59+ ob . subscribe ( obResult => {
60+ Logger . log ( 'something happened again' ) ;
61+ } ) ;
62+ return Promise . resolve ( ob ) ;
63+ } ;
64+
65+ const messageValue = Buffer . from ( 'test-message' ) ;
66+ const msg : KafkaMessage = {
67+ key : Buffer . from ( 'test.key' ) ,
68+ offset : '0' ,
69+ size : messageValue . length ,
70+ value : messageValue ,
71+ timestamp : Date . now ( ) . toString ( ) ,
72+ attributes : 1 ,
73+ headers : {
74+ [ KafkaHeaders . CORRELATION_ID ] : Buffer . from ( 'test-id' ) ,
75+ [ KafkaHeaders . REPLY_TOPIC ] : Buffer . from ( 'test.key.reply' ) ,
76+ [ KafkaHeaders . REPLY_PARTITION ] : Buffer . from ( '1' ) ,
77+ }
78+ } ;
79+
80+ describe ( 'close' , ( ) => {
81+ it ( 'should close server' , ( ) => {
82+ server . close ( ) ;
83+ expect ( server . consumer ) . to . be . null ;
84+ expect ( server . producer ) . to . be . null ;
85+ expect ( server . client ) . to . be . null ;
86+ } ) ;
87+ } ) ;
88+
89+ describe ( 'listen' , ( ) => {
90+
91+ it ( 'should call "bindEvents"' , async ( ) => {
92+ bindEventsStub = sinon
93+ . stub ( server , 'bindEvents' )
94+ . callsFake ( ( ) => ( { } as any ) ) ;
95+ await server . listen ( callback ) ;
96+ expect ( bindEventsStub . called ) . to . be . true ;
97+ } ) ;
98+ it ( 'should call "client.start"' , async ( ) => {
99+ await server . listen ( callback ) ;
100+ expect ( client . producer . called ) . to . be . true ;
101+ } ) ;
102+ it ( 'should call callback' , async ( ) => {
103+ await server . listen ( callback ) ;
104+ expect ( callback . called ) . to . be . true ;
105+ } ) ;
106+ } ) ;
107+
108+ describe ( 'bindEvents' , ( ) => {
109+ it ( 'should not call subscribe nor run on consumer when there are no messageHandlers' , async ( ) => {
110+ ( server as any ) . logger = new NoopLogger ( ) ;
111+ await server . listen ( callback ) ;
112+ await server . bindEvents ( server . consumer ) ;
113+ expect ( subscribe . called ) . to . be . false ;
114+ expect ( run . called ) . to . be . true ;
115+ expect ( connect . called ) . to . be . true ;
116+ } ) ;
117+ it ( 'should call subscribe and run on consumer when there are messageHandlers' , async ( ) => {
118+ ( server as any ) . logger = new NoopLogger ( ) ;
119+ await server . listen ( callback ) ;
120+ await server . bindEvents ( server . consumer ) ;
121+ server . addHandler ( 'example.pattern' , messageHandler , false ) ;
122+ await server . bindEvents ( server . consumer ) ;
123+ expect ( subscribe . called ) . to . be . true ;
124+ expect ( run . called ) . to . be . true ;
125+ expect ( connect . called ) . to . be . true ;
126+ } ) ;
127+ } ) ;
128+
129+ describe ( 'Serializer' , ( ) => {
130+ it ( 'should serialize and deserialize the payload' , async ( ) => {
131+ const serializedMsg = KafkaSerializer . serialize < KafkaMessage > ( msg ) ;
132+ const unserializedMsg = KafkaSerializer . deserialize < KafkaMessage > ( serializedMsg ) ;
133+ expect ( unserializedMsg ) . to . be . deep . eq ( msg ) ;
134+ } ) ;
13135 } ) ;
14136
15- afterEach ( ( ) => {
16- server . close ( ) ;
137+ describe ( 'Messaging' , ( ) => {
138+ beforeEach ( ( ) => {
139+ sinon . stub ( server , 'getHandlerByPattern' )
140+ . callsFake ( ( ) => messageHandler ) ;
141+ } ) ;
142+ it ( 'should handleMessage correctly' , async ( ) => {
143+ await server . listen ( callback ) ;
144+ const payload : EachMessagePayload = {
145+ message : msg ,
146+ partition : 1 ,
147+ topic : 'test-topic'
148+ } ;
149+ await server . handleMessage ( payload ) ;
150+ } ) ;
17151 } ) ;
18- // describe('close', () => {
19- // it('should close server', () => {
20- // server.close();
21- // expect(server.consumer).to.be.null;
22- // expect(server.producer).to.be.null;
23- // expect(server.client).to.be.null;
24- // });
25- // });
26- // describe('listen', () => {
27- // it('should start server', async () => {
28- // const callback = sinon.spy();
29- // await server.listen(callback);
30- // expect(callback.called).to.be.true;
31- // });
32- // it('should have kafka, producer and consumer connected', async () => {
33- // await server.listen(() => {});
34- // expect(server.client).to.be.not.null;
35- // expect(server.producer).to.be.not.null;
36- // expect(server.consumer).to.be.not.null;
37- // });
38- // });
39- } ) ;
152+ } ) ;
0 commit comments