|
|
|
@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.alarm.Alarm; |
|
|
|
import org.thingsboard.server.common.data.alarm.AlarmComment; |
|
|
|
import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
|
|
|
import org.thingsboard.server.common.data.audit.ActionType; |
|
|
|
import org.thingsboard.server.common.data.id.AlarmId; |
|
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
|
import org.thingsboard.server.common.data.id.NotificationRequestId; |
|
|
|
import org.thingsboard.server.common.data.id.NotificationRuleId; |
|
|
|
@ -52,6 +53,7 @@ import org.thingsboard.server.common.data.notification.NotificationRequestPrevie |
|
|
|
import org.thingsboard.server.common.data.notification.NotificationRequestStats; |
|
|
|
import org.thingsboard.server.common.data.notification.NotificationRequestStatus; |
|
|
|
import org.thingsboard.server.common.data.notification.NotificationType; |
|
|
|
import org.thingsboard.server.common.data.notification.info.AlarmCommentNotificationInfo; |
|
|
|
import org.thingsboard.server.common.data.notification.info.EntityActionNotificationInfo; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmCommentNotificationRuleTriggerConfig; |
|
|
|
import org.thingsboard.server.common.data.notification.settings.MobileAppNotificationDeliveryMethodConfig; |
|
|
|
@ -81,7 +83,6 @@ import org.thingsboard.server.common.data.notification.template.WebDeliveryMetho |
|
|
|
import org.thingsboard.server.common.data.page.PageLink; |
|
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
|
import org.thingsboard.server.dao.notification.DefaultNotifications; |
|
|
|
import org.thingsboard.server.dao.notification.NotificationDao; |
|
|
|
import org.thingsboard.server.dao.service.DaoSqlTest; |
|
|
|
import org.thingsboard.server.service.notification.channels.MicrosoftTeamsNotificationChannel; |
|
|
|
import org.thingsboard.server.service.ws.notification.cmd.UnreadNotificationsUpdate; |
|
|
|
@ -116,17 +117,25 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
@Autowired |
|
|
|
private NotificationCenter notificationCenter; |
|
|
|
@Autowired |
|
|
|
private NotificationDao notificationDao; |
|
|
|
@Autowired |
|
|
|
private MicrosoftTeamsNotificationChannel microsoftTeamsNotificationChannel; |
|
|
|
@MockBean |
|
|
|
private FirebaseService firebaseService; |
|
|
|
|
|
|
|
private static final String TEST_MOBILE_TOKEN = "tenantFcmToken"; |
|
|
|
|
|
|
|
@Before |
|
|
|
public void beforeEach() throws Exception { |
|
|
|
loginCustomerUser(); |
|
|
|
wsClient = getWsClient(); |
|
|
|
|
|
|
|
loginSysAdmin(); |
|
|
|
MobileAppNotificationDeliveryMethodConfig config = new MobileAppNotificationDeliveryMethodConfig(); |
|
|
|
config.setFirebaseServiceAccountCredentials("testCredentials"); |
|
|
|
saveNotificationSettings(config); |
|
|
|
|
|
|
|
loginTenantAdmin(); |
|
|
|
mobileToken = TEST_MOBILE_TOKEN; |
|
|
|
doPost("/api/user/mobile/session", new MobileSessionInfo()).andExpect(status().isOk()); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -242,7 +251,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
int notificationsCount = 20; |
|
|
|
wsClient.registerWaitForUpdate(notificationsCount); |
|
|
|
for (int i = 1; i <= notificationsCount; i++) { |
|
|
|
submitNotificationRequest(target.getId(), "Test " + i, NotificationDeliveryMethod.WEB); |
|
|
|
submitNotificationRequest(target.getId(), "Test " + i, NotificationDeliveryMethod.WEB, NotificationDeliveryMethod.MOBILE_APP); |
|
|
|
} |
|
|
|
wsClient.waitForUpdate(true); |
|
|
|
assertThat(wsClient.getLastDataUpdate().getTotalUnreadCount()).isEqualTo(notificationsCount); |
|
|
|
@ -306,7 +315,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
NotificationTarget target = createNotificationTarget(savedDifferentTenantUser.getId()); |
|
|
|
int notificationsCount = 20; |
|
|
|
for (int i = 0; i < notificationsCount; i++) { |
|
|
|
NotificationRequest request = submitNotificationRequest(target.getId(), "Test " + i, NotificationDeliveryMethod.WEB); |
|
|
|
NotificationRequest request = submitNotificationRequest(target.getId(), "Test " + i, NotificationDeliveryMethod.WEB, NotificationDeliveryMethod.MOBILE_APP); |
|
|
|
awaitNotificationRequest(request.getId()); |
|
|
|
} |
|
|
|
List<NotificationRequest> requests = notificationRequestService.findNotificationRequestsByTenantIdAndOriginatorType(tenantId, EntityType.USER, new PageLink(100)).getData(); |
|
|
|
@ -500,7 +509,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
@Test |
|
|
|
public void testNotificationRequestInfo() throws Exception { |
|
|
|
NotificationDeliveryMethod[] deliveryMethods = new NotificationDeliveryMethod[]{ |
|
|
|
NotificationDeliveryMethod.WEB |
|
|
|
NotificationDeliveryMethod.WEB, NotificationDeliveryMethod.MOBILE_APP |
|
|
|
}; |
|
|
|
NotificationTemplate template = createNotificationTemplate(NotificationType.GENERAL, "Test subject", "Test text", deliveryMethods); |
|
|
|
NotificationTarget target = createNotificationTarget(tenantAdminUserId); |
|
|
|
@ -525,7 +534,6 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
await().atMost(2, TimeUnit.SECONDS) |
|
|
|
.until(() -> findNotificationRequest(notificationRequest.getId()).isSent()); |
|
|
|
NotificationRequestStats stats = getStats(notificationRequest.getId()); |
|
|
|
|
|
|
|
assertThat(stats.getSent().get(NotificationDeliveryMethod.WEB)).hasValue(1); |
|
|
|
} |
|
|
|
|
|
|
|
@ -727,17 +735,12 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testMobileAppNotifications() throws Exception { |
|
|
|
loginSysAdmin(); |
|
|
|
MobileAppNotificationDeliveryMethodConfig config = new MobileAppNotificationDeliveryMethodConfig(); |
|
|
|
config.setFirebaseServiceAccountCredentials("testCredentials"); |
|
|
|
saveNotificationSettings(config); |
|
|
|
|
|
|
|
loginCustomerUser(); |
|
|
|
mobileToken = "customerFcmToken"; |
|
|
|
doPost("/api/user/mobile/session", new MobileSessionInfo()).andExpect(status().isOk()); |
|
|
|
|
|
|
|
loginTenantAdmin(); |
|
|
|
mobileToken = "tenantFcmToken1"; |
|
|
|
mobileToken = TEST_MOBILE_TOKEN; |
|
|
|
doPost("/api/user/mobile/session", new MobileSessionInfo()).andExpect(status().isOk()); |
|
|
|
mobileToken = "tenantFcmToken2"; |
|
|
|
doPost("/api/user/mobile/session", new MobileSessionInfo()).andExpect(status().isOk()); |
|
|
|
@ -746,7 +749,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
|
|
|
|
loginTenantAdmin(); |
|
|
|
NotificationTarget target = createNotificationTarget(new AllUsersFilter()); |
|
|
|
NotificationTemplate template = createNotificationTemplate(NotificationType.GENERAL, "Title", "Message", NotificationDeliveryMethod.MOBILE_APP); |
|
|
|
NotificationTemplate template = createNotificationTemplate(NotificationType.GENERAL, "Title", "Message", NotificationDeliveryMethod.MOBILE_APP, NotificationDeliveryMethod.WEB); |
|
|
|
((MobileAppDeliveryMethodNotificationTemplate) template.getConfiguration().getDeliveryMethodsTemplates().get(NotificationDeliveryMethod.MOBILE_APP)) |
|
|
|
.setAdditionalConfig(JacksonUtil.newObjectNode().set("test", JacksonUtil.newObjectNode().put("test", "test"))); |
|
|
|
saveNotificationTemplate(template); |
|
|
|
@ -758,11 +761,19 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
.contains("doesn't use the mobile app"); |
|
|
|
|
|
|
|
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), |
|
|
|
eq("tenantFcmToken1"), eq("Title"), eq("Message"), argThat(data -> "test".equals(data.get("test.test")))); |
|
|
|
eq(TEST_MOBILE_TOKEN), eq("Title"), eq("Message"), argThat(data -> "test".equals(data.get("test.test"))), eq(1)); |
|
|
|
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), |
|
|
|
eq("tenantFcmToken2"), eq("Title"), eq("Message"), argThat(data -> "test".equals(data.get("test.test")))); |
|
|
|
eq("tenantFcmToken2"), eq("Title"), eq("Message"), argThat(data -> "test".equals(data.get("test.test"))), eq(1)); |
|
|
|
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), |
|
|
|
eq("customerFcmToken"), eq("Title"), eq("Message"), argThat(data -> "test".equals(data.get("test.test")))); |
|
|
|
eq("customerFcmToken"), eq("Title"), eq("Message"), argThat(data -> "test".equals(data.get("test.test"))), eq(1)); |
|
|
|
assertThat(getMyNotifications(NotificationDeliveryMethod.MOBILE_APP, true, 10)).singleElement().satisfies(notification -> { |
|
|
|
assertThat(notification.getDeliveryMethod()).isEqualTo(NotificationDeliveryMethod.MOBILE_APP); |
|
|
|
assertThat(notification.getText()).isEqualTo("Message"); |
|
|
|
assertThat(notification.getSubject()).isEqualTo("Title"); |
|
|
|
}); |
|
|
|
assertThat(getMyNotifications(true, 10)).singleElement().satisfies(notification -> { |
|
|
|
assertThat(notification.getDeliveryMethod()).isEqualTo(NotificationDeliveryMethod.WEB); |
|
|
|
}); |
|
|
|
verifyNoMoreInteractions(firebaseService); |
|
|
|
clearInvocations(firebaseService); |
|
|
|
|
|
|
|
@ -770,26 +781,21 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
request = submitNotificationRequest(List.of(target.getId()), template.getId(), 0); |
|
|
|
awaitNotificationRequest(request.getId()); |
|
|
|
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), |
|
|
|
eq("tenantFcmToken1"), eq("Title"), eq("Message"), anyMap()); |
|
|
|
eq(TEST_MOBILE_TOKEN), eq("Title"), eq("Message"), anyMap(), eq(2)); |
|
|
|
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), |
|
|
|
eq("customerFcmToken"), eq("Title"), eq("Message"), anyMap()); |
|
|
|
eq("customerFcmToken"), eq("Title"), eq("Message"), anyMap(), eq(2)); |
|
|
|
verifyNoMoreInteractions(firebaseService); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testMobileAppNotifications_ruleBased() throws Exception { |
|
|
|
loginSysAdmin(); |
|
|
|
MobileAppNotificationDeliveryMethodConfig config = new MobileAppNotificationDeliveryMethodConfig(); |
|
|
|
config.setFirebaseServiceAccountCredentials("testCredentials"); |
|
|
|
saveNotificationSettings(config); |
|
|
|
|
|
|
|
loginTenantAdmin(); |
|
|
|
mobileToken = "tenantFcmToken"; |
|
|
|
mobileToken = TEST_MOBILE_TOKEN; |
|
|
|
doPost("/api/user/mobile/session", new MobileSessionInfo()).andExpect(status().isOk()); |
|
|
|
|
|
|
|
createNotificationRule(AlarmCommentNotificationRuleTriggerConfig.builder().onlyUserComments(true).build(), |
|
|
|
DefaultNotifications.alarmComment.getSubject(), DefaultNotifications.alarmComment.getText(), |
|
|
|
List.of(createNotificationTarget(tenantAdminUserId).getId()), NotificationDeliveryMethod.MOBILE_APP); |
|
|
|
List.of(createNotificationTarget(tenantAdminUserId).getId()), NotificationDeliveryMethod.MOBILE_APP, NotificationDeliveryMethod.WEB); |
|
|
|
|
|
|
|
Device device = createDevice("test", "test"); |
|
|
|
UUID alarmDashboardId = UUID.randomUUID(); |
|
|
|
@ -802,18 +808,21 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
.put("dashboardId", alarmDashboardId.toString())) |
|
|
|
.build(); |
|
|
|
alarm = doPost("/api/alarm", alarm, Alarm.class); |
|
|
|
AlarmId alarmId = alarm.getId(); |
|
|
|
|
|
|
|
AlarmComment comment = new AlarmComment(); |
|
|
|
comment.setComment(JacksonUtil.newObjectNode() |
|
|
|
.put("text", "text")); |
|
|
|
doPost("/api/alarm/" + alarm.getId() + "/comment", comment, AlarmComment.class); |
|
|
|
doPost("/api/alarm/" + alarmId + "/comment", comment, AlarmComment.class); |
|
|
|
|
|
|
|
String expectedSubject = "Comment on 'test' alarm"; |
|
|
|
String expectedBody = TENANT_ADMIN_EMAIL + " added comment: text"; |
|
|
|
ArgumentCaptor<Map<String, String>> msgCaptor = ArgumentCaptor.forClass(Map.class); |
|
|
|
await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> { |
|
|
|
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), |
|
|
|
eq("tenantFcmToken"), eq("Comment on 'test' alarm"), |
|
|
|
eq(TENANT_ADMIN_EMAIL + " added comment: text"), |
|
|
|
msgCaptor.capture()); |
|
|
|
eq(TEST_MOBILE_TOKEN), eq(expectedSubject), |
|
|
|
eq(expectedBody), |
|
|
|
msgCaptor.capture(), eq(1)); |
|
|
|
}); |
|
|
|
Map<String, String> firebaseMessageData = msgCaptor.getValue(); |
|
|
|
assertThat(firebaseMessageData.keySet()).doesNotContainNull().doesNotContain(""); |
|
|
|
@ -823,6 +832,14 @@ public class NotificationApiTest extends AbstractNotificationApiTest { |
|
|
|
assertThat(firebaseMessageData.get("onClick.enabled")).isEqualTo("true"); |
|
|
|
assertThat(firebaseMessageData.get("onClick.linkType")).isEqualTo("DASHBOARD"); |
|
|
|
assertThat(firebaseMessageData.get("onClick.dashboardId")).isEqualTo(alarmDashboardId.toString()); |
|
|
|
|
|
|
|
assertThat(getMyNotifications(NotificationDeliveryMethod.MOBILE_APP, true, 10)).singleElement().satisfies(notification -> { |
|
|
|
assertThat(notification.getDeliveryMethod()).isEqualTo(NotificationDeliveryMethod.MOBILE_APP); |
|
|
|
assertThat(notification.getSubject()).isEqualTo(expectedSubject); |
|
|
|
assertThat(notification.getText()).isEqualTo(expectedBody); |
|
|
|
assertThat(notification.getInfo()).asInstanceOf(type(AlarmCommentNotificationInfo.class)) |
|
|
|
.matches(info -> info.getAlarmId().equals(alarmId.getId()) && info.getDashboardId().getId().equals(alarmDashboardId)); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
|