From d284fc30f1525a0ef12353064c085c499c9acce8 Mon Sep 17 00:00:00 2001 From: Wenszel Date: Sun, 19 Nov 2023 20:32:12 +0100 Subject: [PATCH] added room schema tests --- backend/handlers/roomHandler.js | 37 +++++----------- backend/schemas/room.js | 2 +- backend/tests/schemas/room.test.js | 71 ++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 backend/tests/schemas/room.test.js diff --git a/backend/handlers/roomHandler.js b/backend/handlers/roomHandler.js index 962bea7..a7e964c 100644 --- a/backend/handlers/roomHandler.js +++ b/backend/handlers/roomHandler.js @@ -2,34 +2,17 @@ const RoomModel = require('../schemas/room'); module.exports = (io, socket) => { const req = socket.request; - const getData = () => { - RoomModel.findOne({ _id: req.session.roomId }, function (err, room) { - if (!room) return err; - if (room.nextMoveTime <= Date.now()) { - changeCurrentMovingPlayer(); - } else { - io.to(req.session.roomId.toString()).emit('room:data', JSON.stringify(room)); - } - }); + + const getData = async () => { + let room = await RoomModel.findOne({ _id: req.session.roomId }); + // Handle the situation when the server crashes and any player reconnects after the time has expired + // Typically, the responsibility for changing players is managed by gameHandler.js. + if (room.nextMoveTime <= Date.now()) { + room.changeMovingPlayer(); + await RoomModel.findOneAndUpdate({ _id: req.session.roomId }, room); + } + io.to(req.session.roomId).emit('room:data', JSON.stringify(room)); }; socket.on('room:data', getData); - - function changeCurrentMovingPlayer() { - RoomModel.findOne({ _id: req.session.roomId }, function (err, room) { - if (!room) return err; - const index = room.players.findIndex(player => player.nowMoving === true); - const roomSize = room.players.length; - room.players[index].nowMoving = false; - if (index + 1 === roomSize) { - room.players[0].nowMoving = true; - } else { - room.players[index + 1].nowMoving = true; - } - room.nextMoveTime = Date.now() + 15000; - RoomModel.findOneAndUpdate({ _id: req.session.roomId }, room, function (err, updatedRoom) { - io.to(req.session.roomId).emit('room:data', JSON.stringify(updatedRoom)); - }); - }); - } }; diff --git a/backend/schemas/room.js b/backend/schemas/room.js index 91e5427..89fcd70 100644 --- a/backend/schemas/room.js +++ b/backend/schemas/room.js @@ -62,7 +62,6 @@ RoomSchema.methods.canStartGame = function () { RoomSchema.methods.startGame = function () { this.started = true; - this.pawns = getStartPositions(); this.nextMoveTime = Date.now() + 15000; this.players.forEach(player => (player.ready = true)); this.players[0].nowMoving = true; @@ -80,6 +79,7 @@ RoomSchema.methods.getPlayer = function (playerId) { }; RoomSchema.methods.addPlayer = function (name) { + if (this.full) return; this.players.push({ name: name, ready: false, diff --git a/backend/tests/schemas/room.test.js b/backend/tests/schemas/room.test.js new file mode 100644 index 0000000..13a6fe7 --- /dev/null +++ b/backend/tests/schemas/room.test.js @@ -0,0 +1,71 @@ +const { expect } = require('chai'); +const RoomModel = require('../../schemas/room'); +const { getPawnPositionAfterMove, getStartPositions } = require('../../utils/functions'); +describe('Testing room model methods', function () { + const room = new RoomModel(); + + beforeEach(function () { + room.players = []; + room.pawns = getStartPositions(); + }); + it('should correctly beat pawn', function () { + room.addPlayer('test1', 'red'); + room.addPlayer('test2', 'blue'); + room.pawns.forEach(pawn => { + pawn.position = getPawnPositionAfterMove(1, pawn); + }); + room.beatPawns(16, 'green'); + room.pawns.forEach(pawn => { + if (pawn.color != 'red') { + expect(pawn.position).to.not.equal(pawn.basePos); + } else { + expect(pawn.position).to.equal(pawn.basePos); + } + }); + }); + + it('should correctly beat multiple pawns', function () { + room.pawns[0].position = 16; + room.pawns[1].position = 16; + room.beatPawns(16, 'green'); + room.pawns.forEach(pawn => { + expect(pawn.position).to.equal(pawn.basePos); + }); + }); + + it('should correctly change moving player from last to first', function () { + room.addPlayer('test1', 'red'); + room.addPlayer('test2', 'blue'); + room.players[1].nowMoving = true; + room.changeMovingPlayer(); + expect(room.players[0].nowMoving).to.equal(true); + }); + + it('should correctly change moving player from first to second', function () { + room.addPlayer('test1', 'red'); + room.addPlayer('test2', 'blue'); + room.players[0].nowMoving = true; + room.changeMovingPlayer(); + expect(room.players[1].nowMoving).to.equal(true); + }); + + it('should correctly returns pawns that can move', function () { + room.addPlayer('test1', 'red'); + room.addPlayer('test2', 'blue'); + room.players[0].nowMoving = true; + room.pawns[0].position = 16; + room.rolledNumber = 2; + const pawnsThatCanMove = room.getPawnsThatCanMove(); + expect(pawnsThatCanMove.length).to.equal(1); + }); + + it('should given rolled 6 correctly returns pawns that can move', function () { + room.addPlayer('test1', 'red'); + room.addPlayer('test2', 'blue'); + room.players[0].nowMoving = true; + room.pawns[0].position = 16; + room.rolledNumber = 6; + const pawnsThatCanMove = room.getPawnsThatCanMove(); + expect(pawnsThatCanMove.length).to.equal(4); + }); +});