UNPKG

@joktec/kafka

Version:

JokTec - Kafka Service

81 lines 4.74 kB
"use strict"; 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