From 628677fc6fd11b20fdbfb554c2e6b0d15cd3022c Mon Sep 17 00:00:00 2001
From: "Andrew Morgan andrew@amorgan.xyz" <andrew@amorgan.xyz>
Date: Wed, 23 May 2018 01:55:23 +0200
Subject: [PATCH] Fixed issues and added tests

---
 src/matrixeventprocessor.ts       |  8 +++----
 test/mocks/collection.ts          |  4 +++-
 test/mocks/emoji.ts               |  3 +++
 test/mocks/guild.ts               |  2 ++
 test/test_matrixeventprocessor.ts | 39 ++++++++++++++++++++++++++++++-
 5 files changed, 49 insertions(+), 7 deletions(-)
 create mode 100644 test/mocks/emoji.ts

diff --git a/src/matrixeventprocessor.ts b/src/matrixeventprocessor.ts
index 3d6aeea..01f7963 100644
--- a/src/matrixeventprocessor.ts
+++ b/src/matrixeventprocessor.ts
@@ -99,19 +99,17 @@ export class MatrixEventProcessor {
     }
 
     public ReplaceDiscordEmoji(content: string, guild: Discord.Guild): string {
-        console.log("Gonna replace")
         let results = DISCORD_EMOJI_REGEX.exec(content);
         while (results !== null) {
             const emojiName = results[1];
             const emojiNameWithColons = results[0];
 
             // Check if this emoji exists in the guild
-            if(guild.emojis[emojiName] !== null) {
+            const emoji = guild.emojis.find((e) => e.name === emojiName);
+            if (emoji) {
                 // Replace :a: with <:a:123ID123>
-                const emojiID = guild.emojis.find((emoji) => { return emoji.name === emojiName }).id;
-                content = content.replace(emojiNameWithColons, `<${emojiNameWithColons}${emojiID}>`);
+                content = content.replace(emojiNameWithColons, `<${emojiNameWithColons}${emoji.id}>`);
             }
-
             results = DISCORD_EMOJI_REGEX.exec(content);
         }
         return content;
diff --git a/test/mocks/collection.ts b/test/mocks/collection.ts
index b724841..c02d9c8 100644
--- a/test/mocks/collection.ts
+++ b/test/mocks/collection.ts
@@ -1,4 +1,6 @@
-export class MockCollection<T1, T2> extends Map {
+import { Collection } from "discord.js";
+
+export class MockCollection<T1, T2> extends Collection<T1, T2> {
   public array(): T2[] {
     return [...this.values()];
   }
diff --git a/test/mocks/emoji.ts b/test/mocks/emoji.ts
new file mode 100644
index 0000000..06c6535
--- /dev/null
+++ b/test/mocks/emoji.ts
@@ -0,0 +1,3 @@
+export class MockEmoji {
+  constructor (public id: string = "", public name = "") { }
+}
diff --git a/test/mocks/guild.ts b/test/mocks/guild.ts
index 670d298..2c6a565 100644
--- a/test/mocks/guild.ts
+++ b/test/mocks/guild.ts
@@ -1,10 +1,12 @@
 import {MockCollection} from "./collection";
 import {MockMember} from "./member";
+import {MockEmoji} from "./emoji";
 import {Channel} from "discord.js";
 
 export class MockGuild {
   public channels = new MockCollection<string, Channel>();
   public members = new MockCollection<string, MockMember>();
+  public emojis = new MockCollection<string, MockEmoji>();
   public id: string;
   public name: string;
   constructor(id: string, channels: any[] = [], name: string = null) {
diff --git a/test/test_matrixeventprocessor.ts b/test/test_matrixeventprocessor.ts
index f4e032e..d2ca112 100644
--- a/test/test_matrixeventprocessor.ts
+++ b/test/test_matrixeventprocessor.ts
@@ -7,7 +7,9 @@ import * as Proxyquire from "proxyquire";
 import { PresenceHandler } from "../src/presencehandler";
 import { DiscordBot } from "../src/bot";
 import { MockGuild } from "./mocks/guild";
+import { MockCollection } from "./mocks/collection";
 import { MockMember } from "./mocks/member";
+import { MockEmoji } from "./mocks/emoji";
 import {MatrixEventProcessor, MatrixEventProcessorOpts} from "../src/matrixeventprocessor";
 import {DiscordBridgeConfig} from "../src/config";
 import {MessageProcessor, MessageProcessorOpts} from "../src/messageprocessor";
@@ -204,7 +206,42 @@ describe("MatrixEventProcessor", () => {
             }, {avatar_url: "test"}, mockChannel as any);
             Chai.assert.equal(evt.description, "@ here Hello!");
         });
-        // TODO: Add a test for replaceDiscordEmoji
+
+        it("Should process custom discord emojis.", () => {
+            const processor = createMatrixEventProcessor(false, false, true);
+            const mockEmoji = new MockEmoji("123", "supercake");
+            const mockCollectionEmojis = new MockCollection<string, MockEmoji>();
+            mockCollectionEmojis.set("123", mockEmoji);
+
+            const mockChannelEmojis = new MockChannel("test", {
+                emojis: mockCollectionEmojis,
+            });
+            const evt = processor.EventToEmbed({
+                sender: "@test:localhost",
+                content: {
+                    body: "I like :supercake:",
+                },
+            }, {avatar_url: "test"}, mockChannelEmojis as any);
+            Chai.assert.equal(evt.description, "I like <:supercake:123>");
+        });
+
+        it("Should not process invalid custom discord emojis.", () => {
+            const processor = createMatrixEventProcessor(false, false, true);
+            const mockEmoji = new MockEmoji("123", "supercake");
+            const mockCollectionEmojis = new MockCollection<string, MockEmoji>();
+            mockCollectionEmojis.set("123", mockEmoji);
+
+            const mockChannelEmojis = new MockChannel("test", {
+                emojis: mockCollectionEmojis,
+            });
+            const evt = processor.EventToEmbed({
+                sender: "@test:localhost",
+                content: {
+                    body: "I like :lamecake:",
+                },
+            }, {avatar_url: "test"}, mockChannelEmojis as any);
+            Chai.assert.equal(evt.description, "I like :lamecake:");
+        });
     });
     describe("FindMentionsInPlainBody", () => {
         it("processes mentioned username correctly", async () => {
-- 
GitLab