Skip to content

Commit 16a1ff8

Browse files
committed
tests
1 parent 5fe148e commit 16a1ff8

5 files changed

Lines changed: 575 additions & 30 deletions

File tree

src/backend/src/services/reimbursement-requests.services.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,12 +1052,12 @@ export default class ReimbursementRequestService {
10521052
}
10531053

10541054
/**
1055-
* Adds a reimbursement status with type pending finance to the given reimbursement request
1055+
* Adds a reimbursement status with type Leadership Approved to the given reimbursement request
10561056
*
10571057
* @param reimbursementRequestId The id of the reimbursement request to approve
10581058
* @param submitter The person approving the reimbursement request
10591059
* @param organizationId The organization the user is currently in
1060-
* @returns The Pending Finance reimbursement status
1060+
* @returns The Leadership Approved reimbursement status
10611061
*/
10621062
static async leadershipApproveReimbursementRequest(
10631063
reimbursementRequestId: string,
@@ -1082,7 +1082,7 @@ export default class ReimbursementRequestService {
10821082

10831083
if (
10841084
reimbursementRequest.reimbursementStatuses.some(
1085-
(reimbursementStatus) => reimbursementStatus.type === Reimbursement_Status_Type.PENDING_FINANCE
1085+
(reimbursementStatus) => reimbursementStatus.type === Reimbursement_Status_Type.LEADERSHIP_APPROVED
10861086
)
10871087
)
10881088
throw new HttpException(400, 'This reimbursement request has already been approved by leadership');
@@ -1140,10 +1140,15 @@ export default class ReimbursementRequestService {
11401140
throw new InvalidOrganizationException('Reimbursement Request');
11411141

11421142
if (
1143-
!reimbursementRequest.reimbursementStatuses.some((status) => status.type === ReimbursementStatusType.PENDING_FINANCE)
1143+
!reimbursementRequest.reimbursementStatuses.some((status) => status.type === ReimbursementStatusType.LEADERSHIP_APPROVED)
11441144
) {
11451145
throw new HttpException(400, 'This reimbursement request has not been approved by leadership');
11461146
}
1147+
if (
1148+
!reimbursementRequest.reimbursementStatuses.some((status) => status.type === ReimbursementStatusType.PENDING_FINANCE)
1149+
) {
1150+
throw new HttpException(400, 'This reimbursement request has not been set as pending finance');
1151+
}
11471152
if (
11481153
reimbursementRequest.reimbursementStatuses.some(
11491154
(status) => status.type === ReimbursementStatusType.PENDING_SABO_SUBMISSION
@@ -1491,6 +1496,14 @@ export default class ReimbursementRequestService {
14911496
return accountCodeTransformer(accountCode);
14921497
}
14931498

1499+
/**
1500+
* Adds a reimbursement status with type pending finance to the given reimbursement request
1501+
*
1502+
* @param reimbursementRequestId The id of the reimbursement request to approve
1503+
* @param submitter The person approving the reimbursement request
1504+
* @param organizationId The organization the user is currently in
1505+
* @returns The Pending Finance reimbursement status
1506+
*/
14941507
static async markPendingFinance(
14951508
user: User,
14961509
reimbursementRequestId: string,

src/backend/tests/test-data/users.test-data.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,24 @@ export const member: CreateTestUserParams = {
9898
role: RoleEnum.MEMBER
9999
};
100100

101+
export const robinMember: CreateTestUserParams = {
102+
firstName: 'Dick',
103+
lastName: 'Grayson',
104+
email: 'robin@gmail.com',
105+
emailId: 'robin',
106+
role: RoleEnum.MEMBER,
107+
googleAuthId: 'robin'
108+
};
109+
110+
export const cyborgMember: CreateTestUserParams = {
111+
firstName: 'Victor',
112+
lastName: 'Stone',
113+
email: 'cyborg@gmail.com',
114+
emailId: 'cyborg',
115+
role: RoleEnum.MEMBER,
116+
googleAuthId: 'cyborg'
117+
};
118+
101119
export const batmanSettings: User_Settings = {
102120
id: 'bm',
103121
userId: '1',

src/backend/tests/test-utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ export const resetUsers = async () => {
123123
await prisma.assembly.deleteMany();
124124
await prisma.team.deleteMany();
125125
await prisma.user_Secure_Settings.deleteMany();
126+
await prisma.receipt.deleteMany();
126127
await prisma.reimbursement_Product.deleteMany();
127128
await prisma.reimbursement_Status.deleteMany();
128129
await prisma.reimbursement_Request_Comment.deleteMany();

src/backend/tests/unmocked/organization.test.ts

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { LinkCreateArgs } from 'shared';
22
import { AccessDeniedAdminOnlyException, HttpException, NotFoundException } from '../../src/utils/errors.utils';
3-
import { batmanAppAdmin, supermanAdmin, wonderwomanGuest } from '../test-data/users.test-data';
3+
import { batmanAppAdmin, flashAdmin, supermanAdmin, wonderwomanGuest } from '../test-data/users.test-data';
44
import { createTestLinkType, createTestOrganization, createTestUser, resetUsers } from '../test-utils';
55
import prisma from '../../src/prisma/prisma';
66
import { testLink1 } from '../test-data/organizations.test-data';
@@ -285,4 +285,77 @@ describe('Organization Tests', () => {
285285
expect(updatedOrg.sponsorshipNotificationsSlackChannelId).toEqual('sponsorshipNotifId');
286286
});
287287
});
288+
289+
describe('Get Finance Delegates', () => {
290+
it('Succeeds and returns empty array when no delegates', async () => {
291+
const delegates = await OrganizationsService.getFinanceDelegates(orgId);
292+
293+
expect(delegates).not.toBeNull();
294+
expect(delegates.length).toBe(0);
295+
});
296+
297+
it('Succeeds and returns all finance delegates', async () => {
298+
const testBatman = await createTestUser(batmanAppAdmin, orgId);
299+
const testSuperman = await createTestUser(supermanAdmin, orgId);
300+
301+
await OrganizationsService.setFinanceDelegates(testBatman, orgId, [testSuperman.userId]);
302+
303+
const delegates = await OrganizationsService.getFinanceDelegates(orgId);
304+
305+
expect(delegates).not.toBeNull();
306+
expect(delegates.length).toBe(1);
307+
expect(delegates[0].userId).toBe(testSuperman.userId);
308+
expect(delegates[0].firstName).toBe('Clark');
309+
expect(delegates[0].lastName).toBe('Kent');
310+
});
311+
});
312+
313+
describe('Set Finance Delegates', () => {
314+
it('Fails if user is not admin', async () => {
315+
const testWonderwoman = await createTestUser(wonderwomanGuest, orgId);
316+
const testSuperman = await createTestUser(supermanAdmin, orgId);
317+
318+
await expect(OrganizationsService.setFinanceDelegates(testWonderwoman, orgId, [testSuperman.userId])).rejects.toThrow(
319+
new AccessDeniedAdminOnlyException('set finance delegates')
320+
);
321+
});
322+
323+
it('Fails if one or more user IDs do not exist', async () => {
324+
const testBatman = await createTestUser(batmanAppAdmin, orgId);
325+
326+
await expect(OrganizationsService.setFinanceDelegates(testBatman, orgId, ['nonexistent-user-id'])).rejects.toThrow(
327+
new NotFoundException('User', 'one or more user IDs')
328+
);
329+
});
330+
331+
it('Succeeds and sets finance delegates', async () => {
332+
const testBatman = await createTestUser(batmanAppAdmin, orgId);
333+
const testSuperman = await createTestUser(supermanAdmin, orgId);
334+
const testFlash = await createTestUser(flashAdmin, orgId);
335+
336+
const delegates = await OrganizationsService.setFinanceDelegates(testBatman, orgId, [
337+
testSuperman.userId,
338+
testFlash.userId
339+
]);
340+
341+
expect(delegates).not.toBeNull();
342+
expect(delegates.length).toBe(2);
343+
expect(delegates.some((delegate) => delegate.userId === testSuperman.userId)).toBeTruthy();
344+
expect(delegates.some((delegate) => delegate.userId === testFlash.userId)).toBeTruthy();
345+
});
346+
347+
it('Succeeds and replaces existing finance delegates', async () => {
348+
const testBatman = await createTestUser(batmanAppAdmin, orgId);
349+
const testSuperman = await createTestUser(supermanAdmin, orgId);
350+
const testFlash = await createTestUser(flashAdmin, orgId);
351+
352+
await OrganizationsService.setFinanceDelegates(testBatman, orgId, [testSuperman.userId]);
353+
354+
const updatedDelegates = await OrganizationsService.setFinanceDelegates(testBatman, orgId, [testFlash.userId]);
355+
356+
expect(updatedDelegates).not.toBeNull();
357+
expect(updatedDelegates.length).toBe(1);
358+
expect(updatedDelegates[0].userId).toBe(testFlash.userId);
359+
});
360+
});
288361
});

0 commit comments

Comments
 (0)