Overnap

Merge branch 'develop' into feature/rooms-buttons

......@@ -22,6 +22,8 @@
특정한 방에 접속하기 위해서는 서버에 `joinRoom`을 보내면 됩니다. 요청이 성공하면 `RoomInfo`가 반환됩니다. `RoomInfo`에는 본인을 포함한 모든 다른 플레이어들의 정보가 담겨 있습니다.
새로운 방을 만들고 싶다면 `createRoom`을 보내면 됩니다. 방의 이름을 `name` 속성에 담아 보내야 합니다. 방의 이름은 공백일 수 없고, 최대 30자까지 가능합니다. 방을 만드는데 성공했다면 방에 자동으로 접속되고 방장을 맡게 됩니다. 이때 반환값은 `joinRoom`과 동일한 `RoomInfo`를 받습니다.
### 방
방에 접속중인 유저의 목록에 변화가 생기면, `updateRoomUser`가 수신됩니다. `state`는 다음 3가지 값 중 하나의 값을 가집니다.
......
......@@ -29,6 +29,12 @@ export class ServerInboundMessageRecordMap {
result: Array(RoomDescriptionRecord),
});
// 방을 만듭니다.
createRoom = Record({
name: String,
result: RoomInfoRecord,
});
// 방에 접속합니다.
joinRoom = Record({
uuid: String,
......
import { expect } from "chai";
import { RoomManager } from "../room/RoomManager";
import {
prepareJoinedRoom,
prepareUsers,
prepareUsersEmptyRooms,
} from "./util/prepare";
import { SocketTester } from "./util/SocketTester";
describe("방 생성", () => {
it("로그인하지 않은 유저는 요청할 수 없습니다", () => {
const roomManager = new RoomManager();
const socket = new SocketTester(roomManager);
socket.testNotOk("createRoom", { name: "테스트" });
});
it("방을 생성합니다", () => {
const {
sockets: [socket],
users: [user],
} = prepareUsers(1);
const response = socket.test("createRoom", { name: "테스트" });
expect(response.ok).eq(true);
expect(response.result?.name).eq("테스트");
expect(response.result?.users?.length).eq(1);
expect(response.result?.users[0]?.username).eq(user.username);
});
it("방을 생성하면 방장이 됩니다", () => {
const {
sockets: [socket],
} = prepareUsers(1);
const response = socket.test("createRoom", { name: "테스트" });
expect(response.ok).eq(true);
expect(response.result?.users[0]?.admin).eq(true);
});
it("방의 이름은 공백이 될 수 없습니다", () => {
const {
sockets: [socket],
} = prepareUsers(1);
socket.testNotOk("createRoom", { name: "" });
socket.testNotOk("createRoom", { name: " " });
});
it("방의 이름은 30자보다 길 수 없습니다", () => {
const {
sockets: [socket],
} = prepareUsers(1);
socket.testNotOk("createRoom", { name: "a".repeat(31) });
socket.testNotOk("createRoom", { name: "가".repeat(31) });
});
it("방에 이미 접속한 상태에서 방을 만들 수 없습니다", () => {
const {
sockets: [socket],
} = prepareJoinedRoom(1);
socket.testNotOk("createRoom", { name: "테스트" });
});
});
......@@ -20,6 +20,16 @@ export class User {
roomList: (user, message) => {
return { ok: true, result: connection.roomManager.list() };
},
createRoom: (user, message) => {
if (user.room) {
return { ok: false };
}
if (message.name.length >= 30 || message.name.trim().length === 0) {
return { ok: false };
}
const room = connection.roomManager.create(message.name, 8, user);
return { ok: true, result: room.getInfo() };
},
joinRoom: (user, message) => {
const room = connection.roomManager.get(message.uuid);
if (user.room || !room) {
......