148 lines
4.4 KiB
TypeScript
148 lines
4.4 KiB
TypeScript
|
|
import { afterAll, describe, expect, it } from 'vitest'
|
||
|
|
import { prisma, createCaller } from '../setup'
|
||
|
|
import {
|
||
|
|
createTestProgram,
|
||
|
|
createTestProject,
|
||
|
|
cleanupTestData,
|
||
|
|
uid,
|
||
|
|
} from '../helpers'
|
||
|
|
import { mentorRouter } from '../../src/server/routers/mentor'
|
||
|
|
import { applicantRouter } from '../../src/server/routers/applicant'
|
||
|
|
import type { UserRole } from '@prisma/client'
|
||
|
|
|
||
|
|
async function createUserWithRoles(primaryRole: UserRole, rolesArray: UserRole[]) {
|
||
|
|
const id = uid('user')
|
||
|
|
return prisma.user.create({
|
||
|
|
data: {
|
||
|
|
id,
|
||
|
|
email: `${id}@test.local`,
|
||
|
|
name: `Test ${primaryRole}`,
|
||
|
|
role: primaryRole,
|
||
|
|
roles: rolesArray,
|
||
|
|
status: 'ACTIVE',
|
||
|
|
},
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
describe('mentor.getRecentMessages', () => {
|
||
|
|
const programIds: string[] = []
|
||
|
|
const userIds: string[] = []
|
||
|
|
|
||
|
|
afterAll(async () => {
|
||
|
|
for (const programId of programIds) {
|
||
|
|
await prisma.mentorAssignment.deleteMany({ where: { project: { programId } } })
|
||
|
|
await cleanupTestData(programId, [])
|
||
|
|
}
|
||
|
|
if (userIds.length > 0) {
|
||
|
|
await prisma.user.deleteMany({ where: { id: { in: userIds } } })
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('returns recent unread messages from team across mentor assignments', async () => {
|
||
|
|
const program = await createTestProgram({ name: `recent-msgs-${uid()}` })
|
||
|
|
programIds.push(program.id)
|
||
|
|
const mentor = await createUserWithRoles('MENTOR', ['MENTOR'])
|
||
|
|
const applicant = await createUserWithRoles('APPLICANT', ['APPLICANT'])
|
||
|
|
userIds.push(mentor.id, applicant.id)
|
||
|
|
const project = await createTestProject(program.id)
|
||
|
|
const ma = await prisma.mentorAssignment.create({
|
||
|
|
data: {
|
||
|
|
projectId: project.id,
|
||
|
|
mentorId: mentor.id,
|
||
|
|
method: 'MANUAL',
|
||
|
|
workspaceEnabled: true,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
await prisma.mentorMessage.create({
|
||
|
|
data: {
|
||
|
|
projectId: project.id,
|
||
|
|
senderId: applicant.id,
|
||
|
|
message: 'Question 1',
|
||
|
|
workspaceId: ma.id,
|
||
|
|
isRead: false,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
await prisma.mentorMessage.create({
|
||
|
|
data: {
|
||
|
|
projectId: project.id,
|
||
|
|
senderId: applicant.id,
|
||
|
|
message: 'Question 2',
|
||
|
|
workspaceId: ma.id,
|
||
|
|
isRead: false,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
await prisma.mentorMessage.create({
|
||
|
|
data: {
|
||
|
|
projectId: project.id,
|
||
|
|
senderId: applicant.id,
|
||
|
|
message: 'old',
|
||
|
|
workspaceId: ma.id,
|
||
|
|
isRead: true,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
|
||
|
|
const caller = createCaller(mentorRouter, { id: mentor.id, email: mentor.email, role: 'MENTOR' })
|
||
|
|
const result = await caller.getRecentMessages({ limit: 5 })
|
||
|
|
|
||
|
|
expect(result.unread.length).toBe(2)
|
||
|
|
expect(result.unread[0].message).toContain('Question')
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
describe('applicant.getMentorConversationPreview', () => {
|
||
|
|
const programIds: string[] = []
|
||
|
|
const userIds: string[] = []
|
||
|
|
|
||
|
|
afterAll(async () => {
|
||
|
|
for (const programId of programIds) {
|
||
|
|
await prisma.mentorAssignment.deleteMany({ where: { project: { programId } } })
|
||
|
|
await cleanupTestData(programId, [])
|
||
|
|
}
|
||
|
|
if (userIds.length > 0) {
|
||
|
|
await prisma.user.deleteMany({ where: { id: { in: userIds } } })
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('returns last 3 messages + unread count for the project', async () => {
|
||
|
|
const program = await createTestProgram({ name: `conv-preview-${uid()}` })
|
||
|
|
programIds.push(program.id)
|
||
|
|
const mentor = await createUserWithRoles('MENTOR', ['MENTOR'])
|
||
|
|
const applicant = await createUserWithRoles('APPLICANT', ['APPLICANT'])
|
||
|
|
userIds.push(mentor.id, applicant.id)
|
||
|
|
const project = await createTestProject(program.id)
|
||
|
|
await prisma.teamMember.create({
|
||
|
|
data: { projectId: project.id, userId: applicant.id, role: 'LEAD' },
|
||
|
|
})
|
||
|
|
const ma = await prisma.mentorAssignment.create({
|
||
|
|
data: {
|
||
|
|
projectId: project.id,
|
||
|
|
mentorId: mentor.id,
|
||
|
|
method: 'MANUAL',
|
||
|
|
workspaceEnabled: true,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
for (let i = 0; i < 5; i++) {
|
||
|
|
await prisma.mentorMessage.create({
|
||
|
|
data: {
|
||
|
|
projectId: project.id,
|
||
|
|
senderId: mentor.id,
|
||
|
|
message: `mentor msg ${i}`,
|
||
|
|
workspaceId: ma.id,
|
||
|
|
isRead: i < 2,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
const caller = createCaller(applicantRouter, {
|
||
|
|
id: applicant.id,
|
||
|
|
email: applicant.email,
|
||
|
|
role: 'APPLICANT',
|
||
|
|
})
|
||
|
|
const result = await caller.getMentorConversationPreview({ projectId: project.id })
|
||
|
|
|
||
|
|
expect(result.messages.length).toBe(3)
|
||
|
|
expect(result.unreadCount).toBe(3)
|
||
|
|
expect(result.mentor?.id).toBe(mentor.id)
|
||
|
|
})
|
||
|
|
})
|