@joktec/kafka
Version:
JokTec - Kafka Service
81 lines • 4.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const globals_1 = require("@jest/globals");
const ts_jest_1 = require("@golevelup/ts-jest");
const kafkajs_1 = require("kafkajs");
const kafkajs_2 = require("../__mocks__/kafkajs");
const kafka_config_1 = require("../kafka.config");
const kafka_metric_1 = require("../kafka.metric");
const kafka_service_1 = require("../kafka.service");
class TestKafkaService extends kafka_service_1.KafkaService {
boot(config) {
return this.clientInit(config);
}
exposeStop(client, conId) {
return this.stop(client, conId);
}
}
const attachServices = (service, metric) => {
Object.assign(service, {
PinoLogger: (0, ts_jest_1.createMock)(),
ConfigService: (0, ts_jest_1.createMock)({ get: globals_1.jest.fn().mockReturnValue({ retries: 0 }) }),
KafkaMetricService: metric,
logService: (0, ts_jest_1.createMock)(),
configService: (0, ts_jest_1.createMock)(),
});
return service;
};
(0, globals_1.describe)('KafkaService', () => {
let service;
let metric;
(0, globals_1.beforeEach)(async () => {
globals_1.jest.clearAllMocks();
kafkajs_2.mockKafkaInstances.length = 0;
kafkajs_2.mockProducerInstances.length = 0;
kafkajs_2.mockConsumerInstances.length = 0;
metric = { send: globals_1.jest.fn(), receive: globals_1.jest.fn() };
service = attachServices(new TestKafkaService(metric), metric);
await service.boot(new kafka_config_1.KafkaConfig({ conId: 'default', brokers: ['localhost:9092'] }));
});
(0, globals_1.it)('should initialize KafkaJS client and create producers lazily', async () => {
await service.send('article.created', ['one', Buffer.from('two'), { key: 'k', value: 'three' }]);
(0, globals_1.expect)(kafkajs_1.Kafka).toHaveBeenCalledWith(globals_1.expect.objectContaining({ brokers: ['localhost:9092'], clientId: 'default' }));
(0, globals_1.expect)(kafkajs_2.mockKafkaInstances[0].producer).toHaveBeenCalledWith(globals_1.expect.objectContaining({ createPartitioner: globals_1.expect.any(Function) }));
(0, globals_1.expect)(kafkajs_2.mockProducerInstances[0].connect).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(kafkajs_2.mockProducerInstances[0].send).toHaveBeenCalledWith({
topic: 'article.created',
messages: [{ value: 'one' }, { value: Buffer.from('two') }, { key: 'k', value: 'three' }],
});
});
(0, globals_1.it)('should consume messages and track success/error metrics', async () => {
const callback = globals_1.jest
.fn()
.mockResolvedValueOnce(undefined)
.mockRejectedValueOnce(new Error('fail'));
await service.consume(['article.created'], 'article-group', callback, { fromBeginning: true });
const runConfig = kafkajs_2.mockConsumerInstances[0].run.mock.calls[0][0];
(0, globals_1.expect)(kafkajs_2.mockKafkaInstances[0].consumer).toHaveBeenCalledWith({ groupId: 'article-group' });
(0, globals_1.expect)(kafkajs_2.mockConsumerInstances[0].subscribe).toHaveBeenCalledWith({
topics: ['article.created'],
fromBeginning: true,
});
const payload = { topic: 'article.created', partition: 0, message: { value: Buffer.from('payload') } };
await runConfig.eachMessage(payload);
await runConfig.eachMessage(payload);
(0, globals_1.expect)(callback).toHaveBeenCalledTimes(2);
(0, globals_1.expect)(metric.receive).toHaveBeenCalledWith('consume', kafka_metric_1.KafkaMetricStatus.SUCCESS, 'article.created-0', 'default');
(0, globals_1.expect)(metric.receive).toHaveBeenCalledWith('consume', kafka_metric_1.KafkaMetricStatus.ERROR, 'article.created-0', 'default');
});
(0, globals_1.it)('should send batches with producerKey and disconnect cached producers and consumers on stop', async () => {
await service.sendBatch({ producerKey: 'bulk', topicMessages: [{ topic: 'article.bulk', messages: [] }] });
await service.consume(['article.bulk'], 'bulk-group', globals_1.jest.fn().mockResolvedValue(undefined));
await service.exposeStop(service.getClient(), 'default');
(0, globals_1.expect)(kafkajs_2.mockProducerInstances[0].sendBatch).toHaveBeenCalledWith({
producerKey: 'bulk',
topicMessages: [{ topic: 'article.bulk', messages: [] }],
});
(0, globals_1.expect)(kafkajs_2.mockProducerInstances[0].disconnect).toHaveBeenCalled();
(0, globals_1.expect)(kafkajs_2.mockConsumerInstances[0].disconnect).toHaveBeenCalled();
});
});
//# sourceMappingURL=kafka.service.spec.js.map