From c645bb0aeaebb44dda41593bd1428fe13b404984 Mon Sep 17 00:00:00 2001 From: Aster Fialla Date: Tue, 17 Feb 2026 22:23:47 -0500 Subject: [PATCH] renamed db to database more tests and fixing logic for memberhelper --- src/{db.js => database.js} | 0 src/helpers/memberHelper.js | 46 +++++----- tests/helpers/memberHelper.test.js | 135 ++++++++++++++++++++++++++--- 3 files changed, 149 insertions(+), 32 deletions(-) rename src/{db.js => database.js} (100%) diff --git a/src/db.js b/src/database.js similarity index 100% rename from src/db.js rename to src/database.js diff --git a/src/helpers/memberHelper.js b/src/helpers/memberHelper.js index c5a9c4c..af31600 100644 --- a/src/helpers/memberHelper.js +++ b/src/helpers/memberHelper.js @@ -1,4 +1,4 @@ -import {database} from '../db.js'; +import {database} from '../database.js'; import {enums} from "../enums.js"; import {EmptyResultError, Op} from "sequelize"; import {EmbedBuilder} from "@fluxerjs/core"; @@ -97,8 +97,8 @@ mh.addNewMember = async function (authorId, args) { const displayName = args[2]; return await mh.addFullMember(authorId, memberName, displayName).then((member) => { - let success = `Member was successfully added.\nName: ${member.dataValues.name}` - success += displayName ? `\nDisplay name: ${member.dataValues.displayname}` : ""; + let success = `Member was successfully added.\nName: ${member.name}` + success += displayName ? `\nDisplay name: ${member.displayname}` : ""; return success; }).catch(e => { throw e; @@ -115,14 +115,17 @@ mh.addNewMember = async function (authorId, args) { * @throws {RangeError} When the name doesn't exist. */ mh.updateName = async function (authorId, args) { - if (args[1] && args[1] === "--help" || !args[1]) { - return enums.help.DISPLAY_NAME; + if (args[2] && args[2] === "--help") { + return enums.help.NAME; } const name = args[2]; - const trimmedName = name ? name.trim() : null; - if (!name || trimmedName === null) { - throw new RangeError(`Display name ${enums.err.NO_VALUE}`); + if (!name) { + return `The name for ${name} is ${name}, but you probably knew that!`; + } + const trimmedName = name.trim(); + if (trimmedName === '') { + throw new RangeError(`Name ${enums.err.NO_VALUE}`); } return await mh.updateMemberField(authorId, args).catch((e) => { throw e @@ -147,16 +150,19 @@ mh.updateDisplayName = async function (authorId, args) { const displayName = args[2]; const trimmedName = displayName ? displayName.trim() : null; - if (!displayName || trimmedName === null) { + if (!displayName) { return await mh.getMemberByName(authorId, memberName).then((member) => { if (member && member.displayname) { return `Display name for ${memberName} is: \"${member.displayname}\".`; } else if (member) { - throw new RangeError(`Display name ${enums.err.NO_VALUE}`); + throw new EmptyResultError(`Display name ${enums.err.NO_VALUE}`); } }); } else if (displayName.length > 32) { - throw new RangeError(enums.err.DISPLAY_NAME_TOO_LONG); + throw new RangeError(enums.err.NO_VALUE); + } + else if (trimmedName === '') { + throw new RangeError(`Display name ${enums.err.NO_VALUE}`); } return await mh.updateMemberField(authorId, args).catch((e) => { throw e @@ -346,15 +352,13 @@ mh.updateMemberField = async function (authorId, args) { name: {[Op.iLike]: memberName}, userid: authorId } - }).then(() => { - return `Updated ${columnName} for ${memberName} to ${value}${fluxerPropicWarning ?? ''}.`; - }).catch(e => { - if (e === EmptyResultError) { - throw new EmptyResultError(`Can't update ${memberName}. ${enums.err.NO_MEMBER}: ${e.message}`); - } else { - throw new Error(`Can't update ${memberName}. ${e.message}`); - } - }); + }).then((res) => { + if (res[0] === 0) { + throw new EmptyResultError(`Can't update ${memberName}. ${enums.err.NO_MEMBER}.`); + } else { + return `Updated ${columnName} for ${memberName} to ${value}${fluxerPropicWarning ?? ''}.`; + } + }) } /** @@ -440,7 +444,7 @@ mh.getMemberByName = async function (authorId, memberName) { mh.getProxyByMember = async function (authorId, memberName) { return await mh.getMemberByName(authorId, memberName).then((member) => { if (member) { - return member.dataValues.proxy; + return member.proxy; } throw new EmptyResultError(enums.err.NO_MEMBER); }) diff --git a/tests/helpers/memberHelper.test.js b/tests/helpers/memberHelper.test.js index 2edbbef..aa66628 100644 --- a/tests/helpers/memberHelper.test.js +++ b/tests/helpers/memberHelper.test.js @@ -1,9 +1,9 @@ jest.mock('@fluxerjs/core', () => jest.fn()); -jest.mock('../../src/db.js', () => jest.fn()); +jest.mock('../../src/database.js', () => jest.fn()); jest.mock('sequelize', () => jest.fn()); const {EmbedBuilder} = require("@fluxerjs/core"); -const {database} = require('../../src/db.js'); +const {database} = require('../../src/database.js'); const {enums} = require('../../src/enums.js'); const {EmptyResultError, Op} = require('sequelize'); const {memberHelper} = require("../../src/helpers/memberHelper.js"); @@ -14,12 +14,14 @@ describe('MemberHelper', () => { const attachmentUrl = "../oya.png"; const attachmentExpiration = new Date('2026-01-01T00.00.00.0000Z') + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + }) describe('parseMemberCommand', () => { beforeEach(() => { - jest.resetModules(); - jest.clearAllMocks(); jest.spyOn(memberHelper, 'getMemberInfo').mockResolvedValue("member info"); jest.spyOn(memberHelper, 'addNewMember').mockResolvedValue("new member"); jest.spyOn(memberHelper, 'removeMember').mockResolvedValue("remove member"); @@ -40,8 +42,10 @@ describe('MemberHelper', () => { [['somePerson', 'proxy'], 'get proxy', 'getProxyByMember', 'somePerson'], [['somePerson', 'proxy', 'test'], 'update proxy', 'updateProxy', ['somePerson', 'proxy', 'test']], [['somePerson'], 'member info', 'getMemberInfo', 'somePerson'], - ])('%s returns correct values and calls methods', async (args, expectedResult, method, passedIn) => { + ])('%s calls methods and returns correct values', async (args, expectedResult, method, passedIn) => { + // Act return memberHelper.parseMemberCommand(authorId, authorFull, args).then((result) => { + // Assert expect(result).toEqual(expectedResult); expect(memberHelper[method]).toHaveBeenCalledTimes(1); expect(memberHelper[method]).toHaveBeenCalledWith(authorId, passedIn) @@ -49,10 +53,11 @@ describe('MemberHelper', () => { }); test('["somePerson", "propic"] returns correct values and calls methods', () => { - // arrange + // Arrange const args = ['somePerson', 'propic']; - // act & assert + // Act return memberHelper.parseMemberCommand(authorId, authorFull, args, attachmentUrl, attachmentExpiration).then((result) => { + // Assert expect(result).toEqual("update propic"); expect(memberHelper['updatePropic']).toHaveBeenCalledTimes(1); expect(memberHelper['updatePropic']).toHaveBeenCalledWith(authorId, args, attachmentUrl, attachmentExpiration) @@ -73,6 +78,7 @@ describe('MemberHelper', () => { const authorFull = 'somePerson#0001'; // Act memberHelper.parseMemberCommand(authorId, authorFull, args).then((result) => { + expect(result).toEqual(expectedResult); }); }); @@ -100,21 +106,128 @@ describe('MemberHelper', () => { [['somePerson', 'proxy'], 'get proxy error', 'getProxyByMember', 'somePerson'], [['somePerson', 'proxy', 'test'], 'update proxy error', 'updateProxy', ['somePerson', 'proxy', 'test']], [['somePerson'], 'member info error', 'getMemberInfo', 'somePerson'], - ])('%s returns correct values and calls methods', async (args, expectedError, method, passedIn) => { + ])('%s calls methods and throws correct values', async (args, expectedError, method, passedIn) => { + // Act memberHelper.parseMemberCommand(authorId, authorFull, args).catch((result) => { + // Assert expect(result).toEqual(new Error(expectedError)); expect(memberHelper[method]).toHaveBeenCalledTimes(1); expect(memberHelper[method]).toHaveBeenCalledWith(authorId, passedIn) }); }); }) + }) + describe('addNewMember', () => { + test('returns help if --help passed in', async() => { + // Arrange + const args = ['new', '--help']; + const expected = enums.help.NEW; + //Act + memberHelper.addNewMember(authorId, args).then((result) => { + // Assert + expect(result).toEqual(expected); + }) + }) - afterEach(() => { - // restore the spy created with spyOn - jest.restoreAllMocks(); + test('returns member without display name when name passed in', async () => { + // Arrange + const args = ['new', 'some person']; + const memberObject = { name: args[1] } + const expected = "Member was successfully added.\nName: " + args[1]; + jest.spyOn(memberHelper, 'addFullMember').mockResolvedValue(memberObject); + //Act + memberHelper.addNewMember(authorId, args).then((result) => { + // Assert + expect(result).toEqual(expected); + }) + }) + + test('returns member with display name when name and display name passed in', async () => { + // Arrange + const args = ['new', 'some person', 'Some person Full Name']; + const memberObject = { name: args[1], displayname: args[2] } + const expected = "Member was successfully added.\nName: " + args[1] + "\nDisplay name: " + args[2]; + jest.spyOn(memberHelper, 'addFullMember').mockResolvedValue(memberObject); + //Act + memberHelper.addNewMember(authorId, args).then((result) => { + // Assert + expect(result).toEqual(expected); + }) + }) + + test('throws expected error when addFullMember throws error', async () => { + // Arrange + const args = ['new', 'somePerson']; + const expected = 'add full member error'; + jest.spyOn(memberHelper, 'addFullMember').mockImplementation(() => { throw new Error(expected)}); + + //Act + memberHelper.addNewMember(authorId, args).catch((result) => { + // Assert + expect(result).toEqual(new Error(expected)); + }) + }) + }) + + describe('updateName', () => { + + test('sends help message when --help parameter passed in', async () => { + // Arrange + const args = ['somePerson', 'name', '--help']; + + // Act + memberHelper.updateName(authorId, args).then((result) => { + // Assert + expect(result).toEqual(enums.help.NAME); + }) + }) + + test('Sends string when no name', async () => { + // Arrange + const args = ['somePerson', 'name'] + + // Act + memberHelper.updateName(authorId, args).catch((result) => { + // Assert + expect(result).toEqual(new RangeError("Name " + enums.err.NO_VALUE)); + }) + }) + + test('throws error when name is empty', async () => { + // Arrange + const args = ['somePerson', 'name', " "]; + + // Act + memberHelper.updateName(authorId, args).catch((result) => { + // Assert + expect(result).toEqual(new RangeError("Name " + enums.err.NO_VALUE)); + }) + }) + + test('throws error when updateMemberField returns error', async () => { + // Arrange + const expected = 'update error'; + const args = ['somePerson', "name", "someNewPerson"]; + jest.spyOn(memberHelper, 'updateMemberField').mockImplementation(() => { + throw new Error(expected) + }); + // Act + memberHelper.updateName(authorId, args).catch((result) => { + // Assert + expect(result).toEqual(new Error(expected)); + }) }); }) + + describe('updateDisplayName', () => { + + }) + + afterEach(() => { + // restore the spy created with spyOn + jest.restoreAllMocks(); + }); })