97 lines
3.0 KiB
TypeScript
97 lines
3.0 KiB
TypeScript
import * as grpc from '@grpc/grpc-js';
|
|
import { kordProto } from '@kord/grpc-contracts';
|
|
|
|
// In-Memory Test Service Definition
|
|
class MockBotDashboardService {
|
|
public Ping(call: any, callback: any) {
|
|
if (!call.request.message) {
|
|
return callback({ code: grpc.status.INVALID_ARGUMENT, details: 'Message is required' });
|
|
}
|
|
callback(null, { reply: `Pong to ${call.request.message}` });
|
|
}
|
|
|
|
public GetGuildChannels(call: any, callback: any) {
|
|
const guildId = call.request.guildId;
|
|
if (guildId === '123') {
|
|
callback(null, {
|
|
channels: [
|
|
{ id: '1', name: 'general', type: '0' },
|
|
{ id: '2', name: 'voice', type: '2' },
|
|
],
|
|
});
|
|
} else {
|
|
callback({ code: grpc.status.NOT_FOUND, details: 'Guild not found' });
|
|
}
|
|
}
|
|
}
|
|
|
|
describe('gRPC Integration: BotDashboardService', () => {
|
|
let server: grpc.Server;
|
|
let client: any;
|
|
|
|
beforeAll((done) => {
|
|
// 1. Setup gRPC In-Memory Server for Tests
|
|
server = new grpc.Server();
|
|
const serviceImpl = new MockBotDashboardService();
|
|
|
|
server.addService((kordProto as any).BotDashboardService.service, {
|
|
Ping: serviceImpl.Ping.bind(serviceImpl),
|
|
GetGuildChannels: serviceImpl.GetGuildChannels.bind(serviceImpl),
|
|
});
|
|
|
|
server.bindAsync('0.0.0.0:50052', grpc.ServerCredentials.createInsecure(), (err, port) => {
|
|
if (err) return done(err);
|
|
|
|
// 2. Setup Client pointing to the test server
|
|
client = new (kordProto as any).BotDashboardService(
|
|
`localhost:${port}`,
|
|
grpc.credentials.createInsecure()
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
|
|
afterAll(() => {
|
|
server.forceShutdown();
|
|
client.close();
|
|
});
|
|
|
|
describe('When pinging the gRPC layer', () => {
|
|
it('Then it should echo back with Pong', (done) => {
|
|
client.Ping({ message: 'BDD_Test' }, (err: any, response: any) => {
|
|
expect(err).toBeNull();
|
|
expect(response.reply).toBe('Pong to BDD_Test');
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Then it should throw an INVALID_ARGUMENT error if message is missing', (done) => {
|
|
client.Ping({ message: '' }, (err: any, response: any) => {
|
|
expect(err).not.toBeNull();
|
|
expect(err.code).toBe(grpc.status.INVALID_ARGUMENT);
|
|
expect(response).toBeUndefined();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('When fetching Guild Channels', () => {
|
|
it('Then it should return channel boundaries if guild exists', (done) => {
|
|
client.GetGuildChannels({ guildId: '123' }, (err: any, response: any) => {
|
|
expect(err).toBeNull();
|
|
expect(response.channels).toHaveLength(2);
|
|
expect(response.channels[0].name).toBe('general');
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Then it should return NOT_FOUND if guild does not exist', (done) => {
|
|
client.GetGuildChannels({ guildId: '999' }, (err: any, response: any) => {
|
|
expect(err).not.toBeNull();
|
|
expect(err.code).toBe(grpc.status.NOT_FOUND);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|