@@ -5,18 +5,20 @@ import { UserService } from '../../../src/services/UserService';
55import { container } from 'tsyringe' ;
66import { mock , instance , reset , spy , when , objectContaining , verify , anything } from 'ts-mockito' ;
77import * as auth from '../../../src/util/auth' ;
8+ import GatewayController from '../../../src/controllers/GatewayController' ;
89
910let spiedVerifyJWT : typeof auth ;
1011let wss : MockWebSocketServer ;
1112let mockedUserService : UserService ;
13+ let gatewayController : GatewayController ;
1214
1315beforeAll ( ( ) => {
1416 spiedVerifyJWT = spy ( auth ) ;
1517 mockedUserService = mock ( UserService ) ;
1618 container . clearInstances ( ) ;
1719 container . register < UserService > ( UserService , { useValue : instance ( mockedUserService ) } ) ;
1820 wss = new MockWebSocketServer ( ) ;
19- createGateway ( wss ) ;
21+ gatewayController = createGateway ( wss ) ;
2022} ) ;
2123
2224function createWebSocket ( ) : Promise < MockWebSocket > {
@@ -27,18 +29,18 @@ function createWebSocket(): Promise<MockWebSocket> {
2729 } ) ;
2830}
2931
30- let ws : MockWebSocket ;
32+ let sockets : MockWebSocket [ ] ;
3133
3234beforeEach ( async ( ) => {
3335 reset ( spiedVerifyJWT ) ;
3436 spiedVerifyJWT = spy ( auth ) ;
3537 reset ( mockedUserService ) ;
36- ws = await createWebSocket ( ) ;
38+ sockets = await Promise . all ( [ 0 , 0 ] . map ( ( ) => createWebSocket ( ) ) ) ;
3739 await wait ( ) ;
3840} ) ;
3941
4042afterEach ( async ( ) => {
41- await ws . close ( ) ;
43+ await Promise . all ( sockets . map ( ws => ws . close ( ) ) ) ;
4244 await wait ( ) ;
4345} ) ;
4446
@@ -51,18 +53,62 @@ function wait() {
5153describe ( 'GatewayController' , ( ) => {
5254 describe ( 'general' , ( ) => {
5355 test ( 'Closes for unknown JSON' , async ( ) => {
54- await ws . send ( JSON . stringify ( { z : 2 } ) ) ;
55- await expect ( ws . nextMessage ) . rejects . toThrow ( ) ;
56+ await sockets [ 0 ] . send ( JSON . stringify ( { z : 2 } ) ) ;
57+ await expect ( sockets [ 0 ] . nextMessage ) . rejects . toThrow ( ) ;
5658 } ) ;
5759
5860 test ( 'Closes for unknown packet' , async ( ) => {
59- await ws . send ( JSON . stringify ( { type : - 1 } ) ) ;
60- await expect ( ws . nextMessage ) . rejects . toThrow ( ) ;
61+ await sockets [ 0 ] . send ( JSON . stringify ( { type : - 1 } ) ) ;
62+ await expect ( sockets [ 0 ] . nextMessage ) . rejects . toThrow ( ) ;
6163 } ) ;
6264
6365 test ( 'Closes for invalid packet' , async ( ) => {
64- await ws . send ( 'garbage' ) ;
65- await expect ( ws . nextMessage ) . rejects . toThrow ( ) ;
66+ await sockets [ 0 ] . send ( 'garbage' ) ;
67+ await expect ( sockets [ 0 ] . nextMessage ) . rejects . toThrow ( ) ;
68+ } ) ;
69+
70+ test ( 'broadcast' , async ( ) => {
71+ // Authenticate the first socket
72+ gatewayController . authenticatedClients . set ( sockets [ 0 ] . mirror , '' ) ;
73+
74+ const payload = { time : Date . now ( ) } ;
75+ const stringPayload = JSON . stringify ( payload ) ;
76+
77+ await gatewayController . broadcast ( payload as any ) ;
78+ await wait ( ) ;
79+ await expect ( sockets [ 0 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
80+ expect ( sockets [ 1 ] . allMessages . length ) . toEqual ( 0 ) ;
81+
82+ // Authenticate the second socket
83+ gatewayController . authenticatedClients . set ( sockets [ 1 ] . mirror , '' ) ;
84+ await gatewayController . broadcast ( payload as any ) ;
85+ await expect ( sockets [ 0 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
86+ await expect ( sockets [ 1 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
87+ } ) ;
88+
89+ test ( 'sendTo' , async ( ) => {
90+ // Authenticate the first socket
91+ gatewayController . authenticatedClients . set ( sockets [ 0 ] . mirror , 'banana' ) ;
92+ gatewayController . authenticatedClients . set ( sockets [ 1 ] . mirror , 'apple' ) ;
93+
94+ const payload = { time : Date . now ( ) } ;
95+ const stringPayload = JSON . stringify ( payload ) ;
96+
97+ await gatewayController . sendMessage ( [ 'banana' ] , payload as any ) ;
98+ await expect ( sockets [ 0 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
99+ expect ( sockets [ 1 ] . allMessages . length ) . toEqual ( 0 ) ;
100+
101+ await gatewayController . sendMessage ( [ 'apple' ] , payload as any ) ;
102+ await expect ( sockets [ 1 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
103+ expect ( sockets [ 0 ] . allMessages . length ) . toEqual ( 1 ) ;
104+
105+ await gatewayController . sendMessage ( [ 'apple' , 'banana' ] , payload as any ) ;
106+ await expect ( sockets [ 0 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
107+ await expect ( sockets [ 1 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
108+
109+ await gatewayController . sendMessage ( [ 'apple' , 'banana' , 'ghost' ] , payload as any ) ;
110+ await expect ( sockets [ 0 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
111+ await expect ( sockets [ 1 ] . nextMessage ) . resolves . toEqual ( stringPayload ) ;
66112 } ) ;
67113 } ) ;
68114
@@ -77,8 +123,8 @@ describe('GatewayController', () => {
77123
78124 when ( spiedVerifyJWT . verifyJWT ( '123' ) ) . thenResolve ( { id : '456' } ) ;
79125 when ( mockedUserService . findOne ( objectContaining ( { id : '456' } ) ) ) . thenResolve ( { } as any ) ;
80- await ws . send ( JSON . stringify ( payload ) ) ;
81- expect ( JSON . parse ( await ws . nextMessage ) ) . toMatchObject ( { type : GatewayPacketType . Hello } ) ;
126+ await sockets [ 0 ] . send ( JSON . stringify ( payload ) ) ;
127+ expect ( JSON . parse ( await sockets [ 0 ] . nextMessage ) ) . toMatchObject ( { type : GatewayPacketType . Hello } ) ;
82128 verify ( spiedVerifyJWT . verifyJWT ( '123' ) ) . once ( ) ;
83129 verify ( mockedUserService . findOne ( objectContaining ( { id : '456' } ) ) ) . once ( ) ;
84130 } ) ;
@@ -92,8 +138,8 @@ describe('GatewayController', () => {
92138 } ;
93139
94140 when ( spiedVerifyJWT . verifyJWT ( '123' ) ) . thenReject ( new Error ( 'Test Error' ) ) ;
95- await ws . send ( JSON . stringify ( payload ) ) ;
96- await expect ( ws . nextMessage ) . rejects . toThrow ( ) ;
141+ await sockets [ 0 ] . send ( JSON . stringify ( payload ) ) ;
142+ await expect ( sockets [ 0 ] . nextMessage ) . rejects . toThrow ( ) ;
97143 verify ( spiedVerifyJWT . verifyJWT ( '123' ) ) . once ( ) ;
98144 verify ( mockedUserService . findOne ( anything ( ) ) ) . never ( ) ;
99145 } ) ;
@@ -108,8 +154,8 @@ describe('GatewayController', () => {
108154
109155 when ( spiedVerifyJWT . verifyJWT ( '123' ) ) . thenResolve ( { id : '456' } ) ;
110156 when ( mockedUserService . findOne ( objectContaining ( { id : '456' } ) ) ) . thenReject ( new Error ( 'Test Error' ) ) ;
111- await ws . send ( JSON . stringify ( payload ) ) ;
112- await expect ( ws . nextMessage ) . rejects . toThrow ( ) ;
157+ await sockets [ 0 ] . send ( JSON . stringify ( payload ) ) ;
158+ await expect ( sockets [ 0 ] . nextMessage ) . rejects . toThrow ( ) ;
113159 verify ( spiedVerifyJWT . verifyJWT ( '123' ) ) . once ( ) ;
114160 verify ( mockedUserService . findOne ( objectContaining ( { id : '456' } ) ) ) . once ( ) ;
115161 } ) ;
0 commit comments