From a1fc9ef646f4c86f609c60b4f083a509cc56cb49 Mon Sep 17 00:00:00 2001 From: AlecM33 Date: Fri, 2 Sep 2022 16:27:57 -0400 Subject: [PATCH] fix state leak between specs --- spec/e2e/game_spec.js | 80 +++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/spec/e2e/game_spec.js b/spec/e2e/game_spec.js index ab5edfa..0183d28 100644 --- a/spec/e2e/game_spec.js +++ b/spec/e2e/game_spec.js @@ -16,24 +16,25 @@ describe('game page', () => { }; describe('lobby game', () => { - const mockSocket = { - eventHandlers: {}, - on: function (message, handler) { - console.log('REGISTERED MOCK SOCKET HANDLER: ' + message); - this.eventHandlers[message] = handler; - }, - emit: function (eventName, ...args) { - switch (args[0]) { // eventName is currently always "inGameMessage" - the first arg after that is the specific message type - case globals.EVENT_IDS.FETCH_GAME_STATE: - args[args.length - 1](mockGames.gameInLobby); - } - }, - hasListeners: function (listener) { - return false; - } - }; + let mockSocket; - beforeAll(async () => { + beforeEach(async function () { + document.body.innerHTML = ''; + mockSocket = { + eventHandlers: {}, + on: function (message, handler) { + this.eventHandlers[message] = handler; + }, + emit: function (eventName, ...args) { + switch (args[0]) { // eventName is currently always "inGameMessage" - the first arg after that is the specific message type + case globals.EVENT_IDS.FETCH_GAME_STATE: + args[args.length - 1](deepCopy(mockGames.gameInLobby)); // copy the game object to prevent leaking of state between specs + } + }, + hasListeners: function (listener) { + return false; + } + }; await gameHandler(mockSocket, XHRUtility, { location: { href: 'host/game/ABCD' } }, gameTemplate); mockSocket.eventHandlers.connect(); }); @@ -77,27 +78,28 @@ describe('game page', () => { }); describe('in-progress game', () => { - const mockSocket = { - eventHandlers: {}, - on: function (message, handler) { - console.log('REGISTERED MOCK SOCKET HANDLER: ' + message); - this.eventHandlers[message] = handler; - }, - emit: function (eventName, ...args) { - switch (args[0]) { // eventName is currently always "inGameMessage" - the first arg after that is the specific message type - case globals.EVENT_IDS.FETCH_GAME_STATE: - args[args.length - 1](mockGames.inProgressGame); - break; - default: - break; - } - }, - hasListeners: function (listener) { - return false; - } - }; + let mockSocket; - beforeAll(async () => { + beforeEach(async () => { + document.body.innerHTML = ''; + mockSocket = { + eventHandlers: {}, + on: function (message, handler) { + this.eventHandlers[message] = handler; + }, + emit: function (eventName, ...args) { + switch (args[0]) { // eventName is currently always "inGameMessage" - the first arg after that is the specific message type + case globals.EVENT_IDS.FETCH_GAME_STATE: + args[args.length - 1](deepCopy(mockGames.inProgressGame)); // copy the game object to prevent leaking of state between specs + break; + default: + break; + } + }, + hasListeners: function (listener) { + return false; + } + }; await gameHandler(mockSocket, XHRUtility, { location: { href: 'host/game/ABCD' } }, gameTemplate); mockSocket.eventHandlers.connect(); mockSocket.eventHandlers.getTimeRemaining(120000, true); @@ -143,3 +145,7 @@ describe('game page', () => { }); }); }); + +function deepCopy (object) { + return JSON.parse(JSON.stringify(object)); +}