diff --git a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/configurations/DateConverter.kt b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/converters/DateConverter.kt similarity index 75% rename from push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/configurations/DateConverter.kt rename to push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/converters/DateConverter.kt index 4b8bb37..36ce38c 100644 --- a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/configurations/DateConverter.kt +++ b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/converters/DateConverter.kt @@ -1,4 +1,4 @@ -package ru.touchin.push.message.provider.fcm.configurations +package ru.touchin.push.message.provider.fcm.converters import org.springframework.beans.factory.annotation.Qualifier import org.springframework.boot.context.properties.ConfigurationPropertiesBinding @@ -14,8 +14,8 @@ class DateConverter( private val simpleDateFormat: SimpleDateFormat ) : Converter { - override fun convert(source: String?): Date? { - return source?.let(simpleDateFormat::parse) + override fun convert(source: String): Date { + return simpleDateFormat.parse(source) } } diff --git a/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/PushMessageProviderFcmTestApplication.kt b/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/PushMessageProviderFcmTestApplication.kt index 7c2f4e7..055a72d 100644 --- a/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/PushMessageProviderFcmTestApplication.kt +++ b/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/PushMessageProviderFcmTestApplication.kt @@ -4,16 +4,19 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect import com.fasterxml.jackson.annotation.PropertyAccessor import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature +import com.google.firebase.FirebaseApp import org.springframework.beans.factory.annotation.Qualifier import org.springframework.boot.SpringBootConfiguration import org.springframework.boot.test.context.TestConfiguration +import org.springframework.context.ApplicationListener import org.springframework.context.annotation.Bean +import org.springframework.context.event.ContextRefreshedEvent import java.text.SimpleDateFormat @TestConfiguration @SpringBootConfiguration @EnablePushMessageProviderFcm -class PushMessageProviderFcmTestApplication { +class PushMessageProviderFcmTestApplication : ApplicationListener { @Bean fun objectMapper( @@ -28,4 +31,12 @@ class PushMessageProviderFcmTestApplication { } } + override fun onApplicationEvent(event: ContextRefreshedEvent) { + clearSingletonsOutsideContainer() + } + + private fun clearSingletonsOutsideContainer() { + FirebaseApp.getApps().forEach(FirebaseApp::delete) + } + } diff --git a/push-message-provider-mock/build.gradle.kts b/push-message-provider-mock/build.gradle.kts new file mode 100644 index 0000000..e52c548 --- /dev/null +++ b/push-message-provider-mock/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("kotlin") + id("kotlin-spring") +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + implementation("org.springframework.boot:spring-boot-autoconfigure") + + implementation(project(":logger")) + implementation(project(":push-message-provider")) +} diff --git a/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/EnablePushMessageProviderMock.kt b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/EnablePushMessageProviderMock.kt new file mode 100644 index 0000000..ffdabf5 --- /dev/null +++ b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/EnablePushMessageProviderMock.kt @@ -0,0 +1,8 @@ +@file:Suppress("unused") +package ru.touchin.push.message.provider.mock + +import org.springframework.context.annotation.Import +import ru.touchin.push.message.provider.mock.configurations.PushMessageProviderMockConfiguration + +@Import(value = [PushMessageProviderMockConfiguration::class]) +annotation class EnablePushMessageProviderMock diff --git a/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/configurations/PushMessageProviderMockConfiguration.kt b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/configurations/PushMessageProviderMockConfiguration.kt new file mode 100644 index 0000000..284e8a0 --- /dev/null +++ b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/configurations/PushMessageProviderMockConfiguration.kt @@ -0,0 +1,8 @@ +package ru.touchin.push.message.provider.mock.configurations + +import org.springframework.boot.context.properties.ConfigurationPropertiesScan +import org.springframework.context.annotation.ComponentScan + +@ComponentScan("ru.touchin.push.message.provider.mock") +@ConfigurationPropertiesScan(basePackages = ["ru.touchin.push.message.provider.mock.properties"]) +class PushMessageProviderMockConfiguration diff --git a/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/factories/PushMessageProviderMockServiceFactoryImpl.kt b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/factories/PushMessageProviderMockServiceFactoryImpl.kt new file mode 100644 index 0000000..291f613 --- /dev/null +++ b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/factories/PushMessageProviderMockServiceFactoryImpl.kt @@ -0,0 +1,57 @@ +package ru.touchin.push.message.provider.mock.factories + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.context.annotation.Primary +import org.springframework.stereotype.Service +import ru.touchin.logger.dto.LogData +import ru.touchin.logger.factory.LogBuilderFactory +import ru.touchin.push.message.provider.dto.request.PushTokenCheck +import ru.touchin.push.message.provider.dto.request.SendPushRequest +import ru.touchin.push.message.provider.dto.result.CheckPushTokenResult +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.PlatformType +import ru.touchin.push.message.provider.enums.PushMessageProviderType +import ru.touchin.push.message.provider.factories.PushMessageProviderServiceFactory +import ru.touchin.push.message.provider.mock.properties.PushMessageProviderMockProperties +import ru.touchin.push.message.provider.services.PushMessageProviderService +import java.util.* + +@Primary +@Service +@ConditionalOnProperty(prefix = "push-message-provider", name = ["mock.enabled"], havingValue = "true") +class PushMessageProviderMockServiceFactoryImpl( + private val logBuilderFactory: LogBuilderFactory, + private val pushMessageProviderMockProperties: PushMessageProviderMockProperties, +) : PushMessageProviderServiceFactory { + + override fun get(platformType: PlatformType): PushMessageProviderService { + return object : PushMessageProviderService { + override val type: PushMessageProviderType + get() = PushMessageProviderType.FCM + + override fun send(request: SendPushRequest): SendPushResult { + val millis = pushMessageProviderMockProperties.sleepFor.toMillis() + + logBuilderFactory.create(this::class.java) + .addTags("MOCK_PUSH_SEND") + .setMethod("send") + .addData("sleepForMs" to millis) + .build() + .log() + + Thread.sleep(millis) + + return SendPushTokenMessageResult( + messageId = UUID.randomUUID().toString(), + ) + } + + override fun check(request: PushTokenCheck): CheckPushTokenResult { + throw NotImplementedError() + } + + } + } + +} diff --git a/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/properties/PushMessageProviderMockProperties.kt b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/properties/PushMessageProviderMockProperties.kt new file mode 100644 index 0000000..75eb97c --- /dev/null +++ b/push-message-provider-mock/src/main/kotlin/ru/touchin/push/message/provider/mock/properties/PushMessageProviderMockProperties.kt @@ -0,0 +1,11 @@ +package ru.touchin.push.message.provider.mock.properties + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.context.properties.ConstructorBinding +import java.time.Duration + +@ConstructorBinding +@ConfigurationProperties(prefix = "push-message-provider.mock") +data class PushMessageProviderMockProperties( + val sleepFor: Duration, +) diff --git a/settings.gradle.kts b/settings.gradle.kts index e2d5daf..b9c349c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -46,6 +46,7 @@ include("version-spring-web") include("push-message-provider") include("push-message-provider-fcm") include("push-message-provider-hpk") +include("push-message-provider-mock") include("response-wrapper-spring-web") include("settings-spring-jpa") include("security-authorization-server-core")