diff --git a/.env.example b/.env.example index 60d4415..a1b7e5c 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ -MONGO_DB_URI=mongodb+srv://username:password@orgname-zmpox.mongodb.net/databasename -TEST_DB=mongodb+srv://username:password@orgname-zmpox.mongodb.net/databasename +MONGO_DB_URI=mongodb+srv://username:password@orgname-xxxxx.mongodb.net/databasename +TEST_DB=mongodb+srv://username:password@orgname-xxxxx.mongodb.net/databasename GoogleClientSecret= HashString= AllowUrl={"urls": ["http://localhost:9000", "https://localhost:9000", "http://localhost:7000", "https://localhost:7000"]} diff --git a/package-lock.json b/package-lock.json index e52e48c..51172bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "webjamsocketserver", - "version": "3.0.8", + "version": "3.0.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webjamsocketserver", - "version": "3.0.8", + "version": "3.0.10", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e93b2b3..8c83c4d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "webjamsocketserver", "description": "Uses latest version of socketcluster-server", - "version": "3.0.9", + "version": "3.0.10", "license": "MIT", "type": "module", "main": "build/src/index.js", diff --git a/src/AgController/index.ts b/src/AgController/index.ts index 87ebdf0..690d893 100644 --- a/src/AgController/index.ts +++ b/src/AgController/index.ts @@ -272,13 +272,12 @@ class AgController { if (gig && gig.datetime && gig.city && gig.usState && gig.venue) { await utils.handleGig('createDocs', gig, 'gigCreated', this.gigController, this.server); } else throw new Error('Invalid create gig data'); - if (receiver.done) break; } catch (e) { const eMessage = (e as Error).message; debug(eMessage); client.socket.transmit('socketError', { newGig: eMessage });// send error back to client - break; } + /* istanbul ignore else */if (receiver.done) break; } })(); } diff --git a/test/AgController/index.spec.ts b/test/AgController/index.spec.ts index f6a7b0d..33c4510 100644 --- a/test/AgController/index.spec.ts +++ b/test/AgController/index.spec.ts @@ -30,8 +30,19 @@ const aStub:any = { }), }; +const realHandleGig = utils.handleGig; +const realRemoveGig = utils.removeGig; + describe('AgControler', () => { - afterEach(() => { vi.unstubAllGlobals(); }); + afterEach(() => { + vi.unstubAllGlobals(); + // Several tests replace these shared utils exports with vi.fn() stubs + // (e.g. line ~483) without restoring them, which otherwise leaks into + // later tests (like the #246 regression test) that need the real + // implementation and silently breaks their assertions. + utils.handleGig = realHandleGig; + utils.removeGig = realRemoveGig; + }); let r, clientStub:any = { id: '123', listener: () => ({ createConsumer: () => ({ next: () => Promise.resolve({ done: true, value: '1000' }) }) }), @@ -500,6 +511,49 @@ describe('AgControler', () => { agController.newGig(cStub, 'newGig'); expect(utils.handleGig).not.toHaveBeenCalled(); }); + it('keeps handling newGig on the same socket after an earlier newGig errored (#246)', async () => { + const agController = new AgController(aStub); + agController.clients = ['123']; + agController.gigController.createDocs = vi.fn(() => Promise.resolve([])); + agController.verifyAdminWrite = vi.fn(() => Promise.resolve()); + const transmit = vi.fn(); + let call = 0; + const cStub:any = { + socket: { + id: '123', + listener: () => ({ createConsumer: () => ({ next: () => Promise.resolve({ done: true, value: '1000' }) }) }), + transmit, + receiver: () => ({ + createConsumer: () => ({ + next: () => { + call += 1; + // First newGig on this socket: invalid gig data -> throws, must NOT break the loop. + if (call === 1) { + return Promise.resolve({ + value: { token: 'token', gig: { venue: 'venue' } }, + done: false, + }); + } + // Second newGig on the SAME socket/consumer: valid data -> must still be handled. + return Promise.resolve({ + value: { + token: 'token', + gig: { + venue: 'venue', datetime: new Date(), city: 'city', usState: 'state', + }, + }, + done: true, + }); + }, + }), + }), + }, + }; + agController.newGig(cStub, 'newGig'); + await delay(1000); + expect(transmit).toHaveBeenCalledWith('socketError', { newGig: 'Invalid create gig data' }); + expect(agController.gigController.createDocs).toHaveBeenCalled(); + }); it('process the newImage message from client', async () => { const agController = new AgController(aStub); agController.clients = ['123'];