From e4c6df8bfc35a60eb711eb80e3a5b078399f162e Mon Sep 17 00:00:00 2001 From: Lambo <12111454+LamboCreeper@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:11:19 +0100 Subject: [PATCH] Fix DI not resolving injectables for event handlers (#299) * Add tsyringe to handle DI * Fix DI not resolving injectables for event handlers --- src/app.ts | 8 +++++--- src/event/handlers/DiscordMessageLinkHandler.ts | 4 ++-- test/appTest.ts | 8 ++++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/app.ts b/src/app.ts index cb9aec1..da84c1b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -7,8 +7,9 @@ import DirectoryUtils from "./utils/DirectoryUtils"; import DiscordUtils from "./utils/DiscordUtils"; import getConfigValue from "./utils/getConfigValue"; import Schedule from "./decorators/Schedule"; -import {container} from "tsyringe"; -import {setupCache} from "axios-cache-interceptor"; +import { container } from "tsyringe"; +import { setupCache } from "axios-cache-interceptor"; +import EventHandler from "./abstracts/EventHandler"; if (process.env.NODE_ENV !== getConfigValue("PRODUCTION_ENV")) { env({ @@ -64,7 +65,8 @@ class App { handlerFiles.forEach(handler => { const { default: Handler } = handler; - const handlerInstance = new Handler(); + + const handlerInstance = container.resolve(Handler); this.client.on(handlerInstance.getEvent(), handlerInstance.handle); }); diff --git a/src/event/handlers/DiscordMessageLinkHandler.ts b/src/event/handlers/DiscordMessageLinkHandler.ts index a19c6f2..ab0dd01 100644 --- a/src/event/handlers/DiscordMessageLinkHandler.ts +++ b/src/event/handlers/DiscordMessageLinkHandler.ts @@ -11,7 +11,7 @@ class DiscordMessageLinkHandler extends EventHandler { super(Events.MessageCreate); } - async handle(message: Message): Promise { + handle = async (message: Message) => { const messageRegex = /https:\/\/(?:ptb\.)?discord(?:app)?\.com\/channels\/\d+\/\d+\/\d+/gm; const matches = message.content.matchAll(messageRegex); @@ -28,7 +28,7 @@ class DiscordMessageLinkHandler extends EventHandler { } } } - } + }; } export default DiscordMessageLinkHandler; diff --git a/test/appTest.ts b/test/appTest.ts index 3214f1a..e8d007d 100644 --- a/test/appTest.ts +++ b/test/appTest.ts @@ -3,6 +3,7 @@ import { SinonSandbox, createSandbox, SinonStub } from "sinon"; import { Client, ChannelManager } from "discord.js"; import { BaseMocks } from "@lambocreeper/mock-discord.js"; import axios from "axios"; +import { container } from "tsyringe"; import App from "../src/app"; import DirectoryUtils from "../src/utils/DirectoryUtils"; import { AUTHENTICATION_MESSAGE_CHANNEL, AUTHENTICATION_MESSAGE_ID, PRODUCTION_ENV } from "../src/config.json"; @@ -80,11 +81,14 @@ describe("App", () => { sandbox.stub(DirectoryUtils, "getFilesInDirectory").callsFake(async () => [require("./MockHandler")]); const onStub = sandbox.stub(Client.prototype, "on"); - await new App().init(); - const mockHandler = new MockHandler(); + const resolveStub = sandbox.stub(container, "resolve").returns(mockHandler); + + await new App().init(); + expect(onStub.calledWith(mockHandler.getEvent())).to.be.true; + expect(resolveStub.calledWith(MockHandler)).to.be.true; }); it("should fetch auth channel and messages in production environment", async () => {