blob: 8aedb56f925aad618a197c6b9df7c68295de5384 [file]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { after, describe, it } from 'node:test';
import assert from 'node:assert/strict';
import { SingleClient } from '../client/client.js';
import { Consumer, PollingStrategy, Partitioning } from '../wire/index.js';
import { generateMessages } from '../tcp.sm.utils.js';
import { getIggyAddress } from '../tcp.sm.utils.js';
describe('e2e -> consumer-group', async () => {
const [host, port] = getIggyAddress();
const c = new SingleClient({
transport: 'TCP',
options: { host, port },
credentials: { username: 'iggy', password: 'iggy' }
});
const streamName = 'e2e-consumer-group-stream-543';
const topicName = 'e2e-consumer-group-topic-543';
const groupName = 'e2e-cg-cg-1';
let payloadLength = 0;
await c.stream.create({ name: streamName });
const topic = {
streamId: streamName,
name: topicName,
partitionCount: 3,
compressionAlgorithm: 1
};
await c.topic.create(topic);
const group = {
streamId: streamName, topicId: topicName, name: groupName
};
it('e2e -> consumer-group::create', async () => {
const g = await c.group.create(group);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { id, ...rest } = g;
assert.deepEqual(
rest, { name: groupName, partitionsCount: 3, membersCount: 0 }
);
});
it('e2e -> consumer-group::get', async () => {
const gg = await c.group.get({
streamId: streamName, topicId: topicName, groupId: groupName
});
assert.ok(gg);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { id, ...rest } = gg;
assert.deepEqual(
rest, { name: groupName, partitionsCount: 3, membersCount: 0 }
);
});
it('e2e -> consumer-group::list', async () => {
const lg = await c.group.list({ streamId: streamName, topicId: topicName });
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [{ id, ...rest }] = lg;
assert.deepEqual(
[rest],
[{ name: groupName, partitionsCount: 3, membersCount: 0 }]
);
});
it('e2e -> consumer-stream::send-messages', async () => {
const ct = 1000;
const mn = 200;
for (let i = 0; i <= ct; i += mn) {
assert.ok(await c.message.send({
streamId: streamName,
topicId: topicName,
messages: generateMessages(mn),
partition: Partitioning.MessageKey(`key-${ i % 300 }`)
}));
}
payloadLength = ct;
});
it('e2e -> consumer-group::join', async () => {
assert.ok(await c.group.join({
streamId: streamName, topicId: topicName, groupId: groupName
}));
});
it('e2e -> consumer-group::poll', async () => {
const pollReq = {
streamId: streamName,
topicId: topicName,
consumer: Consumer.Group(groupName),
partitionId: null,
pollingStrategy: PollingStrategy.Next,
count: 100,
autocommit: true
};
let ct = 0;
while (ct < payloadLength) {
const { messages, ...resp } = await c.message.poll(pollReq);
// console.log('POLL', messages.length, 'R/C', resp.count, messages, resp, ct);
assert.equal(messages.length, resp.count);
ct += messages.length;
}
assert.equal(ct, payloadLength);
const { count } = await c.message.poll(pollReq);
assert.equal(count, 0);
});
it('e2e -> consumer-group::leave', async () => {
assert.ok(await c.group.leave({
streamId: streamName, topicId: topicName, groupId: groupName
}));
});
it('e2e -> consumer-group::delete', async () => {
assert.ok(await c.group.delete({
streamId: streamName, topicId: topicName, groupId: groupName
}));
});
after(async () => {
assert.ok(await c.stream.delete({ streamId: streamName }));
assert.ok(await c.session.logout());
c.destroy();
});
});