Skip to content

Commit de14c9d

Browse files
authored
Merge pull request #1955 from jng34/unitTestingForUserModel
Unit testing for User model
2 parents 55bb9e6 + 4e793e3 commit de14c9d

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

backend/models/user.model.test.js

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
// import necessary modules
2+
const mongoose = require('mongoose');
3+
const { User } = require('./user.model');
4+
5+
describe('Unit tests for User Model', () => {
6+
// Clears all mocks after each test
7+
afterEach(() => {
8+
jest.restoreAllMocks();
9+
});
10+
11+
describe('Serialization test', () => {
12+
it('should return the correct serialized user object', async () => {
13+
// Create mock user data
14+
const userObj = {
15+
_id: new mongoose.Types.ObjectId(),
16+
name: {
17+
firstName: 'mock',
18+
lastName: 'user',
19+
},
20+
email: 'mock.user@example.com',
21+
accessLevel: 'user',
22+
createdDate: new Date(),
23+
currentRole: 'developer',
24+
desiredRole: 'lead developer',
25+
newMember: false,
26+
currentJobTitle: 'Software Engineer',
27+
desiredJobTitle: 'Senior Software Engineer',
28+
skillsToMatch: ['Jest', 'Node.js'],
29+
firstAttended: '2025-01-01',
30+
attendanceReason: 'To learn and contribute',
31+
githubHandle: 'mockuser',
32+
projects: ['ProjectId1', 'ProjectId2'],
33+
phone: '123-456-7890',
34+
textingOk: true,
35+
slackName: 'mockuser',
36+
isHflaGithubMember: true,
37+
githubPublic2FA: true,
38+
availability: 'Weekdays',
39+
managedProjects: ['Project1', 'Project2'],
40+
isActive: true,
41+
};
42+
43+
// Create a mock user instance
44+
const mockUser = new User(userObj);
45+
const serializedUser = mockUser.serialize();
46+
47+
// Test
48+
expect(serializedUser).toEqual({
49+
id: mockUser._id,
50+
name: {
51+
firstName: mockUser.name.firstName,
52+
lastName: mockUser.name.lastName,
53+
},
54+
email: mockUser.email,
55+
accessLevel: mockUser.accessLevel,
56+
createdDate: mockUser.createdDate,
57+
currentRole: mockUser.currentRole,
58+
desiredRole: mockUser.desiredRole,
59+
newMember: mockUser.newMember,
60+
currentJobTitle: mockUser.currentRole,
61+
desiredJobTitle: mockUser.desiredRole,
62+
skillsToMatch: mockUser.skillsToMatch,
63+
firstAttended: mockUser.firstAttended,
64+
attendanceReason: mockUser.attendanceReason,
65+
githubHandle: mockUser.githubHandle,
66+
projects: mockUser.projects,
67+
phone: mockUser.phone,
68+
textingOk: mockUser.textingOk,
69+
slackName: mockUser.slackName,
70+
isHflaGithubMember: mockUser.isHflaGithubMember,
71+
githubPublic2FA: mockUser.githubPublic2FA,
72+
availability: mockUser.availability,
73+
managedProjects: mockUser.managedProjects,
74+
isActive: mockUser.isActive,
75+
});
76+
});
77+
});
78+
79+
describe('Validation test', () => {
80+
it('should fail validation check if accessLevel is invalid', async () => {
81+
// Create a mock user with an invalid accessLevel
82+
const mockuser = new User({
83+
accessLevel: 'projectleader', // not 'user', 'admin', or 'superadmin'
84+
});
85+
86+
// Attempt to validate the mock user by checking for valid accessLevel
87+
let error;
88+
try {
89+
await mockuser.validate();
90+
} catch (err) {
91+
error = err;
92+
}
93+
94+
// Tests
95+
expect(error).toBeDefined();
96+
expect(error.errors.accessLevel).toBeDefined();
97+
});
98+
99+
it('should pass validation with valid user data', async () => {
100+
// Create a mock user with valid data
101+
const mockUser = new User({
102+
name: {
103+
firstName: 'Valid',
104+
lastName: 'User',
105+
},
106+
email: 'mockuser@gmail.com',
107+
accessLevel: 'user',
108+
});
109+
110+
// Attempt to save the mock user
111+
let error;
112+
try {
113+
await mockUser.validate();
114+
} catch (err) {
115+
error = err;
116+
}
117+
118+
// Tests
119+
expect(error).toBeUndefined();
120+
expect(mockUser.email).toBe('mockuser@gmail.com');
121+
expect(mockUser.accessLevel).toBe('user');
122+
await expect(mockUser.validate()).resolves.toBeUndefined(); // async validation check
123+
});
124+
});
125+
});

0 commit comments

Comments
 (0)