@@ -76,6 +76,37 @@ void notice_whenDeliveryAlreadyClaimed_skipsFcmSend() throws Throwable {
7676 verify (fcmSender , never ()).send (anyList ());
7777 }
7878
79+ @ Test
80+ @ DisplayName ("알림 수신 설정이 꺼진 사용자는 토큰 조회와 FCM 발송을 건너뛴다" )
81+ void notice_whenSendSettingIsDisabled_skipsTokenLookupAndFcmSend () throws Throwable {
82+ PaymentEvent event = paymentEvent ();
83+
84+ when (notificationService .canSend ("user-001" , NotificationType .PAYMENT )).thenReturn (false );
85+
86+ service .notice (event , "event-001" );
87+
88+ verify (notificationService ).canSend ("user-001" , NotificationType .PAYMENT );
89+ verify (tokenRepository , never ()).findAllTokensByUserId ("user-001" );
90+ verify (notificationDeliveryService , never ()).claimPaymentFcmDelivery (any (), any ());
91+ verify (fcmSender , never ()).send (anyList ());
92+ }
93+
94+ @ Test
95+ @ DisplayName ("FCM 토큰이 없는 사용자는 delivery claim과 FCM 발송을 건너뛴다" )
96+ void notice_whenTokenIsMissing_skipsDeliveryClaimAndFcmSend () throws Throwable {
97+ PaymentEvent event = paymentEvent ();
98+
99+ when (notificationService .canSend ("user-001" , NotificationType .PAYMENT )).thenReturn (true );
100+ when (tokenRepository .findAllTokensByUserId ("user-001" )).thenReturn (List .of ());
101+
102+ service .notice (event , "event-001" );
103+
104+ verify (notificationService ).canSend ("user-001" , NotificationType .PAYMENT );
105+ verify (tokenRepository ).findAllTokensByUserId ("user-001" );
106+ verify (notificationDeliveryService , never ()).claimPaymentFcmDelivery (any (), any ());
107+ verify (fcmSender , never ()).send (anyList ());
108+ }
109+
79110 @ Test
80111 @ DisplayName ("같은 eventId와 사용자 조합을 두 번 처리해도 FCM은 한 번만 발송한다" )
81112 void notice_whenSameEventAndUserIsConsumedTwice_sendsFcmOnce () throws Throwable {
0 commit comments