From 220d14a9c7e595156a90d0897309ae14d121e30a Mon Sep 17 00:00:00 2001
From: Will Hunt <will@half-shot.uk>
Date: Mon, 2 Nov 2020 22:49:51 +0000
Subject: [PATCH] More test code

---
 src/discordmessageprocessor.ts       |  2 +-
 src/presencehandler.ts               | 26 ++++----
 src/store.ts                         |  4 +-
 test/mocks/channel.ts                |  2 +-
 test/mocks/collection.ts             | 18 ++++-
 test/mocks/discordclient.ts          | 10 +--
 test/mocks/guild.ts                  | 18 ++---
 test/mocks/member.ts                 |  4 +-
 test/mocks/presence.ts               | 16 +++++
 test/mocks/user.ts                   |  6 +-
 test/test_discordbot.ts              |  1 -
 test/test_discordmessageprocessor.ts |  8 +--
 test/test_matrixmessageprocessor.ts  | 16 ++---
 test/test_matrixroomhandler.ts       |  2 +-
 test/test_presencehandler.ts         | 98 ++++++++++------------------
 test/test_usersyncroniser.ts         |  8 +--
 16 files changed, 123 insertions(+), 116 deletions(-)
 create mode 100644 test/mocks/presence.ts

diff --git a/src/discordmessageprocessor.ts b/src/discordmessageprocessor.ts
index 13ed3d8..1add526 100644
--- a/src/discordmessageprocessor.ts
+++ b/src/discordmessageprocessor.ts
@@ -77,7 +77,7 @@ export class DiscordMessageProcessor {
                 return null;
             },
             getUser: async (id: string) => {
-                const member = await msg.guild?.members.fetch(id);
+                const member = await msg.guild?.members.resolve(id);
                 const mxid = `@_discord_${id}:${this.domain}`;
                 const name = member ? member.displayName : mxid;
                 return {
diff --git a/src/presencehandler.ts b/src/presencehandler.ts
index 7901880..9108314 100644
--- a/src/presencehandler.ts
+++ b/src/presencehandler.ts
@@ -63,11 +63,18 @@ export class PresenceHandler {
     }
 
     public EnqueueUser(presence: Presence) {
-        if (presence.userID !== this.bot.GetBotId() && this.presenceQueue.find((u) => u.userID === presence.userID) === undefined) {
-            log.verbose(`Adding ${presence.userID} (${presence.user?.username}) to the presence queue`);
-            this.presenceQueue.push(presence);
-            MetricPeg.get.setPresenceCount(this.presenceQueue.length);
+        if (presence.userID === this.bot.GetBotId()) {
+            return;
         }
+
+        // Delete stale presence
+        const indexOfPresence = this.presenceQueue.findIndex((u) => u.userID === presence.userID);
+        if (indexOfPresence !== -1) {
+            this.presenceQueue.splice(indexOfPresence, 1);
+        }
+        log.verbose(`Adding ${presence.userID} (${presence.user?.username}) to the presence queue`);
+        this.presenceQueue.push(presence);
+        MetricPeg.get.setPresenceCount(this.presenceQueue.length);
     }
 
     public DequeueUser(user: User) {
@@ -86,6 +93,7 @@ export class PresenceHandler {
 
     public async ProcessUser(presence: Presence): Promise<boolean> {
         if (!presence.user) {
+            console.log("No user in presence!");
             return true;
         }
         const status = this.getUserPresence(presence);
@@ -110,8 +118,8 @@ export class PresenceHandler {
         const status = new PresenceHandlerStatus();
 
         // How do we show multiple activities?
-        if (presence.activities[0]) {
-            const activity = presence.activities[0];
+        const activity = presence.activities[0];
+        if (activity) {
             const type = activity.type[0] + activity.type.substring(1).toLowerCase(); // STREAMING -> Streaming;
             status.StatusMsg = `${type} ${activity.name}`;
             if (activity.url) {
@@ -123,7 +131,7 @@ export class PresenceHandler {
             status.Presence = "online";
         } else if (presence.status === "dnd") {
             status.Presence = "online";
-            status.StatusMsg = status.StatusMsg ? "Do not disturb | " + status.StatusMsg : "Do not disturb";
+            status.StatusMsg = status.StatusMsg ? `Do not disturb | ${status.StatusMsg}` : "Do not disturb";
         } else if (presence.status === "offline") {
             status.Presence = "offline";
             status.ShouldDrop = true; // Drop until we recieve an update.
@@ -135,10 +143,6 @@ export class PresenceHandler {
 
     private async setMatrixPresence(user: User, status: PresenceHandlerStatus) {
         const intent = this.bot.GetIntentFromDiscordMember(user);
-        const statusObj: IMatrixPresence = {presence: status.Presence};
-        if (status.StatusMsg) {
-            statusObj.status_msg = status.StatusMsg;
-        }
         try {
             await intent.ensureRegistered();
             await intent.underlyingClient.setPresenceStatus(status.Presence, status.StatusMsg);
diff --git a/src/store.ts b/src/store.ts
index 9a637ee..c7574cb 100644
--- a/src/store.ts
+++ b/src/store.ts
@@ -69,7 +69,7 @@ export class DiscordStore implements IAppserviceStorageProvider {
         }
         const BACKUP_NAME = this.config.filename + ".backup";
 
-        return new Promise((resolve, reject) => {
+        return new Promise((resolve) => {
             // Check to see if a backup file already exists.
             fs.access(BACKUP_NAME, (err) => {
                 return resolve(err === null);
@@ -103,7 +103,7 @@ export class DiscordStore implements IAppserviceStorageProvider {
         log.info(`Database schema version is ${version}, latest version is ${targetSchema}`);
         while (version < targetSchema) {
             version++;
-            const schemaClass = require(`./db/schema/v${version}.js`).Schema;
+            const schemaClass = require(`./db/schema/v${version}`).Schema;
             let schema: IDbSchema;
             schema = (new schemaClass() as IDbSchema);
             log.info(`Updating database to v${version}, "${schema.description}"`);
diff --git a/test/mocks/channel.ts b/test/mocks/channel.ts
index f209cc2..02a5422 100644
--- a/test/mocks/channel.ts
+++ b/test/mocks/channel.ts
@@ -15,7 +15,7 @@ limitations under the License.
 */
 
 import {MockMember} from "./member";
-import {MockCollection} from "./collection";
+import {MockCollection, MockCollectionManager} from "./collection";
 import {Permissions, PermissionResolvable, TextChannel} from "better-discord.js"
 import { MockGuild } from "./guild";
 
diff --git a/test/mocks/collection.ts b/test/mocks/collection.ts
index d83bfe3..4c6cba2 100644
--- a/test/mocks/collection.ts
+++ b/test/mocks/collection.ts
@@ -16,9 +16,6 @@ limitations under the License.
 
 import { Collection } from "better-discord.js"
 
-// we are a test file and thus need those
-/* tslint:disable:no-unused-expression max-file-line-count no-any */
-
 export class MockCollection<T1, T2> extends Collection<T1, T2> {
     public array(): T2[] {
         return [...this.values()];
@@ -28,3 +25,18 @@ export class MockCollection<T1, T2> extends Collection<T1, T2> {
         return [...this.keys()];
     }
 }
+
+export class MockCollectionManager<T1, T2> {
+    private innerCache = new MockCollection<T1, T2>();
+    public get cache() {
+        return this.innerCache;
+    }
+
+    public updateCache(c: MockCollection<T1, T2>) {
+        this.innerCache = c;
+    }
+
+    public resolve(id: T1) {
+        return this.innerCache.get(id);
+    }
+}
diff --git a/test/mocks/discordclient.ts b/test/mocks/discordclient.ts
index 44624d5..212f719 100644
--- a/test/mocks/discordclient.ts
+++ b/test/mocks/discordclient.ts
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-import {MockCollection} from "./collection";
+import {MockCollectionManager} from "./collection";
 import {MockGuild} from "./guild";
 import {MockUser} from "./user";
 
@@ -22,7 +22,7 @@ import {MockUser} from "./user";
 /* tslint:disable:no-unused-expression max-file-line-count no-any */
 
 export class MockDiscordClient {
-    public guilds = new MockCollection<string, MockGuild>();
+    public guilds = new MockCollectionManager<string, MockGuild>();
     public user: MockUser;
     private testLoggedIn: boolean = false;
     private testCallbacks: Map<string, (...data: any[]) => void> = new Map();
@@ -45,9 +45,9 @@ export class MockDiscordClient {
                 type: "text",
             },
         ];
-        this.guilds.set("123", new MockGuild("MyGuild", channels));
-        this.guilds.set("456", new MockGuild("My Spaces Gui", channels));
-        this.guilds.set("789", new MockGuild("My Dash-Guild", channels));
+        this.guilds.cache.set("123", new MockGuild("MyGuild", channels));
+        this.guilds.cache.set("456", new MockGuild("My Spaces Gui", channels));
+        this.guilds.cache.set("789", new MockGuild("My Dash-Guild", channels));
         this.user = new MockUser("12345");
     }
 
diff --git a/test/mocks/guild.ts b/test/mocks/guild.ts
index 9f1c394..5cc7ac1 100644
--- a/test/mocks/guild.ts
+++ b/test/mocks/guild.ts
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-import {MockCollection} from "./collection";
+import {MockCollectionManager} from "./collection";
 import {MockMember} from "./member";
 import {MockEmoji} from "./emoji";
 import {Channel} from "better-discord.js"
@@ -24,10 +24,10 @@ import {MockRole} from "./role";
 /* tslint:disable:no-unused-expression max-file-line-count no-any */
 
 export class MockGuild {
-    public channels = new MockCollection<string, Channel>();
-    public members = new MockCollection<string, MockMember>();
-    public emojis = new MockCollection<string, MockEmoji>();
-    public roles = new MockCollection<string, MockRole>();
+    public channels = new MockCollectionManager<string, Channel>();
+    public members = new MockCollectionManager<string, MockMember>();
+    public emojis = new MockCollectionManager<string, MockEmoji>();
+    public roles = new MockCollectionManager<string, MockRole>();
     public id: string;
     public name: string;
     public icon: string;
@@ -35,7 +35,7 @@ export class MockGuild {
         this.id = id;
         this.name = name || id;
         channels.forEach((item) => {
-            this.channels.set(item.id, item);
+            this.channels.cache.set(item.id, item);
         });
     }
 
@@ -48,13 +48,13 @@ export class MockGuild {
     }
 
     public async fetchMember(id: string): Promise<MockMember|Error> {
-        if (this.members.has(id)) {
-            return this.members.get(id)!;
+        if (this.members.cache.has(id)) {
+            return this.members.cache.get(id)!;
         }
         throw new Error("Member not in this guild");
     }
 
     public _mockAddMember(member: MockMember) {
-        this.members.set(member.id, member);
+        this.members.cache.set(member.id, member);
     }
 }
diff --git a/test/mocks/member.ts b/test/mocks/member.ts
index 8e9c06c..3083a0d 100644
--- a/test/mocks/member.ts
+++ b/test/mocks/member.ts
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-import {MockCollection} from "./collection";
+import {MockCollectionManager} from "./collection";
 import {MockUser} from "./user";
 import {MockRole} from "./role";
 import * as Discord from "better-discord.js"
@@ -27,7 +27,7 @@ export class MockMember {
     public presence: Discord.Presence;
     public user: MockUser;
     public nickname: string;
-    public roles = new MockCollection<string, MockRole>();
+    public roles = new MockCollectionManager<string, MockRole>();
     constructor(id: string, username: string, public guild: any = null, public displayName: string = username) {
         this.id = id;
         this.presence = new Discord.Presence({} as any, {
diff --git a/test/mocks/presence.ts b/test/mocks/presence.ts
new file mode 100644
index 0000000..5759e9e
--- /dev/null
+++ b/test/mocks/presence.ts
@@ -0,0 +1,16 @@
+import { Presence } from "better-discord.js";
+import { MockUser } from "./user";
+
+export class MockPresence {
+    constructor(public internalUser: MockUser, guild: string, public status?: string, public activities: any = []) {
+
+    }
+
+    public get user() {
+        return this.internalUser;
+    }
+
+    public get userID() {
+        return this.internalUser.id;
+    }
+}
\ No newline at end of file
diff --git a/test/mocks/user.ts b/test/mocks/user.ts
index 83c6f1f..e816697 100644
--- a/test/mocks/user.ts
+++ b/test/mocks/user.ts
@@ -25,11 +25,15 @@ export class MockUser {
         public id: string,
         public username: string = "",
         public discriminator: string = "",
-        public avatarURL: string | null = "",
+        public avatarUrl: string | null = "",
         public avatar: string | null = "",
         public bot: boolean = false,
     ) { }
 
+    public avatarURL() {
+        return this.avatarUrl;
+    }
+
     public MockSetPresence(presence: Presence) {
         this.presence = presence;
     }
diff --git a/test/test_discordbot.ts b/test/test_discordbot.ts
index f2d21ad..d04f5f2 100644
--- a/test/test_discordbot.ts
+++ b/test/test_discordbot.ts
@@ -16,7 +16,6 @@ limitations under the License.
 
 import { expect } from "chai";
 import * as Proxyquire from "proxyquire";
-import * as Discord from "better-discord.js"
 
 import { MockGuild } from "./mocks/guild";
 import { MockMember } from "./mocks/member";
diff --git a/test/test_discordmessageprocessor.ts b/test/test_discordmessageprocessor.ts
index b6e793a..8af31e2 100644
--- a/test/test_discordmessageprocessor.ts
+++ b/test/test_discordmessageprocessor.ts
@@ -185,7 +185,7 @@ describe("DiscordMessageProcessor", () => {
                 "localhost", bot as DiscordBot);
             const guild: any = new MockGuild("123", []);
             const channel = new MockTextChannel(guild, {id: "456", name: "TestChannel"});
-            guild.channels.set("456", channel);
+            guild.channels.cache.set("456", channel);
             const msg = new MockMessage(channel) as any;
             msg.embeds = [];
             msg.content = "Hello <:hello:3333333>";
@@ -201,7 +201,7 @@ describe("DiscordMessageProcessor", () => {
                 "localhost", bot as DiscordBot);
             const guild: any = new MockGuild("123", []);
             const channel = new MockTextChannel(guild, {id: "456", name: "TestChannel"});
-            guild.channels.set("456", channel);
+            guild.channels.cache.set("456", channel);
             const msg = new MockMessage(channel) as any;
             msg.embeds = [];
             msg.content = "Hello <#3333333>";
@@ -214,7 +214,7 @@ describe("DiscordMessageProcessor", () => {
                 "localhost", bot as DiscordBot);
             const guild: any = new MockGuild("123", []);
             const channel = new MockTextChannel(guild, {id: "456", name: "TestChannel"});
-            guild.channels.set("456", channel);
+            guild.channels.cache.set("456", channel);
             const msg = new MockMessage(channel) as any;
             msg.embeds = [];
             msg.content = "Hello <#456>";
@@ -228,7 +228,7 @@ describe("DiscordMessageProcessor", () => {
                 "localhost", bot as DiscordBot);
             const guild: any = new MockGuild("123", []);
             const channel = new MockTextChannel(guild, {id: "678", name: "TestChannel"});
-            guild.channels.set("678", channel);
+            guild.channels.cache.set("678", channel);
             const msg = new MockMessage(channel) as any;
             msg.embeds = [];
             msg.content = "Hello <#678>";
diff --git a/test/test_matrixmessageprocessor.ts b/test/test_matrixmessageprocessor.ts
index 3b9b295..0c5e2b2 100644
--- a/test/test_matrixmessageprocessor.ts
+++ b/test/test_matrixmessageprocessor.ts
@@ -160,7 +160,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const member = new MockMember("12345", "TestUsername", guild);
-            guild.members.set("12345", member);
+            guild.members.cache.set("12345", member);
             const msg = getHtmlMessage("<a href=\"https://matrix.to/#/@_discord_12345:localhost\">TestUsername</a>");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("<@12345>");
@@ -169,7 +169,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const member = new MockMember("12345", "TestUsername", guild);
-            guild.members.set("12345", member);
+            guild.members.cache.set("12345", member);
             const msg = getHtmlMessage("<a href=\"https://matrix.to/#/@_discord_789:localhost\">TestUsername</a>");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("[TestUsername](https://matrix.to/#/@_discord_789:localhost)");
@@ -178,7 +178,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const channel = new MockChannel("12345", guild, "text", "SomeChannel");
-            guild.channels.set("12345", channel as any);
+            guild.channels.cache.set("12345", channel as any);
             const msg = getHtmlMessage("<a href=\"https://matrix.to/#/#_discord_1234_12345:" +
                 "localhost\">#SomeChannel</a>");
             const result = await mp.FormatMessage(msg, guild as any);
@@ -188,7 +188,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const channel = new MockChannel("12345", guild, "text", "SomeChannel");
-            guild.channels.set("12345", channel as any);
+            guild.channels.cache.set("12345", channel as any);
             const msg = getHtmlMessage("<a href=\"https://matrix.to/#/#_discord_1234_789:localhost\">#SomeChannel</a>");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("[#SomeChannel](https://matrix.to/#/#_discord_1234_789:localhost)");
@@ -250,7 +250,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const emoji = new MockEmoji("123456", "test_emoji");
-            guild.emojis.set("123456", emoji);
+            guild.emojis.cache.set("123456", emoji);
             const msg = getHtmlMessage("<img alt=\"test_emoji\">");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("<:test_emoji:123456>");
@@ -259,7 +259,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const emoji = new MockEmoji("123456", "test_emoji");
-            guild.emojis.set("123456", emoji);
+            guild.emojis.cache.set("123456", emoji);
             const msg = getHtmlMessage("<img src=\"mxc://real_emote:localhost\">");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("<:test_emoji:123456>");
@@ -268,7 +268,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const emoji = new MockEmoji("123456", "test_emoji");
-            guild.emojis.set("123456", emoji);
+            guild.emojis.cache.set("123456", emoji);
             const msg = getHtmlMessage("<img alt=\"yay\" src=\"mxc://unreal_emote:localhost\">");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("[yay mxc://unreal_emote:localhost ]");
@@ -277,7 +277,7 @@ describe("MatrixMessageProcessor", () => {
             const mp = new MatrixMessageProcessor(bot, config);
             const guild = new MockGuild("1234");
             const emoji = new MockEmoji("123456", "test_emoji");
-            guild.emojis.set("123456", emoji);
+            guild.emojis.cache.set("123456", emoji);
             const msg = getHtmlMessage("<img>");
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("");
diff --git a/test/test_matrixroomhandler.ts b/test/test_matrixroomhandler.ts
index bcb884d..5a25d01 100644
--- a/test/test_matrixroomhandler.ts
+++ b/test/test_matrixroomhandler.ts
@@ -70,7 +70,7 @@ function createRH(opts: any = {}) {
                     chan.members.set("54321", new MockMember("54321", "testuser2"));
                     chan.members.set("bot12345", new MockMember("bot12345", "botuser"));
                 }
-                guild.members = chan.members;
+                guild.members.updateCache(chan.members);
                 return chan;
             } else {
                 throw new Error("Roomid not found");
diff --git a/test/test_presencehandler.ts b/test/test_presencehandler.ts
index f11bae3..2282bec 100644
--- a/test/test_presencehandler.ts
+++ b/test/test_presencehandler.ts
@@ -21,6 +21,7 @@ import { PresenceHandler } from "../src/presencehandler";
 import { DiscordBot } from "../src/bot";
 import { MockUser } from "./mocks/user";
 import { AppserviceMock } from "./mocks/appservicemock";
+import { MockPresence } from "./mocks/presence";
 
 // we are a test file and thus need those
 /* tslint:disable:no-unused-expression max-file-line-count no-any */
@@ -40,7 +41,7 @@ const bot: any = {
 describe("PresenceHandler", () => {
     describe("init", () => {
         it("constructor", () => {
-            const handler = new PresenceHandler(bot as DiscordBot);
+           new PresenceHandler(bot as DiscordBot);
         });
     });
     describe("Stop", () => {
@@ -54,19 +55,19 @@ describe("PresenceHandler", () => {
         it("adds a user properly", () => {
             const handler = new PresenceHandler(bot as DiscordBot);
             const COUNT = 2;
-            handler.EnqueueUser(new MockUser("abc", "def") as any);
-            handler.EnqueueUser(new MockUser("123", "ghi") as any);
+            handler.EnqueueUser(new MockPresence(new MockUser("abc", "alice"), "def") as any);
+            handler.EnqueueUser(new MockPresence(new MockUser("123", "bob"), "ghi") as any);
             expect(handler.QueueCount).to.be.equal(COUNT);
         });
         it("does not add duplicate users", () => {
             const handler = new PresenceHandler(bot as DiscordBot);
-            handler.EnqueueUser(new MockUser("abc", "def") as any);
-            handler.EnqueueUser(new MockUser("abc", "def") as any);
+            handler.EnqueueUser(new MockPresence(new MockUser("123", "alice"), "def") as any);
+            handler.EnqueueUser(new MockPresence(new MockUser("123", "alice"), "def") as any);
             expect(handler.QueueCount).to.be.equal(1);
         });
         it("does not add the bot user", () => {
             const handler = new PresenceHandler(bot as DiscordBot);
-            handler.EnqueueUser(new MockUser("1234", "def") as any);
+            handler.EnqueueUser(new MockPresence(new MockUser("1234", "bob"), "ghi") as any);
             expect(handler.QueueCount).to.be.equal(0);
         });
     });
@@ -74,19 +75,19 @@ describe("PresenceHandler", () => {
         it("removes users properly", () => {
             const handler = new PresenceHandler(bot as DiscordBot);
             const members = [
-                new MockUser("abc", "def") as any,
-                new MockUser("def", "ghi") as any,
-                new MockUser("ghi", "wew") as any,
+                new MockPresence(new MockUser("abc", "alice"), "def") as any,
+                new MockPresence(new MockUser("def", "bob"), "ghi") as any,
+                new MockPresence(new MockUser("ghi", "foo"), "wew") as any,
             ];
             handler.EnqueueUser(members[0]);
             handler.EnqueueUser(members[1]);
-            handler.EnqueueUser(members[members.length - 1]);
+            handler.EnqueueUser(members[2]);
 
-            handler.DequeueUser(members[members.length - 1]);
+            handler.DequeueUser(members[2].user);
             expect(handler.QueueCount).to.be.equal(members.length - 1);
-            handler.DequeueUser(members[1]);
+            handler.DequeueUser(members[1].user);
             expect(handler.QueueCount).to.be.equal(1);
-            handler.DequeueUser(members[0]);
+            handler.DequeueUser(members[0].user);
             expect(handler.QueueCount).to.be.equal(0);
         });
     });
@@ -94,78 +95,49 @@ describe("PresenceHandler", () => {
         it("processes an online user", async () => {
             lastStatus = null;
             const handler = new PresenceHandler(bot as DiscordBot);
-            const member = new MockUser("abc", "def") as any;
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                status: "online",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member = new MockPresence(new MockUser("ghi", "alice"), "def", "online");
+            await handler.ProcessUser(member as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "online", undefined);
         });
         it("processes an offline user", async () => {
             lastStatus = null;
             const handler = new PresenceHandler(bot as DiscordBot);
-            const member = new MockUser("abc", "def") as any;
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                status: "offline",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member = new MockPresence(new MockUser("abc", "alice"), "def", "offline");
+            await handler.ProcessUser(member as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "offline", undefined);
         });
         it("processes an idle user", async () => {
             lastStatus = null;
             const handler = new PresenceHandler(bot as DiscordBot);
-            const member = new MockUser("abc", "def") as any;
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                status: "idle",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member = new MockPresence(new MockUser("abc", "alice"), "def", "idle");
+            await handler.ProcessUser(member as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "unavailable", undefined);
         });
         it("processes an dnd user", async () => {
             lastStatus = null;
             const handler = new PresenceHandler(bot as DiscordBot);
-            const member = new MockUser("abc", "def") as any;
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                status: "dnd",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member = new MockPresence(new MockUser("abc", "alice"), "def", "dnd");
+            await handler.ProcessUser(member as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "online", "Do not disturb");
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                activities: ({name: "Test Game", type: 'PLAYING'}),
-                status: "dnd",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member2 = new MockPresence(new MockUser("abc", "alice"), "def", "dnd", [{name: "Test Game", type: 'PLAYING'}]);
+            await handler.ProcessUser(member2  as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "online", "Do not disturb | Playing Test Game");
         });
         it("processes a user playing games", async () => {
             lastStatus = null;
             const handler = new PresenceHandler(bot as DiscordBot);
-            const member = new MockUser("abc", "def") as any;
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                activities: ({name: "Test Game", type: 'PLAYING'}),
-                status: "online",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member = new MockPresence(new MockUser("abc", "alice"), "def", "online", [{name: "Test Game", type: 'PLAYING'}]);
+            await handler.ProcessUser(member  as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "online", "Playing Test Game");
-            member.MockSetPresence(new Discord.Presence({} as any, {
-                activities: ({name: "Test Game", type: 'STREAMING'}),
-                status: "online",
-                user: member,
-            }));
-            await handler.ProcessUser(member);
-            appservice.getIntentForSuffix(member.id)
+            const member2 = new MockPresence(new MockUser("abc", "alice"), "def", "online", [{name: "Test Game", type: 'STREAMING'}]);
+            await handler.ProcessUser(member2  as any);
+            appservice.getIntentForSuffix(member.userID)
                 .underlyingClient.wasCalled("setPresenceStatus", true, "online", "Streaming Test Game");
         });
     });
diff --git a/test/test_usersyncroniser.ts b/test/test_usersyncroniser.ts
index 1afbfb9..b1813df 100644
--- a/test/test_usersyncroniser.ts
+++ b/test/test_usersyncroniser.ts
@@ -59,9 +59,9 @@ function CreateUserSync(remoteUsers: RemoteUser[] = [], ghostConfig: any = {}) {
         GetChannelFromRoomId: (id) => {
             if (id === "!found:localhost") {
                 const guild = new MockGuild("666666");
-                guild.members.set("123456", new MockMember("123456", "fella", guild));
+                guild.members.cache.set("123456", new MockMember("123456", "fella", guild));
                 const chan = new MockChannel("543345", guild);
-                guild.channels.set("543345", chan as any);
+                guild.channels.cache.set("543345", chan as any);
                 return chan;
             }
             throw new Error("Channel not found");
@@ -526,7 +526,7 @@ describe("UserSyncroniser", () => {
             const TESTROLE_COLOR = 1337;
             const TESTROLE_POSITION = 42;
             const role = new MockRole("123", TESTROLE_NAME, TESTROLE_COLOR, TESTROLE_POSITION);
-            member.roles.set("123", role);
+            member.roles.cache.set("123", role);
             const state = await userSync.GetUserStateForGuildMember(member as any);
             expect(state.roles.length).to.be.equal(1);
             expect(state.roles[0].name).to.be.equal(TESTROLE_NAME);
@@ -607,7 +607,7 @@ describe("UserSyncroniser", () => {
                 "username",
                 guild,
                 "FiddleDee");
-            newMember.roles.set("1234", role);
+            newMember.roles.cache.set("1234", role);
             await userSync.OnUpdateGuildMember(newMember as any);
             expect(bridge.getIntentForUserId("@_discord_123456:localhost")
                 .underlyingClient.wasCalled("sendStateEvent")).to.equal(GUILD_ROOM_IDS_WITH_ROLE.length);
-- 
GitLab