Skip to content

Commit dcbeb59

Browse files
committed
Implements @Hexenon server tests after botched merge.
1 parent e2ac748 commit dcbeb59

2 files changed

Lines changed: 151 additions & 27 deletions

File tree

integration/microservices/e2e/sum-kafka.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,18 @@ describe('Kafka transport', () => {
156156
.expect(200);
157157
});
158158

159+
it(`/POST (sync command create user) Concurrency Test`, async () => {
160+
const promises = [];
161+
for (let concurrencyKey = 0; concurrencyKey < 100; concurrencyKey++) {
162+
const innerUserDto = JSON.parse(JSON.stringify(userDto));
163+
innerUserDto.name += `+${concurrencyKey}`;
164+
promises.push(request(server).post('/user').send(userDto).expect(200));
165+
}
166+
await Promise.all(promises);
167+
});
168+
159169
after(`Stopping Kafka app`, async () => {
160170
await app.close();
161171
});
172+
162173
}).timeout(30000);
Lines changed: 140 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,152 @@
11
import { expect } from 'chai';
22
import * as sinon from 'sinon';
3-
import { NO_MESSAGE_HANDLER } from '../../constants';
4-
import { ServerTCP } from '../../server/server-tcp';
53
import { 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

817
describe('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

Comments
 (0)