diff --git a/gradle.properties b/gradle.properties index f0dfabb82..1779fdb2a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official # SDK version property -SDK_VERSION_NAME=2.8.2 +SDK_VERSION_NAME=2.8.3 diff --git a/mindbox-firebase/src/main/java/cloud/mindbox/mindbox_firebase/MindboxFirebase.kt b/mindbox-firebase/src/main/java/cloud/mindbox/mindbox_firebase/MindboxFirebase.kt index 51949acb1..13c2024bc 100644 --- a/mindbox-firebase/src/main/java/cloud/mindbox/mindbox_firebase/MindboxFirebase.kt +++ b/mindbox-firebase/src/main/java/cloud/mindbox/mindbox_firebase/MindboxFirebase.kt @@ -4,7 +4,10 @@ import cloud.mindbox.mobile_sdk.logger.MindboxLogger import cloud.mindbox.mobile_sdk.pushes.MindboxPushService import cloud.mindbox.mobile_sdk.pushes.PushServiceHandler import cloud.mindbox.mobile_sdk.utils.ExceptionHandler - +/** + * An object to use when choosing push provider in Mindbox.initPushServices or Mindbox.init. + * Represents FCM + * */ object MindboxFirebase : MindboxPushService { override val tag: String = "FCM" diff --git a/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt b/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt index 7eafd81f7..87d42293c 100644 --- a/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt +++ b/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt @@ -4,7 +4,10 @@ import cloud.mindbox.mobile_sdk.logger.MindboxLogger import cloud.mindbox.mobile_sdk.pushes.MindboxPushService import cloud.mindbox.mobile_sdk.pushes.PushServiceHandler import cloud.mindbox.mobile_sdk.utils.ExceptionHandler - +/** + * An object to use when choosing push provider in Mindbox.initPushServices or Mindbox.init. + * Represents HCM + * */ object MindboxHuawei : MindboxPushService { override val tag: String = "HCM" diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt index e338eaad0..ca5253fd4 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt @@ -18,11 +18,14 @@ import androidx.annotation.IdRes import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppType import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler +import com.android.volley.VolleyError +import com.android.volley.toolbox.HttpHeaderParser import org.threeten.bp.Instant import org.threeten.bp.LocalDateTime import org.threeten.bp.ZoneOffset import org.threeten.bp.ZonedDateTime import org.threeten.bp.format.DateTimeFormatter +import java.nio.charset.Charset import java.util.Queue import kotlin.math.roundToInt @@ -182,4 +185,17 @@ internal fun PackageManager.getPackageInfoCompat(context: Context, flags: Int): } else { getPackageInfo(context.packageName, flags) } +} + +internal fun VolleyError.getErrorResponseBodyData(): String { + return this.networkResponse?.data + ?.takeIf { it.isNotEmpty() } + ?.toString( + Charset.forName( + HttpHeaderParser.parseCharset( + this.networkResponse?.headers ?: emptyMap() + ) + ) + ) + ?: "" } \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/InitializeMindboxException.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/InitializeMindboxException.kt index 7a51eb9f8..f96912d9a 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/InitializeMindboxException.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/InitializeMindboxException.kt @@ -1,3 +1,5 @@ package cloud.mindbox.mobile_sdk - +/** + * An error thrown during initialization in case validation of initialization fails + * */ class InitializeMindboxException(message: String) : Exception(message) \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt index be9435f3a..563e4a957 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt @@ -346,6 +346,9 @@ object Mindbox : MindboxLog { * Creates and deliveries event of "Push delivered". Recommended call this method from * background thread. * + * Use this method only if you have custom push handling you don't use [Mindbox.handleRemoteMessage]. + * You must not call it otherwise. + * * @param context used to initialize the main tools * @param uniqKey - unique identifier of push notification */ diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/abtests/CustomerAbMixer.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/abtests/CustomerAbMixer.kt index 07750411e..efd26a7e3 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/abtests/CustomerAbMixer.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/abtests/CustomerAbMixer.kt @@ -1,5 +1,5 @@ package cloud.mindbox.mobile_sdk.abtests -interface CustomerAbMixer { +internal interface CustomerAbMixer { fun stringModulusHash(identifier: String, salt: String): Int } diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/Modules.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/Modules.kt deleted file mode 100644 index e69de29bb..000000000 diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidator.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidator.kt index ab30832a5..1edcdc30c 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidator.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidator.kt @@ -1,11 +1,14 @@ package cloud.mindbox.mobile_sdk.inapp.data.validators +import com.google.gson.JsonParser internal class JsonValidator : Validator { override fun isValid(item: String?): Boolean { if (item.isNullOrBlank()) return false - val jsonRegex = "^\\s*(\\{.*\\}|\\[.*])\\s*$" - return item.trim().matches(jsonRegex.toRegex()) + + return runCatching { + JsonParser.parseString(item).let { it.isJsonObject || it.isJsonArray } + }.getOrElse { false } } } \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt index fc3b973f3..e049269cd 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt @@ -1,5 +1,6 @@ package cloud.mindbox.mobile_sdk.inapp.domain +import cloud.mindbox.mobile_sdk.getErrorResponseBodyData import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppContentFetcher import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppChoosingManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppGeoRepository @@ -7,16 +8,22 @@ import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppSegmen import cloud.mindbox.mobile_sdk.inapp.domain.models.* import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl import cloud.mindbox.mobile_sdk.logger.mindboxLogD +import cloud.mindbox.mobile_sdk.logger.mindboxLogI +import cloud.mindbox.mobile_sdk.logger.mindboxLogW import cloud.mindbox.mobile_sdk.models.InAppEventType +import com.android.volley.VolleyError import kotlinx.coroutines.* internal class InAppChoosingManagerImpl( private val inAppGeoRepository: InAppGeoRepository, private val inAppSegmentationRepository: InAppSegmentationRepository, private val inAppContentFetcher: InAppContentFetcher -) : - InAppChoosingManager { +) : InAppChoosingManager { + companion object { + private const val RESPONSE_STATUS_CUSTOMER_SEGMENTS_REQUIRE_CUSTOMER = + "CheckCustomerSegments requires customer" + } override suspend fun chooseInAppToShow( inApps: List, triggerEvent: InAppEventType, @@ -66,11 +73,7 @@ internal class InAppChoosingManagerImpl( inAppSegmentationRepository.setCustomerSegmentationStatus( CustomerSegmentationFetchStatus.SEGMENTATION_FETCH_ERROR ) - MindboxLoggerImpl.e( - this, - "Error fetching customer segmentations", - throwable - ) + handleCustomerSegmentationErrorLog(throwable) } else -> { @@ -124,6 +127,19 @@ internal class InAppChoosingManagerImpl( ) } + private fun handleCustomerSegmentationErrorLog(error: CustomerSegmentationError) { + val volleyError = error.cause as? VolleyError + volleyError?.let { error -> + if ((error.networkResponse?.statusCode == 400) && (error.getErrorResponseBodyData() + .contains(RESPONSE_STATUS_CUSTOMER_SEGMENTS_REQUIRE_CUSTOMER)) + ) { + mindboxLogI("Cannot check customer segment. It's a new customer") + return + } + } + mindboxLogW("Error fetching customer segmentations", error) + } + private class TargetingDataWrapper( override val triggerEventName: String, override val operationBody: String? = null, diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/models/InAppDataError.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/models/InAppDataError.kt index 04c420e29..2f25843db 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/models/InAppDataError.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/models/InAppDataError.kt @@ -11,4 +11,4 @@ internal class GeoError(volleyError: VolleyError) : Exception(volleyError) internal class ProductSegmentationError(volleyError: VolleyError) : Exception(volleyError) -internal class InAppContentFetchingError(error: GlideException?) : Exception(error) \ No newline at end of file +internal class InAppContentFetchingError(error: GlideException?) : Exception(error) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/logger/MindboxLoggerImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/logger/MindboxLoggerImpl.kt index a8c2bdf6c..10423341b 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/logger/MindboxLoggerImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/logger/MindboxLoggerImpl.kt @@ -8,7 +8,9 @@ import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.MonitoringRepositor import com.android.volley.VolleyLog import kotlinx.coroutines.* import org.threeten.bp.Instant - +/** + * An interface for internal sdk work only. Do not implement or use it. + * */ interface MindboxLogger { fun i(parent: Any, message: String) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/GatewayManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/GatewayManager.kt index 1f168a505..afcd437ea 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/GatewayManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/GatewayManager.kt @@ -16,7 +16,6 @@ import com.android.volley.DefaultRetryPolicy import com.android.volley.DefaultRetryPolicy.DEFAULT_BACKOFF_MULT import com.android.volley.Request import com.android.volley.VolleyError -import com.android.volley.toolbox.StringRequest import com.google.gson.Gson import kotlinx.coroutines.* import org.json.JSONException @@ -409,17 +408,18 @@ internal class GatewayManager(private val mindboxServiceGenerator: MindboxServic } } - suspend fun fetchMobileConfig(configuration: Configuration): String { return suspendCoroutine { continuation -> mindboxServiceGenerator.addToRequestQueue( - StringRequest( - Request.Method.GET, - getConfigUrl(configuration), - { response -> - continuation.resume(response) + MindboxRequest( + methodType = Request.Method.GET, + fullUrl = getConfigUrl(configuration), + configuration = configuration, + jsonRequest = null, + listener = { response -> + continuation.resume(response.toString()) }, - { error -> + errorsListener = { error -> continuation.resumeWithException(error) }, ) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxError.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxError.kt index 5dfef84f2..c1afb12b0 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxError.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxError.kt @@ -2,7 +2,10 @@ package cloud.mindbox.mobile_sdk.models import com.google.gson.Gson import com.google.gson.annotations.JsonAdapter - +/** + * A class for representing Mindbox error. + * Used in operations. + * */ sealed class MindboxError(open val statusCode: Int?) { companion object { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxErrorAdapter.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxErrorAdapter.kt index 7bc066206..b17bfe0ab 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxErrorAdapter.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/MindboxErrorAdapter.kt @@ -8,7 +8,7 @@ import com.google.gson.stream.JsonReader import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter -class MindboxErrorAdapter : TypeAdapter() { +internal class MindboxErrorAdapter : TypeAdapter() { private val gson by lazy { Gson() } diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Requests.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Requests.kt index e9f5e539c..80ccdbe60 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Requests.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Requests.kt @@ -2,7 +2,9 @@ package cloud.mindbox.mobile_sdk.models import android.os.Build import cloud.mindbox.mobile_sdk.BuildConfig -import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl +import cloud.mindbox.mobile_sdk.getErrorResponseBodyData +import cloud.mindbox.mobile_sdk.logger.mindboxLogI +import cloud.mindbox.mobile_sdk.logger.mindboxLogW import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler import com.android.volley.NetworkResponse import com.android.volley.ParseError @@ -108,25 +110,16 @@ internal data class MindboxRequest( //Logging error responses override fun parseNetworkError(volleyError: VolleyError): VolleyError { LoggingExceptionHandler.runCatching { - MindboxLoggerImpl.e( - this, - "<--- Error ${volleyError.networkResponse?.statusCode} $fullUrl TimeMls:${volleyError.networkTimeMs}; ", - ) try { - volleyError.networkResponse?.allHeaders?.joinToString ( + val json = volleyError.getErrorResponseBodyData() + + logResponseResult(volleyError, json) + + volleyError.networkResponse?.allHeaders?.joinToString( separator = System.getProperty("line.separator") ?: "\n" ) { header -> "${header.name}: ${header.value}" - }?.let { MindboxLoggerImpl.d(this, it) } - - val json = String( - volleyError.networkResponse?.data ?: ByteArray(0), - Charset.forName( - HttpHeaderParser.parseCharset( - volleyError.networkResponse?.headers ?: emptyMap() - ) - ) - ) + }?.let { mindboxLogI(it) } logBodyResponse(json) } catch (e: Exception) { @@ -142,32 +135,47 @@ internal data class MindboxRequest( private fun logResponse(response: NetworkResponse?) { LoggingExceptionHandler.runCatching { - MindboxLoggerImpl.d(this, "<--- ${response?.statusCode} $fullUrl") + mindboxLogI("<--- ${response?.statusCode} $fullUrl") - response?.allHeaders?.joinToString ( + response?.allHeaders?.joinToString( separator = System.getProperty("line.separator") ?: "\n" ) { header -> "${header.name}: ${header.value}" - }?.let { MindboxLoggerImpl.d(this, it) } + }?.let { mindboxLogI(it) } } } private fun logBodyResponse(json: String?) { LoggingExceptionHandler.runCatching { - MindboxLoggerImpl.d(this, "$json") + mindboxLogI("$json") } } private fun logError(e: Exception) { LoggingExceptionHandler.runCatching { - MindboxLoggerImpl.d(this, e.message ?: "Empty message") - MindboxLoggerImpl.d(this, e.stackTraceToString()) + mindboxLogW(e.message ?: "Empty message") + mindboxLogW(e.stackTraceToString()) } } private fun logEndResponse() { LoggingExceptionHandler.runCatching { - MindboxLoggerImpl.d(this, "<--- End of response") + mindboxLogI("<--- End of response") + } + } + + private fun logResponseResult(volleyError: VolleyError?, json: String?) { + LoggingExceptionHandler.runCatching { + val logMessage = buildString { + append("<--- ") + append(if (json?.contains("\"status\": \"Success\"") == true) "Success" else "Error") + append(" ${volleyError?.networkResponse?.statusCode} $fullUrl TimeMls:${volleyError?.networkTimeMs}; ") + } + if (json?.contains("{\"status\": \"Success\"}") == true) { + mindboxLogI(logMessage) + } else { + mindboxLogW(logMessage) + } } } diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/ValidationMessage.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/ValidationMessage.kt index 20689bd19..e068feace 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/ValidationMessage.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/ValidationMessage.kt @@ -1,7 +1,9 @@ package cloud.mindbox.mobile_sdk.models import com.google.gson.annotations.SerializedName - +/** + * A class to hold validation message if validation error occurs + * */ data class ValidationMessage( @SerializedName("message") val message: String? = null, @SerializedName("location") val location: String? = null, diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/network/MindboxServiceGenerator.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/network/MindboxServiceGenerator.kt index b4740bcec..01ce0df2d 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/network/MindboxServiceGenerator.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/network/MindboxServiceGenerator.kt @@ -7,7 +7,6 @@ import cloud.mindbox.mobile_sdk.models.MindboxRequest import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler import com.android.volley.RequestQueue import com.android.volley.VolleyLog -import com.android.volley.toolbox.StringRequest import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine @@ -29,11 +28,6 @@ internal class MindboxServiceGenerator(private val requestQueue: RequestQueue) { } } - internal fun addToRequestQueue(request: StringRequest) { - requestQueue.add(request) - // TODO change StringRequest to MindboxRequest or log here - } - internal fun addToRequestQueue(request: MindboxRequest) = LoggingExceptionHandler.runCatching { requestQueue.let { requestQueue -> requestQueue.add(request) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/MindboxPushService.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/MindboxPushService.kt index d4894a142..5b2694eaf 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/MindboxPushService.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/MindboxPushService.kt @@ -2,7 +2,9 @@ package cloud.mindbox.mobile_sdk.pushes import cloud.mindbox.mobile_sdk.logger.MindboxLogger import cloud.mindbox.mobile_sdk.utils.ExceptionHandler - +/** + * An interface for internal sdk work only. Do not implement it + * */ interface MindboxPushService { val tag: String diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushAction.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushAction.kt index cc8db1a08..31a7b6231 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushAction.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushAction.kt @@ -1,7 +1,11 @@ package cloud.mindbox.mobile_sdk.pushes import com.google.gson.annotations.SerializedName - +/** + * A class representing mindbox push action in [RemoteMessage] + * * You can use it as a model to store data from mindbox + * * with your custom push notification implementation. + * */ data class PushAction( @SerializedName("uniqueKey") val uniqueKey: String?, @SerializedName("text") val text: String?, diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushServiceHandler.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushServiceHandler.kt index 13d62ca25..39ce43d89 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushServiceHandler.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushServiceHandler.kt @@ -4,7 +4,9 @@ import android.content.Context import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler import java.util.UUID - +/** +* A class for internal sdk work only. Do not extend or use it +* */ abstract class PushServiceHandler { companion object { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/RemoteMessage.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/RemoteMessage.kt index 696bda175..73381905c 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/RemoteMessage.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/RemoteMessage.kt @@ -1,5 +1,9 @@ package cloud.mindbox.mobile_sdk.pushes - +/** + * A class representing mindbox remote message + * You can use it as a model to store data from mindbox + * with your custom push notification implementation. + * */ data class RemoteMessage( val uniqueKey: String, val title: String, diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/utils/ExceptionHandler.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/utils/ExceptionHandler.kt index 6ecc240f4..071a582c4 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/utils/ExceptionHandler.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/utils/ExceptionHandler.kt @@ -1,5 +1,7 @@ package cloud.mindbox.mobile_sdk.utils - +/** + * A class for internal sdk work only. Do not extend or use it + * */ abstract class ExceptionHandler { fun runCatching(block: () -> T) { diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/ExtensionsTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/ExtensionsTest.kt index 2fda90cda..cdd70b4a9 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/ExtensionsTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/ExtensionsTest.kt @@ -2,10 +2,10 @@ package cloud.mindbox.mobile_sdk import android.content.Context import androidx.test.core.app.ApplicationProvider +import com.android.volley.NetworkResponse +import com.android.volley.VolleyError import com.jakewharton.threetenabp.AndroidThreeTen -import io.mockk.every -import io.mockk.mockk -import io.mockk.mockkObject +import io.mockk.* import org.junit.Assert.* import org.junit.Before import org.junit.Test @@ -30,7 +30,8 @@ internal class ExtensionsTest { @Test fun `converting zoned date time to string`() { val time: ZonedDateTime = ZonedDateTime.now() - val expectedResult = time.withZoneSameInstant(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")) + val expectedResult = time.withZoneSameInstant(ZoneId.systemDefault()) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")) val actualResult = time.convertToString() assertEquals(expectedResult, actualResult) } @@ -125,4 +126,24 @@ internal class ExtensionsTest { assertTrue(linkedList.contains("tE5t4")) assertEquals(3, linkedList.size) } + + @Test + fun `should return empty string if error has no network response data`() { + val error = VolleyError() + assertEquals("", error.getErrorResponseBodyData()) + } + + @Test + fun `should return response body data`() { + val responseBodyData = "test string" + val networkResponse = NetworkResponse( + 400, + responseBodyData.toByteArray(), + true, + 200, + emptyList() + ) + val error = VolleyError(networkResponse) + assertEquals(responseBodyData, error.getErrorResponseBodyData()) + } } \ No newline at end of file diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidatorTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidatorTest.kt index 00e0cfb03..12ec221d7 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidatorTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/JsonValidatorTest.kt @@ -1,7 +1,5 @@ package cloud.mindbox.mobile_sdk.inapp.data.validators -import org.json.JSONException -import org.json.JSONObject import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test @@ -16,11 +14,13 @@ class JsonValidatorTest { val validJson = "{\"inappid\":\"someInAppId\"}" assertTrue(jsonValidator.isValid(validJson)) } + @Test fun testInvalidJson() { val invalidJson = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"" assertFalse(jsonValidator.isValid(invalidJson)) } + @Test fun `is not valid json string`() { val inValidJson = "12sd3" @@ -33,8 +33,37 @@ class JsonValidatorTest { assertFalse(jsonValidator.isValid(emptyString)) } + @Test + fun `is valid JSON string with line breaks`() { + val validJson = "{\n\"inappid\":\"someInAppId\"\n}" + assertTrue(jsonValidator.isValid(validJson)) + } + @Test fun `is null string`() { assertFalse(jsonValidator.isValid(null)) } + + @Test + fun `is valid JSON array string`() { + val jsonString = """ + [ + {"name": "John", "age": 30}, + {"name": "Jane", "age": 25} + ] + """.trimIndent() + assertTrue(jsonValidator.isValid(jsonString)) + } + + @Test + fun `is valid JSON with spaces`() { + val validJson = " { \"inappid\": \"someInAppId\" } " + assertTrue(jsonValidator.isValid(validJson)) + } + + @Test + fun `is valid empty JSON array `() { + val validJson = "[]" + assertTrue(jsonValidator.isValid(validJson)) + } } \ No newline at end of file diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/XmlValidatorTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/XmlValidatorTest.kt index 5b373f131..9d0485766 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/XmlValidatorTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/XmlValidatorTest.kt @@ -32,4 +32,31 @@ class XmlValidatorTest { "abc9876543210" assertFalse(xmlValidator.isValid(xmlString)) } + + @Test + fun `valid xml string with line breaks`() { + val xmlString = + """ + + + abc + 9876543210 + + """.trimIndent() + assertTrue(xmlValidator.isValid(xmlString)) + } + + @Test + fun `inValid xml string with line breaks`() { + val xmlString = + """ + + + abc + 9876543210 + + """.trimIndent() + assertFalse(xmlValidator.isValid(xmlString)) + } + } \ No newline at end of file