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 + ) + } + +}