Skip to content

Commit a43f90b

Browse files
authored
Merge pull request #268 from connect-foundation/test/socket
[test/socket] socket event test ์ถ”๊ฐ€
2 parents 91e2e51 + c8cdcf5 commit a43f90b

File tree

7 files changed

+221
-37
lines changed

7 files changed

+221
-37
lines changed

โ€Žscript/docker-compose.ymlโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ services:
2929
restart: always
3030
image: dev-2019-01.kr.ncr.ntruss.com/front-end
3131
ports:
32-
- "80:80"
32+
- "443:443"
3333
depends_on:
3434
- server
3535
networks:

โ€Žserver/app.jsโ€Ž

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import socketio from 'socket.io';
55
import cookieParser from 'cookie-parser';
66
import {} from 'dotenv/config';
77
import cors from 'cors';
8-
import loginRouter from './routes/login';
9-
import adminRouter from './routes/admin';
8+
import rootRouter from './routes';
109
import controller from './controller';
1110
import URL from './constants/url';
1211
import ERROR_MSG from './constants/error-message';
@@ -27,8 +26,7 @@ if (process.env.NODE_ENV === 'development') {
2726
app.use(cors(corsOptions));
2827
}
2928

30-
app.use('/admin', adminRouter);
31-
app.use('/oauth', loginRouter);
29+
app.use('/', rootRouter);
3230

