From badc6baaf0040926b6a2c4ff94b344d31e0f5b21 Mon Sep 17 00:00:00 2001 From: "critters.zip" Date: Fri, 10 Apr 2026 05:38:14 +1000 Subject: [PATCH] test: Increase test coverage (#39) * test: Increase test coverage * Assert console.error on failed client.login test * Remove redundant removeMember test --- tests/bot.test.js | 17 ++++++++++- tests/helpers/memberHelper.test.js | 48 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/tests/bot.test.js b/tests/bot.test.js index bce1cc2..f9ecc98 100644 --- a/tests/bot.test.js +++ b/tests/bot.test.js @@ -293,8 +293,23 @@ describe('bot', () => { expect(client.login).toHaveBeenCalledWith(process.env.FLUXER_BOT_TOKEN) }) + test('login exits with code 1 if client.login fails', async () => { + // Arrange + let message = "client.login failed"; + client.login = jest.fn().mockImplementation(() => { throw new Error(message) }); + jest.spyOn(global.console, 'error').mockImplementation(() => {}); + jest.spyOn(process, 'exit').mockImplementation(() => {}); + // Act + await login(); + // Assert + expect(console.error).toHaveBeenCalledTimes(1); + expect(console.error).toHaveBeenCalledWith('Login failed:', new Error(message)); + expect(process.exit).toHaveBeenCalledTimes(1); + expect(process.exit).toHaveBeenCalledWith(1); + }) + afterEach(() => { // restore the spy created with spyOn jest.restoreAllMocks(); }); -}) \ No newline at end of file +}) diff --git a/tests/helpers/memberHelper.test.js b/tests/helpers/memberHelper.test.js index 4d0716b..e864924 100644 --- a/tests/helpers/memberHelper.test.js +++ b/tests/helpers/memberHelper.test.js @@ -67,6 +67,7 @@ describe('MemberHelper', () => { }); test.each([ + [[mockMember.name], null, null, undefined, false, mockMember.name], [[mockMember.name, '--help'], null, null, undefined, true, undefined], [['new', '--help'], null, null, 'new', true, '--help'], [['remove', '--help'], null, null, 'remove', true, '--help'], @@ -474,6 +475,30 @@ describe('MemberHelper', () => { }) }) + describe('removeMember', () => { + test('if removeMember returns a positive number, return a success message', async () => { + // Arrange + memberRepo.removeMember.mockResolvedValue(1); + const expectedReturn = `Member "${mockMember.name}" has been deleted.`; + // Act + const res = await memberHelper.removeMember(authorId, mockMember.name); + // Assert + expect(memberRepo.removeMember).toHaveBeenCalledTimes(1); + expect(memberRepo.removeMember).toHaveBeenCalledWith(authorId, mockMember.name); + expect(res).toEqual(expectedReturn); + }) + + test('if removeMember returns a negative number, throw error', async () => { + // Arrange + memberRepo.removeMember.mockResolvedValue(-1); + // Act + expect(memberHelper.removeMember(authorId, mockMember.name)).rejects.toThrow(new Error(`${enums.err.NO_MEMBER}`)); + // Assert + expect(memberRepo.removeMember).toHaveBeenCalledTimes(1); + expect(memberRepo.removeMember).toHaveBeenCalledWith(authorId, mockMember.name); + }) + }) + describe('addFullMember', () => { test('calls getMemberByName', async () => { // Arrange @@ -504,6 +529,29 @@ describe('MemberHelper', () => { expect(memberRepo.createMember).not.toHaveBeenCalled(); }) + test('if displayName is not filled out, call memberRepo.createMember with null value', async () => { + // Arrange + memberRepo.getMemberByName.mockResolvedValue(); + const expectedMemberArgs = { + name: mockMember.name, + userid: authorId, + displayname: null, + proxy: null, + propic: null + } + memberRepo.createMember = jest.fn().mockResolvedValue(expectedMemberArgs); + const expectedReturn = { + member: expectedMemberArgs, + errors: [`Display name ${enums.err.NO_VALUE}. ${enums.err.SET_TO_NULL}`] + } + // Act + const res = await memberHelper.addFullMember(authorId, mockMember.name, " "); + // Assert + expect(res).toEqual(expectedReturn); + expect(memberRepo.createMember).toHaveBeenCalledWith(expectedMemberArgs); + expect(memberRepo.createMember).toHaveBeenCalledTimes(1); + }) + test('if displayname is over 32 characters, call memberRepo.createMember with null value', async () => { // Arrange memberRepo.getMemberByName.mockResolvedValue();