diff --git a/package.json b/package.json index 11597f51..6dd45336 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Calvin Montgomery", "name": "CyTube", "description": "Online media synchronizer and chat", - "version": "3.82.4", + "version": "3.82.5", "repository": { "url": "http://github.com/calzoneman/sync" }, diff --git a/src/channel/poll.js b/src/channel/poll.js index 6393e1d4..68df4c70 100644 --- a/src/channel/poll.js +++ b/src/channel/poll.js @@ -97,7 +97,6 @@ PollModule.prototype.sendPoll = function (user) { var perms = this.channel.modules.permissions; - user.socket.emit("closePoll"); if (perms.canViewHiddenPoll(user)) { var unobscured = this.poll.toUpdateFrame(true); user.socket.emit("newPoll", unobscured); @@ -116,9 +115,6 @@ PollModule.prototype.broadcastPoll = function (isNewPoll) { var unobscured = this.poll.toUpdateFrame(true); const event = isNewPoll ? "newPoll" : "updatePoll"; - if (isNewPoll) { - this.channel.broadcastAll("closePoll"); - } this.channel.broadcastToRoom(event, unobscured, this.roomViewHidden); this.channel.broadcastToRoom(event, obscured, this.roomNoViewHidden); @@ -152,6 +148,9 @@ PollModule.prototype.handleNewPoll = function (user, data, ack) { return; } + // Ensure any existing poll is closed + this.handleClosePoll(user); + ack = ackOrErrorMsg(ack, user); if (typeof data !== 'object' || data === null) { @@ -252,6 +251,9 @@ PollModule.prototype.handlePollCmd = function (obscured, user, msg, _meta) { return; } + // Ensure any existing poll is closed + this.handleClosePoll(user); + msg = msg.replace(/^\/h?poll/, ""); var args = msg.split(","); diff --git a/test/channel/poll.js b/test/channel/poll.js index 6da1c0fb..8e3c46dd 100644 --- a/test/channel/poll.js +++ b/test/channel/poll.js @@ -97,7 +97,10 @@ describe('PollModule', () => { } } }; - let pollModule = new PollModule(fakeChannel); + let pollModule; + beforeEach(() => { + pollModule = new PollModule(fakeChannel); + }); it('creates a valid poll', () => { let sentNewPoll = false; @@ -122,10 +125,54 @@ describe('PollModule', () => { }, (ackResult) => { assert(!ackResult.error, `Unexpected error: ${ackResult.error}`); }); - assert(sentClosePoll, 'Expected broadcast of closePoll event'); + assert(!sentClosePoll, 'Unexpected broadcast of closePoll event'); assert(sentNewPoll, 'Expected broadcast of newPoll event'); }); + it('closes an existing poll when a new one is created', () => { + let sentNewPoll = 0; + let sentClosePoll = 0; + let sentUpdatePoll = 0; + fakeChannel.broadcastToRoom = (event, data, room) => { + if (room === 'testChannel:viewHidden' && event === 'newPoll') { + sentNewPoll++; + } + }; + fakeChannel.broadcastAll = (event, data) => { + if (event === 'closePoll') { + sentClosePoll++; + } else if (event === 'updatePoll') { + sentUpdatePoll++; + assert.deepStrictEqual(data.counts, [0, 0]); + } + }; + pollModule.handleNewPoll(fakeUser, { + title: 'test poll', + opts: [ + 'option 1', + 'option 2' + ], + obscured: true + }, (ackResult) => { + assert(!ackResult.error, `Unexpected error: ${ackResult.error}`); + }); + + pollModule.handleNewPoll(fakeUser, { + title: 'poll 2', + opts: [ + 'option 3', + 'option 4' + ], + obscured: false + }, (ackResult) => { + assert(!ackResult.error, `Unexpected error: ${ackResult.error}`); + }); + + assert.strictEqual(sentClosePoll, 1, 'Expected 1 broadcast of closePoll event'); + assert.strictEqual(sentUpdatePoll, 1, 'Expected 1 broadcast of updatePoll event'); + assert.strictEqual(sentNewPoll, 2, 'Expected 2 broadcasts of newPoll event'); + }); + it('rejects an invalid poll', () => { fakeChannel.broadcastToRoom = (event, data, room) => { assert(false, 'Expected no events to be sent'); @@ -171,4 +218,4 @@ describe('PollModule', () => { assert(sentErrorMsg, 'Expected to send errorMsg since ack was missing'); }); }) -}); \ No newline at end of file +});