|  | 
|  | 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