diff --git a/backend/__tests__/api/controllers/user.spec.ts b/backend/__tests__/api/controllers/user.spec.ts index 867f050cbfa2..25a036a47fbf 100644 --- a/backend/__tests__/api/controllers/user.spec.ts +++ b/backend/__tests__/api/controllers/user.spec.ts @@ -635,6 +635,7 @@ describe("user controller test", () => { const blocklistAddMock = vi.spyOn(BlocklistDal, "add"); const connectionsDeletebyUidMock = vi.spyOn(ConnectionsDal, "deleteByUid"); const logsDeleteUserMock = vi.spyOn(LogDal, "deleteUserLogs"); + const georgeUnlinkDiscordMock = vi.spyOn(GeorgeQueue, "unlinkDiscord"); beforeEach(() => { [ @@ -648,6 +649,7 @@ describe("user controller test", () => { purgeUserFromXpLeaderboardsMock, connectionsDeletebyUidMock, logsDeleteUserMock, + georgeUnlinkDiscordMock, ].forEach((it) => it.mockResolvedValue(undefined)); deleteAllResultMock.mockResolvedValue({} as any); @@ -667,10 +669,11 @@ describe("user controller test", () => { purgeUserFromXpLeaderboardsMock, connectionsDeletebyUidMock, logsDeleteUserMock, + georgeUnlinkDiscordMock, ].forEach((it) => it.mockClear()); }); - it("should add user to blocklist if banned", async () => { + it("should delete user", async () => { //GIVEN const user = { uid, @@ -706,7 +709,9 @@ describe("user controller test", () => { (await configuration).leaderboards.weeklyXp, ); expect(logsDeleteUserMock).toHaveBeenCalledWith(uid); + expect(georgeUnlinkDiscordMock).toHaveBeenCalledWith(user.discordId, uid); }); + it("should delete user without adding to blocklist if not banned", async () => { //GIVEN const user = { @@ -725,23 +730,6 @@ describe("user controller test", () => { //THEN expect(blocklistAddMock).not.toHaveBeenCalled(); - - expect(deleteUserMock).toHaveBeenCalledWith(uid); - expect(firebaseDeleteUserMock).toHaveBeenCalledWith(uid); - expect(deleteAllApeKeysMock).toHaveBeenCalledWith(uid); - expect(deleteAllPresetsMock).toHaveBeenCalledWith(uid); - expect(deleteConfigMock).toHaveBeenCalledWith(uid); - expect(deleteAllResultMock).toHaveBeenCalledWith(uid); - expect(connectionsDeletebyUidMock).toHaveBeenCalledWith(uid); - expect(purgeUserFromDailyLeaderboardsMock).toHaveBeenCalledWith( - uid, - (await configuration).dailyLeaderboards, - ); - expect(purgeUserFromXpLeaderboardsMock).toHaveBeenCalledWith( - uid, - (await configuration).leaderboards.weeklyXp, - ); - expect(logsDeleteUserMock).toHaveBeenCalledWith(uid); }); it("should not fail if userInfo cannot be found", async () => { @@ -885,6 +873,24 @@ describe("user controller test", () => { (await configuration).leaderboards.weeklyXp, ); }); + it("should not unlink user without discordId", async () => { + //GIVEN + const user = { + uid, + name: "name", + email: "email", + } as Partial as UserDal.DBUser; + getUserMock.mockResolvedValue(user); + + //WHEN + await mockApp + .delete("/users/") + .set("Authorization", `Bearer ${uid}`) + .expect(200); + + //THEN + expect(georgeUnlinkDiscordMock).not.toHaveBeenCalled(); + }); }); describe("resetUser", () => { const getPartialUserMock = vi.spyOn(UserDal, "getPartialUser"); diff --git a/backend/src/api/controllers/user.ts b/backend/src/api/controllers/user.ts index b89a7874515f..c9eb977bbad4 100644 --- a/backend/src/api/controllers/user.ts +++ b/backend/src/api/controllers/user.ts @@ -282,7 +282,7 @@ export async function deleteUser(req: MonkeyRequest): Promise { } //cleanup database - await Promise.all([ + const tasks = [ UserDAL.deleteUser(uid), deleteUserLogs(uid), deleteAllApeKeys(uid), @@ -298,7 +298,13 @@ export async function deleteUser(req: MonkeyRequest): Promise { req.ctx.configuration.leaderboards.weeklyXp, ), ConnectionsDal.deleteByUid(uid), - ]); + ]; + + if (userInfo?.discordId !== undefined) { + tasks.push(GeorgeQueue.unlinkDiscord(userInfo.discordId, uid)); + } + + await Promise.all(tasks); try { //delete user from firebase