Create FcmClient class to make integration implementation closed

This commit is contained in:
Artyom 2022-08-12 15:13:48 +03:00
parent 37fb9443ea
commit ad61be705b
3 changed files with 91 additions and 25 deletions

View File

@ -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 <a href="https://firebase.google.com/docs/cloud-messaging">FCM documentation</a>
*/
@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)
}
}
}

View File

@ -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 <a href="https://firebase.google.com/docs/cloud-messaging">FCM documentation</a>
*/
@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)
}
}

View File

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