3331
app.use((req, res, next) => {
3432
next(createError(404, ERROR_MSG.REQUEST_NOT_FOUND));

โ€Žserver/constants/url.jsโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const clientID = process.env.NODE_ENV === 'production' ? process.env.PRODUCTION_
22
const clientSecret = process.env.NODE_ENV === 'production' ? process.env.PRODUCTION_CLIENT_SECRET : process.env.LOCAL_CLIENT_SECRET;
33

44
const URL = {
5-
LOCAL_ORIGIN: 'http://localhost:3006/',
5+
LOCAL_ORIGIN: 'http://localhost:3006',
66
LOCAL_REACT_OAUTH: 'http://localhost:3006/oauth',
77
PRODUCTION_REACT_OAUTH: '/oauth',
88
LOCAL_REACT_LOBBY: 'http://localhost:3006/lobby',

โ€Žserver/routes/index.jsโ€Ž

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import express from 'express';
2+
import loginRouter from './login';
3+
import adminRouter from './admin';
4+
5+
const router = express.Router();
6+
7+
router.use('/admin', adminRouter);
8+
router.use('/oauth', loginRouter);
9+
10+
export default router;

โ€Žserver/test/client.jsโ€Ž

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class Client {
2+
constructor() {
3+
this.indexX = null;
4+
this.indexY = null;
5+
this.roomId = '';
6+
this.socket = null;
7+
}
8+
9+
getIndexes() {
10+
return [this.indexX, this.indexY];
11+
}
12+
13+
setIndexes([indexX, indexY]) {
14+
this.indexX = indexX;
15+
this.indexY = indexY;
16+
}
17+
18+
getRoomId() {
19+
return this.roomId;
20+
}
21+
22+
setRoomId(roomId) {
23+
this.roomId = roomId;
24+
}
25+
26+
setSocket(socket) {
27+
this.socket = socket;
28+
}
29+
30+
once(event, callback) {
31+
this.socket.once(event, callback);
32+
}
33+
34+
emit(event, data) {
35+
this.socket.emit(event, data);
36+
}
37+
38+
isConnected() {
39+
return this.socket.connected;
40+
}
41+
42+
disconnect() {
43+
this.socket.disconnect();
44+
}
45+
}
46+
47+
export default Client;

โ€Žserver/test/mock.jsโ€Ž

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
export default {
2-
ENTER_RESPONSE_KEYS: ['characterList', 'isGameStarted', 'isOwner', 'timeLimit'],
2+
ENTER_RESPONSE_KEYS: ['characterList', 'isOwner', 'roomName'],
33
MOVE_RESPONSE_KEYS: ['canMove', 'nickname', 'direction', 'newIndexX', 'newIndexY'],
4+
ROOM_INFO_KEYS: ['id', 'name', 'numOfUsers', 'isEnterable'],
5+
KNOCK_ROOM_KEYS: ['isEnterable', 'roomId', 'message'],
6+
START_ROUND_KEYS: ['question', 'timeLimit', 'characterList'],
7+
UPDATE_PLAYER_NUM_KEYS: ['numOfPlayer', 'numOfViewer'],
8+
CHAT_MESSAGE_KEYS: ['nickname', 'message'],
49
};
Lines changed: 154 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,187 @@
11
import mock from './mock';
2+
import Client from './client';
23

3-
const { ENTER_RESPONSE_KEYS, MOVE_RESPONSE_KEYS } = mock;
4+
const {
5+
ENTER_RESPONSE_KEYS, MOVE_RESPONSE_KEYS, ROOM_INFO_KEYS,
6+
KNOCK_ROOM_KEYS, START_ROUND_KEYS, CHAT_MESSAGE_KEYS,
7+
} = mock;
48

59
const ioClient = require('socket.io-client');
610
const http = require('http');
711
const { app, socketIo } = require('../bin/app').default;
812

9-
let socket;
1013
let httpServer;
1114
let httpServerAddr;
1215

13-
describe('socket.io test', () => {
14-
beforeAll(() => {
15-
httpServer = http.createServer(app).listen('5001');
16-
socketIo.attach(httpServer);
17-
httpServerAddr = httpServer.address();
16+
const roomName = 'test room name';
17+
const ownerClient = new Client();
18+
const playerClient = new Client();
19+
const LEFT = 1;
1820

19-
socket = ioClient.connect(`http://[${httpServerAddr.address}]:${httpServerAddr.port}`, {
20-
'reconnection delay': 0,
21-
'reopen delay': 0,
22-
'force new connection': true,
23-
transports: ['websocket'],
21+
beforeAll(() => {
22+
httpServer = http.createServer(app).listen('5001');
23+
socketIo.attach(httpServer);
24+
httpServerAddr = httpServer.address();
25+
26+
const connectUrl = `http://[${httpServerAddr.address}]:${httpServerAddr.port}`;
27+
const connectOption = {
28+
'reconnection delay': 0,
29+
'reopen delay': 0,
30+
'force new connection': true,
31+
transports: ['websocket'],
32+
};
33+
34+
const ownerSocket = ioClient.connect(connectUrl, connectOption);
35+
const playerSocket = ioClient.connect(connectUrl, connectOption);
36+
37+
ownerClient.setSocket(ownerSocket);
38+
playerClient.setSocket(playerSocket);
39+
});
40+
41+
afterAll(() => {
42+
if (ownerClient.isConnected()) {
43+
ownerClient.disconnect();
44+
}
45+
46+
if (playerClient.isConnected()) {
47+
playerClient.disconnect();
48+
}
49+
50+
socketIo.close();
51+
httpServer.close();
52+
});
53+
54+
describe('socket.io connect test', () => {
55+
test('owner client connect test', (done) => {
56+
ownerClient.once('connect', () => done());
57+
});
58+
59+
test('player client connect test', (done) => {
60+
playerClient.once('connect', () => done());
61+
});
62+
});
63+
64+
describe('lobby event test', () => {
65+
test('[EMIT] owner client \'enter_lobby\' event test', (done) => {
66+
ownerClient.once('enter_lobby', (message) => {
67+
expect(message).toEqual([]);
68+
done();
2469
});
70+
ownerClient.emit('enter_lobby');
2571
});
2672

27-
afterAll(() => {
28-
if (socket.connected) {
29-
socket.disconnect();
30-
}
31-
socketIo.close();
32-
httpServer.close();
73+
test('[EMIT] owner client \'create_room\' event test', (done) => {
74+
ownerClient.once('create_room', (message) => {
75+
expect(typeof message).toEqual('string');
76+
ownerClient.setRoomId(message);
77+
done();
78+
});
79+
ownerClient.emit('create_room', roomName);
3380
});
3481

35-
test('connect test', (done) => {
36-
socket.on('connect', () => {
82+
test('[EMIT] player client \'enter_lobby\' event test2', (done) => {
83+
playerClient.once('enter_lobby', (message) => {
84+
expect(ROOM_INFO_KEYS).toEqual(expect.arrayContaining(Object.keys(message[0])));
3785
done();
3886
});
87+
playerClient.emit('enter_lobby');
3988
});
4089

41-
test('[EMIT] \'enter_room\' event test', (done) => {
42-
socket.once('enter_room', (message) => {
90+
test('[EMIT] player client \'knock_room\' event test2', (done) => {
91+
playerClient.once('knock_room', (message) => {
92+
expect(KNOCK_ROOM_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
93+
expect(message[KNOCK_ROOM_KEYS[0]]).toBeTruthy();
94+
done();
95+
});
96+
const roomId = ownerClient.getRoomId();
97+
playerClient.emit('knock_room', roomId);
98+
});
99+
});
100+
101+
describe('room event test', () => {
102+
test('[EMIT] owner client \'enter_room\' event test2', (done) => {
103+
ownerClient.once('enter_room', (message) => {
43104
expect(ENTER_RESPONSE_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
105+
expect(message.isOwner).toBeTruthy();
106+
expect(message.roomName).toBe(roomName);
107+
message.characterList.forEach(({ isMine, indexX, indexY }) => {
108+
if (isMine) ownerClient.setIndexes([indexX, indexY]);
109+
});
44110
done();
45111
});
46-
socket.emit('enter_room', 1);
112+
const roomId = ownerClient.getRoomId();
113+
ownerClient.emit('enter_room', roomId);
47114
});
48115

49-
test('\'move\' event test', (done) => {
50-
socket.once('move', (message) => {
51-
if (!message.canMove) done();
116+
test('[EMIT] player client \'enter_room\' event test2', (done) => {
117+
const roomId = ownerClient.getRoomId();
118+
playerClient.once('enter_room', (message) => {
119+
expect(ENTER_RESPONSE_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
120+
expect(message.isOwner).toBeFalsy();
121+
expect(message.roomName).toBe(roomName);
122+
playerClient.setRoomId(roomId);
123+
message.characterList.forEach(({ isMine, indexX, indexY }) => {
124+
if (isMine) playerClient.setIndexes([indexX, indexY]);
125+
});
126+
done();
127+
});
128+
playerClient.emit('enter_room', roomId);
129+
});
52130

131+
test('[EMIT] owner client \'chat_message\' event test1', (done) => {
132+
playerClient.once('chat_message', (message) => {
133+
expect(CHAT_MESSAGE_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
134+
expect('test message').toBe(message.message);
135+
done();
136+
});
137+
ownerClient.emit('chat_message', 'test message');
138+
});
139+
});
140+
141+
describe('move event test', () => {
142+
test('[EMIT] owner client \'move\' event test', (done) => {
143+
let expectedCanMove = true;
144+
const [ownerIndexX, ownerIndexY] = ownerClient.getIndexes();
145+
const [playerIndexX, playerIndexY] = playerClient.getIndexes();
146+
let newOwnerIndexX = ownerIndexX;
147+
if (ownerIndexX === 0) expectedCanMove = false;
148+
if (ownerIndexX - playerIndexX === 1 && ownerIndexY === playerIndexY) expectedCanMove = false;
149+
if (expectedCanMove) newOwnerIndexX -= 1;
150+
151+
ownerClient.once('move', (message) => {
53152
expect(MOVE_RESPONSE_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
153+
expect(expectedCanMove).toBe(message.canMove);
154+
if (message.canMove) {
155+
expect(newOwnerIndexX).toBe(message.newIndexX);
156+
done();
157+
}
54158
done();
55159
});
56-
socket.emit('move', 0);
160+
ownerClient.emit('move', LEFT);
57161
});
162+
});
58163

59-
test('[EMIT] \'leave_room\' event test', (done) => {
60-
socket.once('leave_room', () => done());
61-
socket.emit('leave_room', 1);
164+
describe('game event test', () => {
165+
test('[EMIT] owner client \'start game\' event test', (done) => {
166+
ownerClient.once('start_game', () => done());
167+
ownerClient.emit('start_game');
168+
});
169+
170+
test('[EMIT] player client \'start game\' event test', (done) => {
171+
playerClient.once('start_game', () => done());
172+
});
173+
174+
test('[EMIT] owner client \'start round\' event test', (done) => {
175+
ownerClient.once('start_round', (message) => {
176+
expect(START_ROUND_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
177+
done();
178+
});
179+
});
180+
181+
test('[EMIT] player client \'start round\' event test', (done) => {
182+
playerClient.once('start_round', (message) => {
183+
expect(START_ROUND_KEYS).toEqual(expect.arrayContaining(Object.keys(message)));
184+
done();
185+
});
62186
});
63187
});

0 commit comments

Comments
ย (0)