Coverage Summary for Class: MindboxWebViewOperationExecutor (cloud.mindbox.mobile_sdk.inapp.presentation.view)

Class Method, % Branch, % Line, % Instruction, %
MindboxWebViewOperationExecutor 100% (4/4) 100% (8/8) 100% (18/18) 100% (97/97)
MindboxWebViewOperationExecutor$Companion
MindboxWebViewOperationExecutor$executeSyncOperation$2$1 100% (1/1) 50% (1/2) 100% (2/2) 100% (12/12)
MindboxWebViewOperationExecutor$executeSyncOperation$2$2 100% (1/1) 50% (1/2) 100% (3/3) 100% (19/19)
Total 100% (6/6) 83.3% (10/12) 100% (23/23) 100% (128/128)


 package cloud.mindbox.mobile_sdk.inapp.presentation.view
 
 import android.app.Application
 import cloud.mindbox.mobile_sdk.managers.MindboxEventManager
 import cloud.mindbox.mobile_sdk.models.MindboxError
 import com.google.gson.JsonObject
 import com.google.gson.JsonParser
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
 import kotlin.coroutines.resumeWithException
 
 internal interface WebViewOperationExecutor {
 
     fun executeAsyncOperation(context: Application, payload: String?)
 
     suspend fun executeSyncOperation(payload: String?): String
 }
 
 internal class MindboxWebViewOperationExecutor : WebViewOperationExecutor {
 
     companion object {
         private const val OPERATION_FIELD = "operation"
         private const val BODY_FIELD = "body"
     }
 
     override fun executeAsyncOperation(context: Application, payload: String?) {
         val (operation, body) = parseOperationRequest(payload)
         MindboxEventManager.asyncOperation(
             context = context,
             name = operation,
             body = body,
         )
     }
 
     override suspend fun executeSyncOperation(payload: String?): String {
         val (operation, body) = parseOperationRequest(payload)
         return suspendCancellableCoroutine { continuation ->
             MindboxEventManager.syncOperation(
                 name = operation,
                 bodyJson = body,
                 onSuccess = { responseBody: String ->
                     if (continuation.isActive) {
                         continuation.resume(responseBody)
                     }
                 },
                 onError = { error: MindboxError ->
                     if (continuation.isActive) {
                         continuation.resumeWithException(
                             IllegalStateException(error.toJson())
                         )
                     }
                 },
             )
         }
     }
 
     private fun parseOperationRequest(payload: String?): Pair<String, String> {
         val jsonObject: JsonObject = JsonParser.parseString(payload).asJsonObject
         val operation: String = jsonObject.getAsJsonPrimitive(OPERATION_FIELD)?.asString
             ?: throw IllegalArgumentException("Operation is not provided")
         val body: String = jsonObject.getAsJsonObject(BODY_FIELD)?.toString()
             ?: throw IllegalArgumentException("Body is not provided")
         return operation to body
     }
 }