Skip to content

Commit eb95c9d

Browse files
committed
feat(ws-manual-ack): add unit tests
1 parent e992e2c commit eb95c9d

File tree

3 files changed

+80
-3
lines changed

3 files changed

+80
-3
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import 'reflect-metadata';
2+
import { expect } from 'chai';
3+
import { PARAM_ARGS_METADATA } from '../../constants';
4+
import { Ack } from '../../decorators/ack.decorator';
5+
import { WsParamtype } from '../../enums/ws-paramtype.enum';
6+
7+
class AckTest {
8+
public test(@Ack() ack: Function) {}
9+
}
10+
11+
describe('@Ack', () => {
12+
it('should enhance class with expected request metadata', () => {
13+
const argsMetadata = Reflect.getMetadata(
14+
PARAM_ARGS_METADATA,
15+
AckTest,
16+
'test',
17+
);
18+
19+
const expectedMetadata = {
20+
[`${WsParamtype.ACK}:0`]: {
21+
index: 0,
22+
data: undefined,
23+
pipes: [],
24+
},
25+
};
26+
expect(argsMetadata).to.be.eql(expectedMetadata);
27+
});
28+
});

packages/websockets/test/gateway-metadata-explorer.spec.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import { MetadataScanner } from '../../core/metadata-scanner';
44
import { WebSocketServer } from '../decorators/gateway-server.decorator';
55
import { WebSocketGateway } from '../decorators/socket-gateway.decorator';
66
import { SubscribeMessage } from '../decorators/subscribe-message.decorator';
7+
import { Ack } from '../decorators/ack.decorator';
78
import { GatewayMetadataExplorer } from '../gateway-metadata-explorer';
89

910
describe('GatewayMetadataExplorer', () => {
1011
const message = 'test';
1112
const secMessage = 'test2';
13+
const ackMessage = 'ack-test';
1214

1315
@WebSocketGateway()
1416
class Test {
@@ -28,6 +30,9 @@ describe('GatewayMetadataExplorer', () => {
2830
@SubscribeMessage(secMessage)
2931
public testSec() {}
3032

33+
@SubscribeMessage(ackMessage)
34+
public testWithAck(@Ack() ack: Function) {}
35+
3136
public noMessage() {}
3237
}
3338
let instance: GatewayMetadataExplorer;
@@ -61,9 +66,22 @@ describe('GatewayMetadataExplorer', () => {
6166
});
6267
it(`should return message mapping properties when "isMessageMapping" metadata is not undefined`, () => {
6368
const metadata = instance.exploreMethodMetadata(test, 'test')!;
64-
expect(metadata).to.have.keys(['callback', 'message', 'methodName']);
69+
expect(metadata).to.have.keys([
70+
'callback',
71+
'message',
72+
'methodName',
73+
'isAckHandledManually',
74+
]);
6575
expect(metadata.message).to.eql(message);
6676
});
77+
it('should set "isAckHandledManually" property to true when @Ack decorator is used', () => {
78+
const metadata = instance.exploreMethodMetadata(test, 'testWithAck')!;
79+
expect(metadata.isAckHandledManually).to.be.true;
80+
});
81+
it('should set "isAckHandledManually" property to false when @Ack decorator is not used', () => {
82+
const metadata = instance.exploreMethodMetadata(test, 'test')!;
83+
expect(metadata.isAckHandledManually).to.be.false;
84+
});
6785
});
6886
describe('scanForServerHooks', () => {
6987
it(`should return properties with @Client decorator`, () => {

packages/websockets/test/web-sockets-controller.spec.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ describe('WebSocketsController', () => {
135135
message: 'message',
136136
methodName: 'methodName',
137137
callback: handlerCallback,
138+
isAckHandledManually: false,
138139
},
139140
];
140141
server = { server: 'test' };
@@ -173,6 +174,7 @@ describe('WebSocketsController', () => {
173174
message: 'message',
174175
methodName: 'methodName',
175176
callback: messageHandlerCallback,
177+
isAckHandledManually: false,
176178
},
177179
]);
178180
});
@@ -188,11 +190,13 @@ describe('WebSocketsController', () => {
188190
methodName: 'findOne',
189191
message: 'find',
190192
callback: null!,
193+
isAckHandledManually: false,
191194
},
192195
{
193196
methodName: 'create',
194197
message: 'insert',
195198
callback: null!,
199+
isAckHandledManually: false,
196200
},
197201
];
198202
const insertEntrypointDefinitionSpy = sinon.spy(
@@ -413,6 +417,7 @@ describe('WebSocketsController', () => {
413417
expect(subscribe.called).to.be.true;
414418
});
415419
});
420+
416421
describe('subscribeMessages', () => {
417422
const gateway = new Test();
418423

@@ -423,14 +428,40 @@ describe('WebSocketsController', () => {
423428
client = { on: onSpy, off: onSpy };
424429

425430
handlers = [
426-
{ message: 'test', callback: { bind: () => 'testCallback' } },
427-
{ message: 'test2', callback: { bind: () => 'testCallback2' } },
431+
{
432+
message: 'test',
433+
callback: { bind: () => 'testCallback' },
434+
isAckHandledManually: true,
435+
},
436+
{
437+
message: 'test2',
438+
callback: { bind: () => 'testCallback2' },
439+
isAckHandledManually: false,
440+
},
428441
];
429442
});
430443
it('should bind each handler to client', () => {
431444
instance.subscribeMessages(handlers, client, gateway);
432445
expect(onSpy.calledTwice).to.be.true;
433446
});
447+
it('should pass "isAckHandledManually" flag to the adapter', () => {
448+
const adapter = config.getIoAdapter();
449+
const bindMessageHandlersSpy = sinon.spy(adapter, 'bindMessageHandlers');
450+
451+
instance.subscribeMessages(handlers, client, gateway);
452+
453+
const handlersPassedToAdapter = bindMessageHandlersSpy.firstCall.args[1];
454+
455+
expect(handlersPassedToAdapter[0].message).to.equal(handlers[0].message);
456+
expect(handlersPassedToAdapter[0].isAckHandledManually).to.equal(
457+
handlers[0].isAckHandledManually,
458+
);
459+
460+
expect(handlersPassedToAdapter[1].message).to.equal(handlers[1].message);
461+
expect(handlersPassedToAdapter[1].isAckHandledManually).to.equal(
462+
handlers[1].isAckHandledManually,
463+
);
464+
});
434465
});
435466
describe('pickResult', () => {
436467
describe('when deferredResult contains value which', () => {

0 commit comments

Comments
 (0)