Coverage Summary for Class: MindboxErrorAdapter (cloud.mindbox.mobile_sdk.models)

Class Method, % Branch, % Line, % Instruction, %
MindboxErrorAdapter 80% (4/5) 64.7% (22/34) 95.2% (40/42) 93.2% (300/322)
MindboxErrorAdapter$gson$2 100% (1/1) 100% (1/1) 100% (3/3)
MindboxErrorAdapter$read$1$1 100% (1/1) 0% (0/30) 6.5% (2/31) 4.7% (10/211)
MindboxErrorAdapter$validationErrors$1 0% (0/1) 0% (0/3) 0% (0/14)
MindboxErrorAdapter$validationErrors$1$1 0% (0/1) 0% (0/1) 0% (0/2)
Total 66.7% (6/9) 34.4% (22/64) 55.1% (43/78) 56.7% (313/552)


 package cloud.mindbox.mobile_sdk.models
 
 import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
 import com.google.gson.Gson
 import com.google.gson.TypeAdapter
 import com.google.gson.reflect.TypeToken
 import com.google.gson.stream.JsonReader
 import com.google.gson.stream.JsonToken
 import com.google.gson.stream.JsonWriter
 
 internal class MindboxErrorAdapter : TypeAdapter<MindboxError?>() {
 
     private val gson by lazy { Gson() }
 
     private val errorJsonNames = mapOf(
         MindboxError.Validation::class to "MindboxError",
         MindboxError.Protocol::class to "MindboxError",
         MindboxError.InternalServer::class to "MindboxError",
         MindboxError.UnknownServer::class to "NetworkError",
         MindboxError.Unknown::class to "InternalError",
     )
 
     override fun write(out: JsonWriter?, value: MindboxError?) {
         if (value == null) {
             out?.nullValue()
         } else {
             out?.beginObject()
                 ?.name("type")
                 ?.value(errorJsonNames[value::class])
                 ?.name("data")
                 ?.writeErrorObject(value)
                 ?.endObject()
         }
     }
 
     override fun read(`in`: JsonReader?): MindboxError? = `in`?.let { reader ->
         LoggingExceptionHandler.runCatching(defaultValue = null) {
             reader.beginObject()
             val error = when (reader.nextString()) {
                 "MindboxError" -> {
                     val statusCode = reader.nextInt()
                     when (statusCode) {
                         200 -> MindboxError.Validation(
                             statusCode = reader.nextInt(),
                             status = reader.nextString(),
                             validationMessages = validationErrors(reader),
                         )
                         400, 401, 403, 429 -> MindboxError.Protocol(
                             statusCode = reader.nextInt(),
                             status = reader.nextString(),
                             errorMessage = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                             errorId = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                             httpStatusCode = if (reader.peek() == JsonToken.NUMBER) reader.nextInt() else null,
                         )
                         500, 503 -> MindboxError.InternalServer(
                             statusCode = reader.nextInt(),
                             status = reader.nextString(),
                             errorMessage = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                             errorId = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                             httpStatusCode = if (reader.peek() == JsonToken.NUMBER) reader.nextInt() else null,
                         )
                         else -> null
                     }
                 }
                 "NetworkError" -> MindboxError.UnknownServer(
                     statusCode = reader.nextInt(),
                     status = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                     errorMessage = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                     errorId = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
                     httpStatusCode = if (reader.peek() == JsonToken.NUMBER) reader.nextInt() else null,
                 )
                 "InternalError" -> MindboxError.Unknown().apply { reader.skipValue() }
                 else -> null
             }
             reader.endObject()
             error
         }
     }
 
     private fun validationErrors(
         reader: JsonReader
     ): List<ValidationMessage> = LoggingExceptionHandler.runCatching(defaultValue = listOf()) {
         gson.fromJson<List<ValidationMessage>>(
             reader,
             object : TypeToken<List<ValidationMessage>>() {}.type,
         )
     }
 
     private fun JsonWriter.writeErrorObject(value: MindboxError) = beginObject().apply {
         when (value) {
             is MindboxError.Validation -> name("statusCode").value(value.statusCode)
                 .name("status").value(value.status)
                 .name("validationMessages").jsonValue(gson.toJson(value.validationMessages))
             is MindboxError.Protocol -> name("statusCode").value(value.statusCode)
                 .name("status").value(value.status)
                 .name("errorMessage").value(value.errorMessage)
                 .name("errorId").value(value.errorId)
                 .name("httpStatusCode").value(value.httpStatusCode)
             is MindboxError.InternalServer -> name("statusCode").value(value.statusCode)
                 .name("status").value(value.status)
                 .name("errorMessage").value(value.errorMessage)
                 .name("errorId").value(value.errorId)
                 .name("httpStatusCode").value(value.httpStatusCode)
             is MindboxError.UnknownServer -> name("statusCode").value(value.statusCode)
                 .name("status").value(value.status)
                 .name("errorMessage").value(value.errorMessage)
                 .name("errorId").value(value.errorId)
                 .name("httpStatusCode").value(value.httpStatusCode)
             is MindboxError.Unknown -> name("errorName").value(value.throwable?.javaClass?.canonicalName)
                 .name("errorMessage").value(value.throwable?.localizedMessage)
         }
     }.endObject()
 }