|
@@ -0,0 +1,85 @@
|
|
|
|
|
+package com.ruoyi.app.push;
|
|
|
|
|
+
|
|
|
|
|
+import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
|
|
+import com.ruoyi.common.utils.MessageUtils;
|
|
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
|
|
+
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.assertFalse;
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
|
|
+import static org.mockito.Mockito.doThrow;
|
|
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
|
|
+import static org.mockito.Mockito.mockStatic;
|
|
|
|
|
+import static org.mockito.Mockito.never;
|
|
|
|
|
+import static org.mockito.Mockito.verify;
|
|
|
|
|
+
|
|
|
|
|
+class NativePushTestControllerTest {
|
|
|
|
|
+ private final FcmPushSender fcm = mock(FcmPushSender.class);
|
|
|
|
|
+ private final ApnsPushSender apns = mock(ApnsPushSender.class);
|
|
|
|
|
+ private final NativePushTestController controller = new NativePushTestController(fcm, apns);
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void androidRequestSendsDirectlyToFcmWithoutAccountLookup() {
|
|
|
|
|
+ try (var messages = mockStatic(MessageUtils.class)) {
|
|
|
|
|
+ messages.when(() -> MessageUtils.message("native.push.test.accepted")).thenReturn("accepted");
|
|
|
|
|
+ NativePushTestRequest request = request("rider", "android", "fcm-token");
|
|
|
|
|
+
|
|
|
|
|
+ AjaxResult result = controller.send(request);
|
|
|
|
|
+
|
|
|
|
|
+ assertEquals(200, result.get("code"));
|
|
|
|
|
+ verify(fcm).sendForTest(RecipientApp.RIDER, "fcm-token", "title", "content", "{}");
|
|
|
|
|
+ verify(apns, never()).sendForTestProduction(RecipientApp.RIDER, "fcm-token", "title", "content", "{}");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void iosRequestUsesProductionApns() {
|
|
|
|
|
+ try (var messages = mockStatic(MessageUtils.class)) {
|
|
|
|
|
+ messages.when(() -> MessageUtils.message("native.push.test.accepted")).thenReturn("accepted");
|
|
|
|
|
+ NativePushTestRequest request = request("user", "ios", "a".repeat(64));
|
|
|
|
|
+
|
|
|
|
|
+ AjaxResult result = controller.send(request);
|
|
|
|
|
+
|
|
|
|
|
+ assertEquals(200, result.get("code"));
|
|
|
|
|
+ verify(apns).sendForTestProduction(RecipientApp.USER, "a".repeat(64), "title", "content", "{}");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void providerFailureReturnsCategoryWithoutDeviceToken() {
|
|
|
|
|
+ try (var messages = mockStatic(MessageUtils.class)) {
|
|
|
|
|
+ messages.when(() -> MessageUtils.message("native.push.test.failed")).thenReturn("failed");
|
|
|
|
|
+ doThrow(new IllegalStateException("FCM_UNREGISTERED"))
|
|
|
|
|
+ .when(fcm).sendForTest(RecipientApp.USER, "secret-token", "title", "content", "{}");
|
|
|
|
|
+
|
|
|
|
|
+ AjaxResult result = controller.send(request("user", "android", "secret-token"));
|
|
|
|
|
+
|
|
|
|
|
+ assertEquals(500, result.get("code"));
|
|
|
|
|
+ assertTrue(result.get("msg").toString().contains("FCM_UNREGISTERED"));
|
|
|
|
|
+ assertFalse(result.toString().contains("secret-token"));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void unknownPlatformDoesNotSend() {
|
|
|
|
|
+ try (var messages = mockStatic(MessageUtils.class)) {
|
|
|
|
|
+ messages.when(() -> MessageUtils.message("native.push.test.invalid")).thenReturn("invalid");
|
|
|
|
|
+
|
|
|
|
|
+ AjaxResult result = controller.send(request("user", "other", "fcm-token"));
|
|
|
|
|
+
|
|
|
|
|
+ assertEquals(500, result.get("code"));
|
|
|
|
|
+ verify(fcm, never()).sendForTest(RecipientApp.USER, "fcm-token", "title", "content", "{}");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static NativePushTestRequest request(String appType, String platform, String token) {
|
|
|
|
|
+ NativePushTestRequest request = new NativePushTestRequest();
|
|
|
|
|
+ request.setAppType(appType);
|
|
|
|
|
+ request.setPlatform(platform);
|
|
|
|
|
+ request.setDeviceToken(token);
|
|
|
|
|
+ request.setTitle("title");
|
|
|
|
|
+ request.setContent("content");
|
|
|
|
|
+ request.setPayload("{}");
|
|
|
|
|
+ return request;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|