Skip to content
Snippets Groups Projects
Commit 00225eaa authored by 조대희's avatar 조대희
Browse files

test, refactor: 미팅 목록/상세 정보 조회 테스트 코드 (#19)

parent 3d4eadc9
No related branches found
No related tags found
2 merge requests!31Develop,!26[#19] 통합 테스트 제작 및 서비스 로직 추가/수정
......@@ -52,151 +52,146 @@ afterAll(async () => {
await sequelize.close();
});
describe('MeetingService - getMeetings', () => {
describe('MeetingService - 전체 미팅 조회 테스트', () => {
beforeEach(async () => {
await MeetingParticipant.destroy({ where: {} });
await Meeting.destroy({ where: {} });
await Schedule.destroy({ where: {} });
await User.destroy({ where: {} });
// Create dummy users
// 더미 사용자 생성
await User.bulkCreate([
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' },
{ id: 3, name: 'Charlie', email: 'charlie@example.com' },
{ id: 3, name: 'Charlie', email: 'charlie@example.com' }
]);
});
test('should retrieve meetings where the user is a participant', async () => {
const meetingData = {
title: 'Meeting with Alice',
description: 'Discuss project.',
time_idx_start: 10,
time_idx_end: 20,
location: 'Room A',
time_idx_deadline: 8,
type: 'OPEN',
created_by: 1,
};
const createdMeeting = await MeetingService.createMeeting(meetingData);
await MeetingParticipant.create({
meeting_id: createdMeeting.meeting_id,
user_id: 2,
// 스케줄 충돌 체크 Mock 설정
jest.spyOn(ScheduleService, 'checkScheduleOverlapByTime')
.mockImplementation(async (userId, start, end) => {
// 36-38 시간대 충돌
if (start <= 38 && end >= 36) return true;
// 51 시간대 충돌 (Bob의 개인 일정)
if (userId === 2 && start <= 51 && end >= 51) return true;
return false;
});
});
const meetings = await MeetingService.getMeetings(2); // Bob's user ID
test('모든 미팅 목록 조회 및 스케줄 충돌 확인', async () => {
// 1. Alice의 스케줄 등록
await ScheduleService.createSchedules({
userId: 1,
title: '기존 일정',
is_fixed: true,
events: [
{ time_idx: 36 },
{ time_idx: 37 },
{ time_idx: 38 }
]
});
expect(meetings).toBeDefined();
expect(Array.isArray(meetings)).toBe(true);
expect(meetings.length).toBe(1);
// 2. getCurrentTimeIdx Mock 설정
jest.spyOn(MeetingService, 'getCurrentTimeIdx')
.mockReturnValue(30);
const [meeting] = meetings;
expect(meeting.title).toBe('Meeting with Alice');
expect(meeting.creatorName).toBe('Alice');
expect(meeting.isParticipant).toBe(true);
});
const meetingData1 = {
title: '아침 미팅',
time_idx_start: 36,
time_idx_end: 38,
created_by: 2,
type: 'OPEN',
time_idx_deadline: 35,
location: 'Room A'
};
test('should retrieve meetings where the user is the creator', async () => {
const meetingData = {
title: 'Alice-created Meeting',
description: 'Team discussion.',
time_idx_start: 15,
time_idx_end: 25,
location: 'Room B',
time_idx_deadline: 12,
const meetingData2 = {
title: '점심 미팅',
time_idx_start: 44,
time_idx_end: 46,
created_by: 3,
type: 'OPEN',
created_by: 1,
time_idx_deadline: 43,
location: 'Room B'
};
await MeetingService.createMeeting(meetingData);
await MeetingService.createMeeting(meetingData1);
await MeetingService.createMeeting(meetingData2);
const meetings = await MeetingService.getMeetings(1);
const meetings = await MeetingService.getMeetings(1); // Alice's user ID
expect(meetings.length).toBe(2);
expect(meetings).toBeDefined();
expect(Array.isArray(meetings)).toBe(true);
expect(meetings.length).toBe(1);
const morningMeeting = meetings.find(m => m.title === '아침 미팅');
expect(morningMeeting.isScheduleConflict).toBe(true);
expect(morningMeeting.creatorName).toBe('Bob');
expect(morningMeeting.isParticipant).toBe(false);
const [meeting] = meetings;
expect(meeting.title).toBe('Alice-created Meeting');
expect(meeting.creatorName).toBe('Alice');
expect(meeting.isParticipant).toBe(true);
const lunchMeeting = meetings.find(m => m.title === '점심 미팅');
expect(lunchMeeting.isScheduleConflict).toBe(false);
expect(lunchMeeting.creatorName).toBe('Charlie');
expect(lunchMeeting.isParticipant).toBe(false);
});
test('should not include meetings where the user is neither a participant nor the creator', async () => {
const meetingData = {
title: 'Meeting with Bob',
description: 'General discussion.',
time_idx_start: 30,
time_idx_end: 40,
location: 'Room C',
time_idx_deadline: 28,
type: 'OPEN',
test('미팅 상세 정보 조회 및 충돌 확인', async () => {
jest.spyOn(MeetingService, 'getCurrentTimeIdx')
.mockReturnValue(35);
jest.spyOn(ScheduleService, 'checkScheduleOverlapByTime')
.mockImplementation(async (userId, start, end) => {
return start === 40 && end === 42 && userId === 1;
});
const meeting = await MeetingService.createMeeting({
title: '팀 미팅',
time_idx_start: 40,
time_idx_end: 42,
created_by: 2,
};
type: 'OPEN',
time_idx_deadline: 39,
location: 'Room A'
});
await MeetingService.createMeeting(meetingData);
await MeetingService.joinMeeting(meeting.meeting_id, 3);
const meetings = await MeetingService.getMeetings(1); // Alice's user ID
const meetingDetail = await MeetingService.getMeetingDetail(meeting.meeting_id, 1);
expect(meetings).toBeDefined();
expect(Array.isArray(meetings)).toBe(true);
expect(meetings.length).toBe(0); // Alice is not a participant or the creator
expect(meetingDetail.title).toBe('팀 미팅');
expect(meetingDetail.isScheduleConflict).toBe(true);
expect(meetingDetail.creatorName).toBe('Bob');
});
test('should retrieve multiple meetings correctly', async () => {
const meetingData1 = {
title: 'Meeting 1',
description: 'First meeting.',
test('여러 사용자 관점에서의 미팅 조회', async () => {
const meeting = await MeetingService.createMeeting({
title: '공통 미팅',
time_idx_start: 50,
time_idx_end: 60,
location: 'Room D',
time_idx_deadline: 48,
type: 'OPEN',
time_idx_end: 52,
created_by: 1,
};
const meetingData2 = {
title: 'Meeting 2',
description: 'Second meeting.',
time_idx_start: 70,
time_idx_end: 80,
location: 'Room E',
time_idx_deadline: 68,
type: 'OPEN',
created_by: 2,
};
await MeetingService.createMeeting(meetingData1);
const meeting2 = await MeetingService.createMeeting(meetingData2);
await MeetingParticipant.create({
meeting_id: meeting2.meeting_id,
user_id: 1,
location: 'Room A',
time_idx_deadline: 49
});
const meetings = await MeetingService.getMeetings(1); // Alice's user ID
await ScheduleService.createSchedules({
userId: 2,
title: '개인 일정',
is_fixed: true,
events: [{ time_idx: 51 }]
});
expect(meetings).toBeDefined();
expect(Array.isArray(meetings)).toBe(true);
expect(meetings.length).toBe(2); // Alice is either the creator or a participant in two meetings
const aliceMeetings = await MeetingService.getMeetings(1);
const bobMeetings = await MeetingService.getMeetings(2);
const charlieMeetings = await MeetingService.getMeetings(3);
const meetingTitles = meetings.map((m) => m.title);
expect(meetingTitles).toContain('Meeting 1');
expect(meetingTitles).toContain('Meeting 2');
});
expect(aliceMeetings[0].isScheduleConflict).toBe(false);
expect(bobMeetings[0].isScheduleConflict).toBe(true);
expect(charlieMeetings[0].isScheduleConflict).toBe(false);
test('should return an empty array if the user has no meetings', async () => {
const meetings = await MeetingService.getMeetings(3);
expect(meetings).toBeDefined();
expect(Array.isArray(meetings)).toBe(true);
expect(meetings.length).toBe(0);
expect(aliceMeetings[0].isParticipant).toBe(true);
expect(bobMeetings[0].isParticipant).toBe(false);
expect(charlieMeetings[0].isParticipant).toBe(false);
});
});
describe('MeetingService - Integration: createMeeting, joinMeeting, getMeetings', () => {
beforeEach(async () => {
await MeetingParticipant.destroy({ where: {} });
......@@ -436,62 +431,51 @@ describe('MeetingService2', () => {
// 1단계: 겹치지 않는 시간대의 모임 생성
const meetingData1 = {
title: 'Morning Meeting',
description: 'Morning planning meeting.',
time_idx_start: 10,
time_idx_end: 20,
location: 'Room A',
time_idx_deadline: 8,
type: 'OPEN',
created_by: 1, // Alice가 모임 생성
created_by: 1
};
const meetingData2 = {
title: 'Lunch Meeting',
description: 'Lunch and discussion.',
time_idx_start: 30,
time_idx_end: 40,
location: 'Room B',
time_idx_deadline: 28,
type: 'OPEN',
created_by: 2, // Bob이 모임 생성
created_by: 2
};
const meeting1 = await MeetingService.createMeeting(meetingData1);
const meeting2 = await MeetingService.createMeeting(meetingData2);
// 2단계: Charlie가 두 모임에 참여
jest.spyOn(MeetingService, 'getCurrentTimeIdx').mockReturnValue(5); // 마감 시간을 초과하지 않도록 설정
await MeetingService.joinMeeting(meeting1.meeting_id, 3); // Charlie가 Morning Meeting 참여
await MeetingService.joinMeeting(meeting2.meeting_id, 3); // Charlie가 Lunch Meeting 참여
jest.spyOn(MeetingService, 'getCurrentTimeIdx').mockReturnValue(5);
await MeetingService.joinMeeting(meeting1.meeting_id, 3);
await MeetingService.joinMeeting(meeting2.meeting_id, 3);
// 3단계: Alice의 모임 조회
const aliceMeetings = await MeetingService.getMeetings(1); // Alice의 사용자 ID
expect(aliceMeetings.length).toBe(1); // Alice는 하나의 모임 생성
expect(aliceMeetings[0].title).toBe('Morning Meeting');
expect(aliceMeetings[0].isParticipant).toBe(true);
// 4단계: Bob의 모임 조회
const bobMeetings = await MeetingService.getMeetings(2); // Bob의 사용자 ID
expect(bobMeetings.length).toBe(1); // Bob은 하나의 모임 생성
expect(bobMeetings[0].title).toBe('Lunch Meeting');
expect(bobMeetings[0].isParticipant).toBe(true);
// 3단계: 각 사용자의 모임 조회
const aliceMeetings = await MeetingService.getMeetings(1);
const bobMeetings = await MeetingService.getMeetings(2);
const charlieMeetings = await MeetingService.getMeetings(3);
// 5단계: Charlie의 모임 조회
const charlieMeetings = await MeetingService.getMeetings(3); // Charlie의 사용자 ID
expect(charlieMeetings.length).toBe(2); // Charlie는 두 모임에 참여
const meetingTitles = charlieMeetings.map(meeting => meeting.title);
expect(meetingTitles).toContain('Morning Meeting');
expect(meetingTitles).toContain('Lunch Meeting');
// 모든 미팅이 조회되어야 함
expect(aliceMeetings.length).toBe(2);
expect(bobMeetings.length).toBe(2);
expect(charlieMeetings.length).toBe(2);
// 검증: 각 사용자의 스케줄을 확인하여 충돌이 없는지 확인
const aliceSchedules = await Schedule.findAll({ where: { user_id: 1 } });
expect(aliceSchedules.length).toBe(11); // Morning Meeting: 10-20
// 여부 확인
const aliceMorningMeeting = aliceMeetings.find(m => m.title === 'Morning Meeting');
expect(aliceMorningMeeting.isParticipant).toBe(true);
const bobSchedules = await Schedule.findAll({ where: { user_id: 2 } });
expect(bobSchedules.length).toBe(11); // Lunch Meeting: 30-40
const bobLunchMeeting = bobMeetings.find(m => m.title === 'Lunch Meeting');
expect(bobLunchMeeting.isParticipant).toBe(true);
const charlieSchedules = await Schedule.findAll({ where: { user_id: 3 } });
expect(charlieSchedules.length).toBe(22); // 두 모임, 각 모임마다 11개의 스케줄 (10~20, 30~40)
// Charlie는 두 미팅 모두 참가
expect(charlieMeetings.every(m => m.isParticipant)).toBe(true);
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment