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