From ad61be705b29b17bfff4695c182b62f291d22ee4 Mon Sep 17 00:00:00 2001
From: Artyom <17145209+Korna@users.noreply.github.com>
Date: Fri, 12 Aug 2022 15:13:48 +0300
Subject: [PATCH] Create FcmClient class to make integration implementation
closed
---
.../message/provider/fcm/clients/FcmClient.kt | 38 ++++++++++++++
.../services/PushMessageProviderFcmService.kt | 28 ++---------
.../PushMessageProviderFcmServiceTest.kt | 50 +++++++++++++++++++
3 files changed, 91 insertions(+), 25 deletions(-)
create mode 100644 push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt
create mode 100644 push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt
diff --git a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt
new file mode 100644
index 0000000..605d892
--- /dev/null
+++ b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt
@@ -0,0 +1,38 @@
+package ru.touchin.push.message.provider.fcm.clients
+
+import com.google.firebase.messaging.FirebaseMessaging
+import com.google.firebase.messaging.FirebaseMessagingException
+import org.springframework.stereotype.Component
+import ru.touchin.push.message.provider.dto.request.PushTokenMessage
+import ru.touchin.push.message.provider.dto.result.SendPushResult
+import ru.touchin.push.message.provider.dto.result.SendPushTokenMessageResult
+import ru.touchin.push.message.provider.exceptions.InvalidPushTokenException
+import ru.touchin.push.message.provider.exceptions.PushMessageProviderException
+import ru.touchin.push.message.provider.fcm.converters.FirebaseMessagingExceptionConverter
+import ru.touchin.push.message.provider.fcm.converters.PushTokenMessageConverter
+
+/**
+ * Service that provides integration with FCM.
+ * @see FCM documentation
+ */
+@Component
+class FcmClient(
+ private val firebaseMessaging: FirebaseMessaging,
+ private val pushTokenMessageConverter: PushTokenMessageConverter,
+ private val firebaseMessagingExceptionConverter: FirebaseMessagingExceptionConverter
+) {
+
+ @Throws(PushMessageProviderException::class, InvalidPushTokenException::class)
+ fun sendPushTokenMessage(request: PushTokenMessage): SendPushResult {
+ val message = pushTokenMessageConverter(request)
+
+ return try {
+ val messageId = firebaseMessaging.send(message)
+
+ SendPushTokenMessageResult(messageId)
+ } catch (e: FirebaseMessagingException) {
+ throw firebaseMessagingExceptionConverter(e)
+ }
+ }
+
+}
diff --git a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt
index 3275813..10435fd 100644
--- a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt
+++ b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt
@@ -1,28 +1,18 @@
package ru.touchin.push.message.provider.fcm.services
-import com.google.firebase.messaging.FirebaseMessaging
-import com.google.firebase.messaging.FirebaseMessagingException
import org.springframework.stereotype.Service
import ru.touchin.push.message.provider.dto.request.PushTokenMessage
import ru.touchin.push.message.provider.dto.request.SendPushRequest
import ru.touchin.push.message.provider.dto.result.SendPushResult
-import ru.touchin.push.message.provider.dto.result.SendPushTokenMessageResult
import ru.touchin.push.message.provider.enums.PushMessageProviderType
import ru.touchin.push.message.provider.exceptions.InvalidPushTokenException
import ru.touchin.push.message.provider.exceptions.PushMessageProviderException
-import ru.touchin.push.message.provider.fcm.converters.FirebaseMessagingExceptionConverter
-import ru.touchin.push.message.provider.fcm.converters.PushTokenMessageConverter
+import ru.touchin.push.message.provider.fcm.clients.FcmClient
import ru.touchin.push.message.provider.services.PushMessageProviderService
-/**
- * Service that provides integration with FCM.
- * @see FCM documentation
- */
@Service
class PushMessageProviderFcmService(
- private val firebaseMessaging: FirebaseMessaging,
- private val pushTokenMessageConverter: PushTokenMessageConverter,
- private val firebaseMessagingExceptionConverter: FirebaseMessagingExceptionConverter
+ private val fcmClient: FcmClient
) : PushMessageProviderService {
override val type: PushMessageProviderType = PushMessageProviderType.FCM
@@ -30,19 +20,7 @@ class PushMessageProviderFcmService(
@Throws(PushMessageProviderException::class, InvalidPushTokenException::class)
override fun send(request: SendPushRequest): SendPushResult {
return when (request) {
- is PushTokenMessage -> sendPushTokenMessage(request)
- }
- }
-
- private fun sendPushTokenMessage(request: PushTokenMessage): SendPushResult {
- val message = pushTokenMessageConverter(request)
-
- return try {
- val messageId = firebaseMessaging.send(message)
-
- SendPushTokenMessageResult(messageId)
- } catch (e: FirebaseMessagingException) {
- throw firebaseMessagingExceptionConverter(e)
+ is PushTokenMessage -> fcmClient.sendPushTokenMessage(request)
}
}
diff --git a/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt b/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt
new file mode 100644
index 0000000..37452a1
--- /dev/null
+++ b/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt
@@ -0,0 +1,50 @@
+package ru.touchin.push.message.provider.fcm.services
+
+import org.junit.Assert
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+import org.mockito.Mockito
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.boot.test.mock.mockito.MockBean
+import ru.touchin.push.message.provider.dto.request.PushTokenMessage
+import ru.touchin.push.message.provider.dto.result.SendPushTokenMessageResult
+import ru.touchin.push.message.provider.fcm.clients.FcmClient
+import ru.touchin.push.message.provider.services.PushMessageProviderService
+
+@SpringBootTest
+class PushMessageProviderFcmServiceTest {
+
+ @MockBean
+ lateinit var fcmClient: FcmClient
+
+ @Autowired
+ lateinit var pushMessageProviderService: PushMessageProviderService
+
+ @Test
+ @DisplayName("Обработка запроса на отправку единичного сообщения происходит корректно")
+ fun send_basic() {
+ val request = PushTokenMessage(
+ token = "testToken",
+ notification = null,
+ data = emptyMap()
+ )
+
+ val expectedResult = SendPushTokenMessageResult("testMessageId")
+
+ Mockito.`when`(
+ fcmClient.sendPushTokenMessage(request)
+ ).thenReturn(
+ expectedResult
+ )
+
+ val realResult = pushMessageProviderService.send(request)
+
+ Assert.assertEquals(
+ "Обработка запроса на отправку единичного сообщения происходит некорректно",
+ expectedResult,
+ realResult
+ )
+ }
+
+}