You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.4 KiB
113 lines
4.4 KiB
package com.mydreamjob.notification;
|
|
|
|
import com.mydreamjob.common.exception.BusinessException;
|
|
import com.mydreamjob.common.exception.ErrorCode;
|
|
import com.mydreamjob.auth.UserRepository;
|
|
import com.mydreamjob.company.CompanyRepository;
|
|
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 org.springframework.data.domain.PageImpl;
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
|
import java.util.*;
|
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
import static org.mockito.Mockito.*;
|
|
|
|
@ExtendWith(MockitoExtension.class)
|
|
class NotificationServiceTest {
|
|
|
|
@Mock private NotificationRepository notificationRepository;
|
|
@Mock private PushProvider pushProvider;
|
|
@Mock private UserRepository userRepository;
|
|
@Mock private CompanyRepository companyRepository;
|
|
@InjectMocks private NotificationService notificationService;
|
|
|
|
private static final Long USER_A = 100L;
|
|
private static final Long USER_B = 200L;
|
|
private static final Long NOTIF_ID = 1L;
|
|
private Notification notif;
|
|
|
|
@BeforeEach
|
|
void setUp() {
|
|
notif = Notification.builder().id(NOTIF_ID).userId(USER_A)
|
|
.type("APPLICATION").title("新投递").content("有新的投递").read(false).build();
|
|
}
|
|
|
|
@Test void create_shouldSaveAndPush() {
|
|
when(notificationRepository.save(any())).thenAnswer(inv -> inv.getArgument(0));
|
|
when(pushProvider.send(eq(USER_A), any(), any())).thenReturn(true);
|
|
|
|
Notification n = notificationService.create(USER_A, "APPLICATION", "新投递", "内容");
|
|
|
|
assertEquals("新投递", n.getTitle());
|
|
verify(pushProvider, times(1)).send(eq(USER_A), any(), any());
|
|
}
|
|
|
|
@Test void list_shouldReturnPaged() {
|
|
when(notificationRepository.findByUserIdOrderByCreatedAtDesc(eq(USER_A), any()))
|
|
.thenReturn(new PageImpl<>(List.of(notif)));
|
|
|
|
var r = notificationService.list(USER_A, 0, 20);
|
|
assertEquals(1, r.getTotalElements());
|
|
}
|
|
|
|
@Test void list_invalidSize_shouldReturn400() {
|
|
assertThrows(BusinessException.class, () -> notificationService.list(USER_A, 0, 0));
|
|
assertThrows(BusinessException.class, () -> notificationService.list(USER_A, -1, 20));
|
|
assertThrows(BusinessException.class, () -> notificationService.list(USER_A, 0, 51));
|
|
}
|
|
|
|
@Test void markRead_shouldSucceed() {
|
|
when(notificationRepository.findById(NOTIF_ID)).thenReturn(Optional.of(notif));
|
|
when(notificationRepository.save(any())).thenAnswer(inv -> inv.getArgument(0));
|
|
|
|
notificationService.markRead(USER_A, NOTIF_ID);
|
|
assertTrue(notif.getRead());
|
|
}
|
|
|
|
@Test void markRead_alreadyRead_shouldBeIdempotent() {
|
|
notif.setRead(true);
|
|
when(notificationRepository.findById(NOTIF_ID)).thenReturn(Optional.of(notif));
|
|
|
|
notificationService.markRead(USER_A, NOTIF_ID);
|
|
verify(notificationRepository, never()).save(any());
|
|
}
|
|
|
|
@Test void markRead_otherUser_shouldReturn403() {
|
|
when(notificationRepository.findById(NOTIF_ID)).thenReturn(Optional.of(notif));
|
|
|
|
assertThrows(BusinessException.class, () -> notificationService.markRead(USER_B, NOTIF_ID));
|
|
}
|
|
|
|
@Test void markRead_notFound_shouldReturn404() {
|
|
when(notificationRepository.findById(999L)).thenReturn(Optional.empty());
|
|
|
|
BusinessException ex = assertThrows(BusinessException.class,
|
|
() -> notificationService.markRead(USER_A, 999L));
|
|
assertEquals(ErrorCode.NOTIFICATION_NOT_FOUND.getCode(), ex.getErrorCodeInt());
|
|
}
|
|
|
|
@Test void unreadCount_shouldReturnCount() {
|
|
when(notificationRepository.countUnreadByUserId(USER_A)).thenReturn(5L);
|
|
|
|
assertEquals(5L, notificationService.unreadCount(USER_A));
|
|
}
|
|
|
|
@Test void markAllRead_shouldMarkUnread() {
|
|
notif.setRead(false);
|
|
when(notificationRepository.findByUserIdOrderByCreatedAtDesc(eq(USER_A), any()))
|
|
.thenReturn(new PageImpl<>(List.of(notif)));
|
|
when(notificationRepository.save(any())).thenAnswer(inv -> inv.getArgument(0));
|
|
|
|
int marked = notificationService.markAllRead(USER_A);
|
|
assertEquals(1, marked);
|
|
assertTrue(notif.getRead());
|
|
}
|
|
}
|
|
|