Skip to content
Snippets Groups Projects
modifyScheduleResponse.test.js 6.40 KiB
// test/scheduleService.test.js
const sequelize = require('../config/sequelize');
const { Schedule, User, Meeting, MeetingParticipant, FcmToken } = require('../models');
const ScheduleService = require('../services/scheduleService');
const MeetingService = require('../services/meetingService');
const ChatRooms = require('../schemas/chatRooms');

describe('Schedule Service and Meeting Integration Tests', () => {
    beforeAll(async () => {
        await sequelize.sync({ force: true });
    });

    beforeEach(async () => {
        await MeetingParticipant.destroy({ where: {} });
        await Meeting.destroy({ where: {} });
        await Schedule.destroy({ where: {} });
        await User.destroy({ where: {} });
        await FcmToken.destroy({ where: {} });

        // 더미 사용자 생성
        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' }
        ]);

        // ChatRooms Mock 설정
        jest.spyOn(ChatRooms.prototype, 'save').mockResolvedValue(undefined);
        jest.spyOn(ChatRooms, 'findOne').mockResolvedValue({
            participants: [],
            isOnline: new Map(),
            lastReadAt: new Map(),
            lastReadLogId: new Map(),
            save: jest.fn().mockResolvedValue(true)
        });
    });

    afterAll(async () => {
        await sequelize.close();
    });

    describe('Schedule Service Tests', () => {
        test('should create schedule with time_indices', async () => {
            const scheduleData = {
                userId: 1,
                title: 'Test Schedule',
                is_fixed: true,
                time_indices: [36, 37, 38]
            };

            const schedule = await ScheduleService.createSchedules(scheduleData);

            expect(schedule).toBeDefined();
            expect(schedule.title).toBe('Test Schedule');
            expect(schedule.time_indices).toEqual([36, 37, 38]);

            const dbSchedules = await Schedule.findAll({
                where: { user_id: 1, title: 'Test Schedule' }
            });
            expect(dbSchedules.length).toBe(3);
        });

        test('should update schedule with new time_indices', async () => {
            await ScheduleService.createSchedules({
                userId: 1,
                title: 'Original Schedule',
                is_fixed: true,
                time_indices: [36, 37, 38]
            });
            const updateData = {
                originalTitle: 'Original Schedule',
                title: 'Updated Schedule',
                is_fixed: true,
                time_indices: [36, 37, 38, 39]
            };

            const updatedSchedule = await ScheduleService.updateSchedules(1, updateData);

            expect(updatedSchedule.title).toBe('Updated Schedule');
            expect(updatedSchedule.time_indices).toEqual([36, 37, 38, 39]);
        });

        test('should delete schedule by title', async () => {
            await ScheduleService.createSchedules({
                userId: 1,
                title: 'Schedule to Delete',
                is_fixed: true,
                time_indices: [40, 41, 42]
            });

            const result = await ScheduleService.deleteSchedules(1, 'Schedule to Delete');
            expect(result.deletedCount).toBe(3);

            const remainingSchedules = await Schedule.findAll({
                where: { user_id: 1, title: 'Schedule to Delete' }
            });
            expect(remainingSchedules.length).toBe(0);
        });
    });

    describe('Meeting Integration Tests', () => {
        beforeEach(() => {
            jest.spyOn(User, 'findOne').mockResolvedValue({
                id: 1,
                name: 'Alice',
                email: 'alice@example.com',
                fcmTokenList: []
            });
        });

        test('should create meeting with correct schedules', async () => {
            const meetingData = {
                title: 'Test Meeting',
                time_idx_start: 50,
                time_idx_end: 52,
                created_by: 1,
                type: 'OPEN',
                max_num: 5
            };

            const meeting = await MeetingService.createMeeting(meetingData);

            const creatorSchedules = await Schedule.findAll({
                where: {
                    user_id: 1,
                    title: `번개 모임: ${meetingData.title}`
                }
            });

            expect(creatorSchedules.length).toBe(3);
            expect(creatorSchedules.map(s => s.time_idx).sort()).toEqual([50, 51, 52]);
        });

        test('should create correct schedules when joining meeting', async () => {
            const meetingData = {
                title: 'Join Test Meeting',
                time_idx_start: 60,
                time_idx_end: 62,
                created_by: 1,
                type: 'OPEN',
                max_num: 5,
                time_idx_deadline: 59 
            };

            const meeting = await MeetingService.createMeeting(meetingData);
            jest.spyOn(MeetingService, 'getCurrentTimeIdx').mockReturnValue(58);

            await MeetingService.joinMeeting(meeting.meeting_id, 2);

            const participantSchedules = await Schedule.findAll({
                where: {
                    user_id: 2,
                    title: `번개 모임: ${meetingData.title}`
                }
            });

            expect(participantSchedules.length).toBe(3);
            expect(participantSchedules.map(s => s.time_idx).sort()).toEqual([60, 61, 62]);
        });

        test('should handle schedule conflicts correctly', async () => {
            await ScheduleService.createSchedules({
                userId: 2,
                title: 'Existing Schedule',
                is_fixed: true,
                time_indices: [70, 71]
            });

            const meetingData = {
                title: 'Conflict Test Meeting',
                time_idx_start: 70,
                time_idx_end: 72,
                created_by: 1,
                type: 'OPEN',
                max_num: 5,
                time_idx_deadline: 69 
            };

            const meeting = await MeetingService.createMeeting(meetingData);

            await expect(
                MeetingService.joinMeeting(meeting.meeting_id, 2)
            ).rejects.toThrow('스케줄이 겹칩니다');
        });
    });
});