Coverage Summary for Class: MobileConfigSerializationManagerImpl (cloud.mindbox.mobile_sdk.inapp.data.managers)

Class Method, % Branch, % Line, % Instruction, %
MobileConfigSerializationManagerImpl 90.9% (10/11) 44.7% (59/132) 74.4% (116/156) 78.1% (1030/1318)
MobileConfigSerializationManagerImpl$deserializeAbtests$lambda$38$lambda$36$$inlined$fromJson$1 0% (0/1)
MobileConfigSerializationManagerImpl$deserializeInApps$$inlined$fromJson$1 0% (0/1)
Total 76.9% (10/13) 44.7% (59/132) 74.4% (116/156) 78.1% (1030/1318)


 package cloud.mindbox.mobile_sdk.inapp.data.managers
 
 import cloud.mindbox.mobile_sdk.fromJson
 import cloud.mindbox.mobile_sdk.getOrNull
 import cloud.mindbox.mobile_sdk.inapp.data.dto.*
 import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.MobileConfigSerializationManager
 import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl
 import cloud.mindbox.mobile_sdk.logger.mindboxLogE
 import cloud.mindbox.mobile_sdk.models.TreeTargetingDto
 import cloud.mindbox.mobile_sdk.models.operation.response.*
 import cloud.mindbox.mobile_sdk.models.operation.response.InAppConfigResponseBlank.InAppDtoBlank
 import cloud.mindbox.mobile_sdk.models.operation.response.SettingsDtoBlank.*
 import com.google.gson.Gson
 import com.google.gson.JsonElement
 import com.google.gson.JsonObject
 import com.google.gson.JsonParser
 
 internal class MobileConfigSerializationManagerImpl(private val gson: Gson) :
     MobileConfigSerializationManager {
 
     override fun deserializeToInAppTargetingDto(inAppTreeTargeting: JsonObject?): TreeTargetingDto? {
         val result = runCatching {
             gson.fromJson(inAppTreeTargeting, TreeTargetingDto::class.java)
         }
         result.exceptionOrNull()?.let { error ->
             MindboxLoggerImpl.e(
                 parent = this@MobileConfigSerializationManagerImpl,
                 message = "Failed to parse JsonObject: $inAppTreeTargeting",
                 exception = error
             )
         }
         return result.getOrNull()
     }
 
     override fun deserializeToFrequencyDto(frequencyString: JsonObject?): FrequencyDto? {
         val result = runCatching {
             gson.fromJson(frequencyString, FrequencyDto::class.java)
         }
         result.exceptionOrNull()?.let { error ->
             mindboxLogE(
                 message = "Failed to parse JsonObject: $frequencyString",
                 exception = error
             )
         }
         return result.getOrNull()
     }
 
     override fun deserializeToConfigDtoBlank(inAppConfig: String): InAppConfigResponseBlank? {
         val jsonObject = runCatching {
             JsonParser.parseString(inAppConfig).asJsonObject
         }.getOrElse {
             mindboxLogE("Failed to parse inAppConfig json", it)
             return null
         }
 
         val inApps = jsonObject.getOrNull("inapps")?.let { deserializeInApps(it) }
         val settings = jsonObject.getOrNull("settings")?.let { deserializeSettings(it) }
         val abtests = jsonObject.getOrNull("abtests")?.let { deserializeAbtests(it) }
         val monitoring = jsonObject.getOrNull("monitoring")?.let { deserializeMonitoring(it) }
 
         return InAppConfigResponseBlank(inApps, monitoring, settings, abtests)
     }
 
     internal fun deserializeMonitoring(json: JsonElement?): MonitoringDto? = runCatching {
         MonitoringDto(logs = json!!
             .asJsonObject.get("logs")
             .asJsonArray.mapNotNull { log ->
                 runCatching {
                     gson.fromJson(log, LogRequestDtoBlank::class.java)?.copy()
                 }.getOrNull {
                     mindboxLogE("Failed to parse logs block", it)
                 }
             })
     }.getOrNull {
         mindboxLogE("Failed to parse monitoring block", it)
     }
 
     internal fun deserializeInApps(json: JsonElement?): List<InAppDtoBlank>? =
         gson.fromJson<List<InAppDtoBlank>>(json)
             .getOrNull {
                 mindboxLogE("Failed to parse inapps block", it)
             }
 
     internal fun deserializeSettings(json: JsonElement?): SettingsDtoBlank? = runCatching {
         json?.let {
             val operations = json.asJsonObject.get("operations")?.let { operationsJson ->
                 runCatching {
                     operationsJson.asJsonObject.entrySet().associate { (key, value) ->
                         key to runCatching {
                             gson.fromJson(value, OperationDtoBlank::class.java)?.copy()
                         }.getOrNull {
                             mindboxLogE("Failed to parse operation $key", it)
                         }
                     }.filterValues { it != null }
                 }.getOrNull {
                     mindboxLogE("Failed to parse operations block", it)
                 }
             }
 
             val ttl = runCatching {
                 gson.fromJson(json.asJsonObject.get("ttl"), TtlDtoBlank::class.java)?.copy()
             }.getOrNull {
                 mindboxLogE("Failed to parse ttl block", it)
             }
 
             val slidingExpiration = runCatching {
                 gson.fromJson(json.asJsonObject.get("slidingExpiration"), SlidingExpirationDtoBlank::class.java)?.copy()
             }.getOrNull {
                 mindboxLogE("Failed to parse slidingExpiration block")
             }
 
             val inappSettings = runCatching {
                 gson.fromJson(json.asJsonObject.get("inapp"), InappSettingsDtoBlank::class.java)?.copy()
             }.getOrNull {
                 mindboxLogE("Failed to parse inapp block in settings section ")
             }
 
             val featureToggles = runCatching {
                 gson.fromJson(json.asJsonObject.get("featureToggles"), FeatureTogglesDtoBlank::class.java)?.copy()
             }.getOrNull {
                 mindboxLogE("Failed to parse featureToggles block in settings section")
             }
 
             val baseAddresses = runCatching {
                 gson.fromJson(json.asJsonObject.get("baseAddresses"), BaseAddressesDtoBlank::class.java)?.copy()
             }.getOrNull {
                 mindboxLogE("Failed to parse baseAddresses block in settings section")
             }
 
             SettingsDtoBlank(operations, ttl, slidingExpiration, inappSettings, featureToggles, baseAddresses)
         }
     }.getOrNull {
         mindboxLogE("Failed to parse settings block", it)
     }
 
     internal fun deserializeAbtests(json: JsonElement?): List<ABTestDto>? = runCatching {
         json?.asJsonArray?.map { abtest ->
             gson.fromJson<ABTestDto?>(abtest).getOrThrow()!!
         }?.map { it.copy() }
     }.getOrNull {
         mindboxLogE("Failed to parse abtests block", it)
     }
 
     override fun deserializeToInAppFormDto(inAppForm: JsonObject?): FormDto? {
         val blankResult = runCatching {
             gson.fromJson(inAppForm, FormBlankDto::class.java)
         }
         blankResult.exceptionOrNull()?.let { error ->
             MindboxLoggerImpl.e(
                 parent = this@MobileConfigSerializationManagerImpl,
                 message = "Failed to parse JsonObject: $inAppForm",
                 exception = error
             )
         }
         val result =
             FormDto(
                 variants = blankResult.getOrNull()?.variants?.filterNotNull()
                     ?.map { payloadBlankDto ->
                         when (payloadBlankDto) {
                             is PayloadBlankDto.ModalWindowBlankDto -> {
                                 PayloadDto.ModalWindowDto(
                                     content = PayloadDto.ModalWindowDto.ContentDto(
                                         background = BackgroundDto(
                                             layers = payloadBlankDto.content?.background?.layers?.mapNotNull {
                                                 deserializeToBackgroundLayersDto(it as JsonObject)
                                             }),
                                         elements = payloadBlankDto.content?.elements?.mapNotNull {
                                             deserializeToElementDto(it)
                                         }
                                     ), type = PayloadDto.ModalWindowDto.MODAL_JSON_NAME
                                 )
                             }
 
                             is PayloadBlankDto.SnackBarBlankDto -> {
                                 PayloadDto.SnackbarDto(
                                     content = PayloadDto.SnackbarDto.ContentDto(
                                         background = BackgroundDto(layers = payloadBlankDto.content?.background?.layers?.mapNotNull {
                                             deserializeToBackgroundLayersDto(it as JsonObject)
                                         }),
                                         elements = payloadBlankDto.content?.elements?.mapNotNull {
                                             deserializeToElementDto(it)
                                         },
                                         position = PayloadDto.SnackbarDto.ContentDto.PositionDto(
                                             gravity = PayloadDto.SnackbarDto.ContentDto.PositionDto.GravityDto(
                                                 horizontal = payloadBlankDto.content?.position?.gravity?.horizontal,
                                                 vertical = payloadBlankDto.content?.position?.gravity?.vertical
                                             ),
                                             margin = PayloadDto.SnackbarDto.ContentDto.PositionDto.MarginDto(
                                                 bottom = payloadBlankDto.content?.position?.margin?.bottom,
                                                 kind = payloadBlankDto.content?.position?.margin?.kind,
                                                 left = payloadBlankDto.content?.position?.margin?.left,
                                                 right = payloadBlankDto.content?.position?.margin?.right,
                                                 top = payloadBlankDto.content?.position?.margin?.top
                                             )
                                         )
                                     ), type = PayloadDto.SnackbarDto.SNACKBAR_JSON_NAME
                                 )
                             }
                         }
                     })
         if (result.variants.isNullOrEmpty()) return null
         return result
     }
 
     private fun deserializeToElementDto(element: JsonObject?): ElementDto? {
         if (element == null) return null
         val result = runCatching {
             gson.fromJson(element, ElementDto::class.java)
         }
         result.exceptionOrNull()?.let { error ->
             MindboxLoggerImpl.e(
                 parent = this@MobileConfigSerializationManagerImpl,
                 message = "Failed to parse JsonObject: $element",
                 exception = error
             )
         }
         return result.getOrNull()
     }
 
     private fun deserializeToBackgroundLayersDto(layer: JsonObject?): BackgroundDto.LayerDto? {
         if (layer == null) return null
         val result = runCatching {
             gson.fromJson(layer, BackgroundDto.LayerDto::class.java)
         }
         result.exceptionOrNull()?.let { error ->
             MindboxLoggerImpl.e(
                 parent = this@MobileConfigSerializationManagerImpl,
                 message = "Failed to parse JsonObject: $layer",
                 exception = error
             )
         }
         return result.getOrNull()
     }
 }