1 Commits

Author SHA1 Message Date
critters.zip
badc6baaf0 test: Increase test coverage (#39)
Some checks failed
Build Dev instance / build (push) Failing after 2m4s
* test: Increase test coverage

* Assert console.error on failed client.login test

* Remove redundant removeMember test
2026-04-09 15:38:14 -04:00
5 changed files with 64 additions and 75 deletions

View File

@@ -1,47 +0,0 @@
import {Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Unique} from "typeorm"
@Entity({name: "System", synchronize: true})
@Unique("UQ_System_userid", ['userid'])
@Unique("UQ_System_shortid", ['shortid'])
export class System {
@PrimaryGeneratedColumn()
id: number
@Column({
nullable: true,
})
shortid: string
@Column()
userid: string
@Column({
length: 100,
nullable: true
})
name: string
@Column({
type: "varchar",
nullable: true,
length: 100
})
fronter: string
@Column({
nullable: true,
})
grouptag: string
@Column({
nullable: true,
})
autoproxy: string
@CreateDateColumn({ type: 'timestamptz' })
createdAt: Date
@UpdateDateColumn({ type: 'timestamptz' })
updatedAt: Date
}

View File

@@ -1,14 +0,0 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class Update1773670748825 implements MigrationInterface {
name = 'Update1773670748825'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE "System" ("id" SERIAL NOT NULL, "shortid" character varying, "userid" character varying NOT NULL, "name" character varying(100), "fronter" character varying(100), "grouptag" character varying, "autoproxy" character varying, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "UQ_System_shortid" UNIQUE ("shortid"), CONSTRAINT "UQ_System_userid" UNIQUE ("userid"), CONSTRAINT "PK_b8e3f6855de5a4758fcb59e5567" PRIMARY KEY ("id"))`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE "System"`);
}
}

View File

@@ -1,13 +0,0 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class Update1773749921832 implements MigrationInterface {
name = 'Update1773749921832'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`INSERT INTO "System" ("userid") SELECT DISTINCT "userid" FROM "Member";`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DELETE from "System" USING "Member" WHERE "System".userid = "Member".userid;`);
}
}

View File

@@ -293,6 +293,21 @@ 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();

View File

@@ -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();