diff --git a/.mocharc.js b/.mocharc.js index fb2c98119..a7201346a 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -9,7 +9,7 @@ const config = { // if you've defined specs in your config. therefore we work around it by only adding specs to the // config if none are passed as arguments if (!process.argv.slice(2).some(isTestFile)) { - config.spec = ['test/realtime/*.test.js', 'test/rest/*.test.js']; + config.spec = ['test/realtime/*.test.js', 'test/rest/*.test.js', 'test/unit/*.test.js']; } function isTestFile(arg) { diff --git a/src/common/lib/client/presencemap.ts b/src/common/lib/client/presencemap.ts index adadc7e5c..53fcd1890 100644 --- a/src/common/lib/client/presencemap.ts +++ b/src/common/lib/client/presencemap.ts @@ -127,7 +127,7 @@ export class PresenceMap extends EventEmitter { delete map[key]; } - return true; + return !!existingItem; } startSync() { diff --git a/test/unit/presencemap.test.js b/test/unit/presencemap.test.js new file mode 100644 index 000000000..f5e65e36b --- /dev/null +++ b/test/unit/presencemap.test.js @@ -0,0 +1,48 @@ +'use strict'; + +define(['chai', 'ably'], function (chai, Ably) { + const { assert } = chai; + const PresenceMap = Ably.Realtime._PresenceMap; + + describe('PresenceMap', () => { + let presenceMap; + + // Helper function to create a presence message + const createPresenceMessage = (clientId, connectionId, action, timestamp) => ({ + clientId, + connectionId, + timestamp, + action + }); + + beforeEach(() => { + // Initialize with a simple memberKey function that uses clientId as the key + presenceMap = new PresenceMap( + null, + (item) => item.clientId + ':' + item.connectionId, + (i, j) => i.timestamp > j.timestamp + ); + }); + + describe('remove()', () => { + it('should return false when no matching member present', () => { + const incoming = createPresenceMessage('client1', 'conn1', 'leave', 100); + assert.isFalse(presenceMap.remove(incoming)); + }); + + it('should return true when removing an (older) matching member', () => { + const original = createPresenceMessage('client1', 'conn1', 'present', 100); + presenceMap.put(original); + const incoming = createPresenceMessage('client1', 'conn1', 'leave', 150); + assert.isTrue(presenceMap.remove(incoming)); + }); + + it('should return false when trying to remove a newer matching member', () => { + const original = createPresenceMessage('client1', 'conn1', 'present', 100); + presenceMap.put(original); + const incoming = createPresenceMessage('client1', 'conn1', 'leave', 50); + assert.isFalse(presenceMap.remove(incoming)); + }); + }); + }); +});