package com.zeodao.reminder.service; import com.zeodao.reminder.config.TaskReminderConfig; import com.zeodao.reminder.util.HolidayUtil; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDate; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; /** * 任务提醒服务测试类 * * @author Zeodao * @version 2.0.0 */ @ExtendWith(MockitoExtension.class) class TaskReminderServiceTest { @Mock private WechatWebhookService wechatWebhookService; @Mock private HolidayUtil holidayUtil; @Mock private TaskReminderConfig taskReminderConfig; @InjectMocks private TaskReminderService taskReminderService; private TaskReminderConfig.Group testGroup; @BeforeEach void setUp() { // 创建测试群组配置 testGroup = new TaskReminderConfig.Group(); testGroup.setId("test-group"); testGroup.setName("测试群组"); testGroup.setEnabled(true); TaskReminderConfig.Webhook webhook = new TaskReminderConfig.Webhook(); webhook.setUrl("https://test.webhook.url"); testGroup.setWebhook(webhook); Map schedules = new HashMap<>(); TaskReminderConfig.Schedule morningSchedule = new TaskReminderConfig.Schedule(); morningSchedule.setTime("0 0 9 * * MON-FRI"); morningSchedule.setMessage("测试早上消息"); schedules.put("morning", morningSchedule); TaskReminderConfig.Schedule eveningSchedule = new TaskReminderConfig.Schedule(); eveningSchedule.setTime("0 30 17 * * MON-FRI"); eveningSchedule.setMessage("测试晚上消息"); schedules.put("evening", eveningSchedule); testGroup.setSchedules(schedules); } @Test void testSendReminderOnWorkday() { // 模拟工作日 when(holidayUtil.isWeekend(any(LocalDate.class))).thenReturn(false); when(holidayUtil.isHoliday(any(LocalDate.class))).thenReturn(false); when(taskReminderConfig.getGroupById("test-group")).thenReturn(testGroup); when(wechatWebhookService.createTaskReminderMessage(anyString(), anyString(), anyString())).thenReturn("测试消息"); when(wechatWebhookService.sendMarkdownMessage(anyString(), anyString())).thenReturn(true); // 执行测试 taskReminderService.sendReminder("test-group", "morning"); // 验证 verify(wechatWebhookService, times(1)).sendMarkdownMessage(eq("test-group"), anyString()); } @Test void testSendReminderOnWeekend() { // 模拟周末 when(holidayUtil.isWeekend(any(LocalDate.class))).thenReturn(true); // 执行测试 taskReminderService.sendReminder("test-group", "morning"); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); } @Test void testSendReminderOnHoliday() { // 模拟节假日(不是周末,但是节假日) when(holidayUtil.isWeekend(any(LocalDate.class))).thenReturn(false); when(holidayUtil.isHoliday(any(LocalDate.class))).thenReturn(true); // 执行测试 taskReminderService.sendReminder("test-group", "morning"); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); // 验证两个方法都被调用了 verify(holidayUtil, times(1)).isWeekend(any(LocalDate.class)); verify(holidayUtil, times(1)).isHoliday(any(LocalDate.class)); } @Test void testSendAllMorningReminders() { // 模拟工作日 when(holidayUtil.isWeekend(any(LocalDate.class))).thenReturn(false); when(holidayUtil.isHoliday(any(LocalDate.class))).thenReturn(false); when(taskReminderConfig.getEnabledGroups()).thenReturn(Arrays.asList(testGroup)); when(taskReminderConfig.getGroupById("test-group")).thenReturn(testGroup); when(wechatWebhookService.createTaskReminderMessage(anyString(), anyString(), anyString())).thenReturn("测试消息"); when(wechatWebhookService.sendMarkdownMessage(anyString(), anyString())).thenReturn(true); // 执行测试 taskReminderService.sendAllMorningReminders(); // 验证 verify(wechatWebhookService, times(1)).sendMarkdownMessage(eq("test-group"), anyString()); } @Test void testSendAllEveningReminders() { // 模拟工作日 when(holidayUtil.isWeekend(any(LocalDate.class))).thenReturn(false); when(holidayUtil.isHoliday(any(LocalDate.class))).thenReturn(false); when(taskReminderConfig.getEnabledGroups()).thenReturn(Arrays.asList(testGroup)); when(taskReminderConfig.getGroupById("test-group")).thenReturn(testGroup); when(wechatWebhookService.createTaskReminderMessage(anyString(), anyString(), anyString())).thenReturn("测试消息"); when(wechatWebhookService.sendMarkdownMessage(anyString(), anyString())).thenReturn(true); // 执行测试 taskReminderService.sendAllEveningReminders(); // 验证 verify(wechatWebhookService, times(1)).sendMarkdownMessage(eq("test-group"), anyString()); } @Test void testSendReminderWithInvalidGroup() { // 模拟群组不存在 when(taskReminderConfig.getGroupById("invalid-group")).thenReturn(null); // 执行测试 taskReminderService.sendReminder("invalid-group", "morning"); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); } @Test void testSendReminderWithDisabledGroup() { // 创建禁用的群组 testGroup.setEnabled(false); when(taskReminderConfig.getGroupById("test-group")).thenReturn(testGroup); // 执行测试 taskReminderService.sendReminder("test-group", "morning"); // 验证不发送消息 verify(wechatWebhookService, never()).sendMarkdownMessage(anyString(), anyString()); } }