From d443cff08cbdac2d67762ea6d3213880b4e045b7 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Thu, 11 Apr 2024 10:48:47 -0400 Subject: [PATCH 01/14] fix: update tracking format --- library/src/main/java/com/paypal/messages/ModalFragment.kt | 4 ++-- .../src/main/java/com/paypal/messages/PayPalMessageView.kt | 4 ++-- library/src/main/java/com/paypal/messages/io/Api.kt | 7 ++++--- .../src/main/java/com/paypal/messages/logger/CloudEvent.kt | 2 +- .../java/com/paypal/messages/logger/TrackingComponent.kt | 2 +- .../main/java/com/paypal/messages/logger/TrackingEvent.kt | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/com/paypal/messages/ModalFragment.kt b/library/src/main/java/com/paypal/messages/ModalFragment.kt index 49054518..5314571a 100644 --- a/library/src/main/java/com/paypal/messages/ModalFragment.kt +++ b/library/src/main/java/com/paypal/messages/ModalFragment.kt @@ -355,8 +355,8 @@ internal class ModalFragment( logEvent( TrackingEvent( eventType = EventType.MODAL_RENDER, - renderDuration, - requestDuration, + renderDuration = renderDuration.toString(), + requestDuration = requestDuration.toString(), ), ) } diff --git a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt index 3c408173..013b92c5 100644 --- a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt +++ b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt @@ -475,8 +475,8 @@ class PayPalMessageView @JvmOverloads constructor( logEvent( TrackingEvent( eventType = EventType.MESSAGE_RENDER, - renderDuration, - requestDuration, + renderDuration = renderDuration.toString(), + requestDuration = requestDuration.toString(), ), ) } diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index 78f6c55c..251f30e3 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -214,10 +214,11 @@ object Api { amount?.let { addQueryParameter("amount", amount.toString()) } if (!buyerCountry.isNullOrBlank()) addQueryParameter("buyer_country", buyerCountry) offer?.let { addQueryParameter("offer", it.name) } - }.build().toString() + }.build() - LogCat.debug(TAG, "createModalUrl: $url") - return url + val query = url.query?.replace("&", "\n ") + LogCat.debug(TAG, "createModalUrl:\n $url\n $query") + return url.toString() } internal fun createLoggerRequest(json: String): Request { diff --git a/library/src/main/java/com/paypal/messages/logger/CloudEvent.kt b/library/src/main/java/com/paypal/messages/logger/CloudEvent.kt index d5609d11..c43dd25c 100644 --- a/library/src/main/java/com/paypal/messages/logger/CloudEvent.kt +++ b/library/src/main/java/com/paypal/messages/logger/CloudEvent.kt @@ -20,7 +20,7 @@ data class CloudEvent( val data: TrackingPayload, ) { init { - val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") val currentDate = Date() val formattedDate = dateFormat.format(currentDate) diff --git a/library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt b/library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt index 05d8f044..e5f8cedf 100644 --- a/library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt +++ b/library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt @@ -17,7 +17,7 @@ data class TrackingComponent( val pageType: PayPalMessagePageType? = null, @SerializedName("buyer_country_code") val buyerCountryCode: String? = null, - @SerializedName("channel") + @SerializedName("presentment_channel") val channel: String? = "NATIVE", // Message Only diff --git a/library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt b/library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt index 3dda54f6..ee362164 100644 --- a/library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt +++ b/library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt @@ -6,9 +6,9 @@ data class TrackingEvent( @SerializedName("event_type") var eventType: EventType, @SerializedName("render_duration") - var renderDuration: Int? = null, + var renderDuration: String? = null, @SerializedName("request_duration") - var requestDuration: Int? = null, + var requestDuration: String? = null, @SerializedName("page_view_link_name") var pageViewLinkName: String? = null, @SerializedName("page_view_link_source") From a2e08b30a0846a0c3c4d6bb9238d3273fd0d909b Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:26:05 -0400 Subject: [PATCH 02/14] Rename Logger to AnalyticsLogger --- .../paypal/messagesdemo/JetpackActivity.kt | 2 +- .../com/paypal/messagesdemo/XmlActivity.kt | 2 +- .../AnalyticsLoggerTest.kt} | 20 +++---- .../java/com/paypal/messages/ModalFragment.kt | 30 +++++----- .../com/paypal/messages/PayPalMessageView.kt | 20 +++---- .../AnalyticsComponent.kt} | 6 +- .../AnalyticsEvent.kt} | 4 +- .../AnalyticsLogger.kt} | 18 +++--- .../AnalyticsPayload.kt} | 6 +- .../{logger => analytics}/CloudEvent.kt | 4 +- .../messages/analytics/ComponentType.kt | 11 ++++ .../{logger => analytics}/EventType.kt | 7 ++- .../analytics/IntegrationIdentifier.kt | 3 + .../main/java/com/paypal/messages/io/Api.kt | 13 ++--- .../paypal/messages/logger/ComponentType.kt | 6 -- .../messages/logger/IntegrationIdentifier.kt | 3 - .../AnalyticsComponentTest.kt} | 58 +++++++++---------- .../AnalyticsEventTest.kt} | 28 ++++----- .../AnalyticsPayloadTest.kt} | 36 ++++++------ .../{logger => analytics}/CloudEventTest.kt | 6 +- .../ComponentTypeTest.kt | 2 +- .../{logger => analytics}/EventTypeTest.kt | 2 +- 22 files changed, 148 insertions(+), 139 deletions(-) rename library/src/androidTest/java/com/paypal/messages/{logger/LoggerTest.kt => analytics/AnalyticsLoggerTest.kt} (79%) rename library/src/main/java/com/paypal/messages/{logger/TrackingComponent.kt => analytics/AnalyticsComponent.kt} (95%) rename library/src/main/java/com/paypal/messages/{logger/TrackingEvent.kt => analytics/AnalyticsEvent.kt} (90%) rename library/src/main/java/com/paypal/messages/{logger/Logger.kt => analytics/AnalyticsLogger.kt} (89%) rename library/src/main/java/com/paypal/messages/{logger/TrackingPayload.kt => analytics/AnalyticsPayload.kt} (89%) rename library/src/main/java/com/paypal/messages/{logger => analytics}/CloudEvent.kt (93%) create mode 100644 library/src/main/java/com/paypal/messages/analytics/ComponentType.kt rename library/src/main/java/com/paypal/messages/{logger => analytics}/EventType.kt (52%) create mode 100644 library/src/main/java/com/paypal/messages/analytics/IntegrationIdentifier.kt delete mode 100644 library/src/main/java/com/paypal/messages/logger/ComponentType.kt delete mode 100644 library/src/main/java/com/paypal/messages/logger/IntegrationIdentifier.kt rename library/src/test/java/com/paypal/messages/{logger/TrackingComponentTest.kt => analytics/AnalyticsComponentTest.kt} (64%) rename library/src/test/java/com/paypal/messages/{logger/TrackingEventTest.kt => analytics/AnalyticsEventTest.kt} (61%) rename library/src/test/java/com/paypal/messages/{logger/TrackingPayloadTest.kt => analytics/AnalyticsPayloadTest.kt} (64%) rename library/src/test/java/com/paypal/messages/{logger => analytics}/CloudEventTest.kt (95%) rename library/src/test/java/com/paypal/messages/{logger => analytics}/ComponentTypeTest.kt (88%) rename library/src/test/java/com/paypal/messages/{logger => analytics}/EventTypeTest.kt (95%) diff --git a/demo/src/main/java/com/paypal/messagesdemo/JetpackActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/JetpackActivity.kt index 5186a4f9..b114ca5b 100644 --- a/demo/src/main/java/com/paypal/messagesdemo/JetpackActivity.kt +++ b/demo/src/main/java/com/paypal/messagesdemo/JetpackActivity.kt @@ -1,6 +1,5 @@ package com.paypal.messagesdemo -import android.content.ContentValues.TAG import android.os.Bundle import android.util.Log import android.widget.Toast @@ -51,6 +50,7 @@ fun toSentenceCase(input: String): String { } class JetpackActivity : ComponentActivity() { + private val TAG = "PPM:JetpackActivity" private val environment = PayPalEnvironment.SANDBOX override fun onCreate(savedInstanceState: Bundle?) { diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt index 513830c9..70f59276 100644 --- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt +++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt @@ -23,7 +23,7 @@ import com.paypal.messagesdemo.databinding.ActivityMessageBinding class XmlActivity : AppCompatActivity() { private lateinit var binding: ActivityMessageBinding - private val TAG = "XmlActivity" + private val TAG = "PPM:XmlActivity" private var color: PayPalMessageColor = PayPalMessageColor.BLACK private var logoType: PayPalMessageLogoType = PayPalMessageLogoType.PRIMARY private var textAlign: PayPalMessageAlign = PayPalMessageAlign.LEFT diff --git a/library/src/androidTest/java/com/paypal/messages/logger/LoggerTest.kt b/library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt similarity index 79% rename from library/src/androidTest/java/com/paypal/messages/logger/LoggerTest.kt rename to library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt index bfc33768..a3310a7b 100644 --- a/library/src/androidTest/java/com/paypal/messages/logger/LoggerTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import android.content.Context import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -12,10 +12,10 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class LoggerTest { +class AnalyticsLoggerTest { private lateinit var context: Context - private lateinit var logger: Logger - private lateinit var component: TrackingComponent + private lateinit var analyticsLogger: AnalyticsLogger + private lateinit var component: AnalyticsComponent @Before fun setUp() { @@ -29,8 +29,8 @@ class LoggerTest { "test_device_id", "test_session_id", ) - logger = Logger.getInstance("test_client_id") - component = TrackingComponent( + analyticsLogger = AnalyticsLogger.getInstance("test_client_id") + component = AnalyticsComponent( instanceId = "test_instance_id", type = "test_type", componentEvents = mutableListOf(), @@ -39,15 +39,15 @@ class LoggerTest { @Test fun testGetInstance() { - assertNotNull(logger) + assertNotNull(analyticsLogger) } @Test fun testLog() { - component.componentEvents.add(TrackingEvent(EventType.MESSAGE_CLICK)) - logger.log(context, component) + component.componentEvents.add(AnalyticsEvent(EventType.MESSAGE_CLICK)) + analyticsLogger.log(context, component) - val payload = logger.payload + val payload = analyticsLogger.payload assertNotNull(payload) payload?.run { assertEquals("test_client_id", payload.clientId) diff --git a/library/src/main/java/com/paypal/messages/ModalFragment.kt b/library/src/main/java/com/paypal/messages/ModalFragment.kt index 5314571a..b7ae4007 100644 --- a/library/src/main/java/com/paypal/messages/ModalFragment.kt +++ b/library/src/main/java/com/paypal/messages/ModalFragment.kt @@ -30,17 +30,17 @@ import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.gson.Gson import com.google.gson.JsonParser +import com.paypal.messages.analytics.AnalyticsComponent +import com.paypal.messages.analytics.AnalyticsEvent +import com.paypal.messages.analytics.AnalyticsLogger +import com.paypal.messages.analytics.ComponentType +import com.paypal.messages.analytics.EventType import com.paypal.messages.config.Channel import com.paypal.messages.config.modal.ModalCloseButton import com.paypal.messages.config.modal.ModalConfig import com.paypal.messages.extensions.dp import com.paypal.messages.extensions.jsonElementToMutableMap import com.paypal.messages.io.Api -import com.paypal.messages.logger.ComponentType -import com.paypal.messages.logger.EventType -import com.paypal.messages.logger.Logger -import com.paypal.messages.logger.TrackingComponent -import com.paypal.messages.logger.TrackingEvent import com.paypal.messages.utils.LogCat import com.paypal.messages.utils.PayPalErrors import java.net.URI @@ -119,7 +119,7 @@ internal class ModalFragment( closeButton.background.colorFilter = PorterDuffColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP) closeButton?.setOnClickListener { - logEvent(TrackingEvent(eventType = EventType.MODAL_CLOSE)) + logEvent(AnalyticsEvent(eventType = EventType.MODAL_CLOSE)) dialog?.hide() } @@ -283,7 +283,7 @@ internal class ModalFragment( inErrorState = true this.onError(PayPalErrors.ModalFailedToLoad(errorDescription)) logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MODAL_ERROR, errorName = errorName, errorDescription = errorDescription, @@ -303,7 +303,7 @@ internal class ModalFragment( inErrorState = true this.onError(PayPalErrors.ModalFailedToLoad(errorDescription)) logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MODAL_ERROR, errorName = errorName, errorDescription = errorDescription, @@ -325,7 +325,7 @@ internal class ModalFragment( // This function is called when the modal is usually already instantiated override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - logEvent(TrackingEvent(eventType = EventType.MODAL_OPEN)) + logEvent(AnalyticsEvent(eventType = EventType.MODAL_OPEN)) this.onLoading() val url = Api.createModalUrl(clientId, amount, buyerCountry, offerType) @@ -353,7 +353,7 @@ internal class ModalFragment( }.toInt() logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MODAL_RENDER, renderDuration = renderDuration.toString(), requestDuration = requestDuration.toString(), @@ -387,7 +387,7 @@ internal class ModalFragment( this.onClick() } logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MODAL_CLICK, pageViewLinkSource = pageViewLinkSource, pageViewLinkName = pageViewLinkName, @@ -400,7 +400,7 @@ internal class ModalFragment( val calculatorAmount = args.get("amount")?.asString this.onCalculate() logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MODAL_CLICK, data = "$calculatorAmount", ), @@ -427,8 +427,8 @@ internal class ModalFragment( var onClick: () -> Unit = {} private var onClose: () -> Unit = {} - private fun logEvent(event: TrackingEvent, dynamicKeys: MutableMap? = null) { - val component = TrackingComponent( + private fun logEvent(event: AnalyticsEvent, dynamicKeys: MutableMap? = null) { + val component = AnalyticsComponent( amount = this.amount.toString(), buyerCountryCode = this.buyerCountry, type = ComponentType.MODAL.toString(), @@ -437,6 +437,6 @@ internal class ModalFragment( __shared__ = dynamicKeys, ) - context?.let { Logger.getInstance(clientId = clientId).log(it, component) } + context?.let { AnalyticsLogger.getInstance(clientId = clientId).log(it, component) } } } diff --git a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt index 013b92c5..56159a4b 100644 --- a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt +++ b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt @@ -19,6 +19,11 @@ import androidx.core.content.ContextCompat import androidx.core.content.res.getFloatOrThrow import androidx.core.content.res.getIntOrThrow import androidx.core.content.res.use +import com.paypal.messages.analytics.AnalyticsComponent +import com.paypal.messages.analytics.AnalyticsEvent +import com.paypal.messages.analytics.AnalyticsLogger +import com.paypal.messages.analytics.ComponentType +import com.paypal.messages.analytics.EventType import com.paypal.messages.config.PayPalEnvironment import com.paypal.messages.config.ProductGroup import com.paypal.messages.config.modal.ModalConfig @@ -27,11 +32,6 @@ import com.paypal.messages.io.Api import com.paypal.messages.io.ApiMessageData import com.paypal.messages.io.ApiResult import com.paypal.messages.io.OnActionCompleted -import com.paypal.messages.logger.ComponentType -import com.paypal.messages.logger.EventType -import com.paypal.messages.logger.Logger -import com.paypal.messages.logger.TrackingComponent -import com.paypal.messages.logger.TrackingEvent import com.paypal.messages.utils.LogCat import com.paypal.messages.utils.PayPalErrors import kotlinx.coroutines.CoroutineScope @@ -473,7 +473,7 @@ class PayPalMessageView @JvmOverloads constructor( // Log that we successfully rendered the message logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MESSAGE_RENDER, renderDuration = renderDuration.toString(), requestDuration = requestDuration.toString(), @@ -504,7 +504,7 @@ class PayPalMessageView @JvmOverloads constructor( onClick.invoke() // Log Message Click logEvent( - TrackingEvent( + AnalyticsEvent( eventType = EventType.MESSAGE_CLICK, pageViewLinkName = "banner_wrapper", pageViewLinkSource = "message", @@ -649,9 +649,9 @@ class PayPalMessageView @JvmOverloads constructor( ) } - private fun logEvent(event: TrackingEvent) { + private fun logEvent(event: AnalyticsEvent) { // Build component Information - val component = TrackingComponent( + val component = AnalyticsComponent( offerType = this.offerType, amount = this.amount.toString(), pageType = this.pageType, @@ -672,6 +672,6 @@ class PayPalMessageView @JvmOverloads constructor( componentEvents = mutableListOf(event), ) - Logger.getInstance(clientId = clientID).log(context, component) + AnalyticsLogger.getInstance(clientId = clientID).log(context, component) } } diff --git a/library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt b/library/src/main/java/com/paypal/messages/analytics/AnalyticsComponent.kt similarity index 95% rename from library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt rename to library/src/main/java/com/paypal/messages/analytics/AnalyticsComponent.kt index e5f8cedf..bb1cc417 100644 --- a/library/src/main/java/com/paypal/messages/logger/TrackingComponent.kt +++ b/library/src/main/java/com/paypal/messages/analytics/AnalyticsComponent.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.annotations.SerializedName import com.paypal.messages.config.PayPalMessageOfferType @@ -7,7 +7,7 @@ import com.paypal.messages.config.message.style.PayPalMessageAlign import com.paypal.messages.config.message.style.PayPalMessageColor import com.paypal.messages.config.message.style.PayPalMessageLogoType -data class TrackingComponent( +data class AnalyticsComponent( // Integration Details @SerializedName("offer_type") val offerType: PayPalMessageOfferType? = null, @@ -62,7 +62,7 @@ data class TrackingComponent( @SerializedName("session_id") val sessionId: String? = null, @SerializedName("component_events") - val componentEvents: MutableList, + val componentEvents: MutableList, // Dynamic Properties, not serialized by default @Suppress("PropertyName") diff --git a/library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt b/library/src/main/java/com/paypal/messages/analytics/AnalyticsEvent.kt similarity index 90% rename from library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt rename to library/src/main/java/com/paypal/messages/analytics/AnalyticsEvent.kt index ee362164..9d3468b4 100644 --- a/library/src/main/java/com/paypal/messages/logger/TrackingEvent.kt +++ b/library/src/main/java/com/paypal/messages/analytics/AnalyticsEvent.kt @@ -1,8 +1,8 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.annotations.SerializedName -data class TrackingEvent( +data class AnalyticsEvent( @SerializedName("event_type") var eventType: EventType, @SerializedName("render_duration") diff --git a/library/src/main/java/com/paypal/messages/logger/Logger.kt b/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt similarity index 89% rename from library/src/main/java/com/paypal/messages/logger/Logger.kt rename to library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt index a1b1a2f6..3c269a19 100644 --- a/library/src/main/java/com/paypal/messages/logger/Logger.kt +++ b/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import android.content.Context import com.paypal.messages.config.GlobalAnalytics @@ -13,29 +13,29 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.UUID -class Logger private constructor() { +class AnalyticsLogger private constructor() { private val uuidSessionId = UUID.randomUUID().toString() companion object { private const val TAG: String = "Logger" @Volatile - private var instance: Logger? = null + private var instance: AnalyticsLogger? = null private lateinit var clientId: String - fun getInstance(clientId: String = ""): Logger { + fun getInstance(clientId: String = ""): AnalyticsLogger { LogCat.debug(TAG, "getInstance clientId: $clientId") this.clientId = clientId return instance ?: synchronized(this) { if (instance == null) { - instance = Logger() + instance = AnalyticsLogger() } instance!! } } } - internal var payload: TrackingPayload? = null + internal var payload: AnalyticsPayload? = null private set // When we instantiate our class for the first time, there are some global vars we can set right @@ -47,7 +47,7 @@ class Logger private constructor() { private fun resetBasePayload(isInit: Boolean = false) { LogCat.debug(TAG, if (isInit) "initBasePayload" else "resetBasePayload") val sessionId = GlobalAnalytics.sessionId - this.payload = TrackingPayload( + this.payload = AnalyticsPayload( clientId = clientId, merchantId = null, partnerAttributionId = null, @@ -74,7 +74,7 @@ class Logger private constructor() { // Need to be able to append multiple events to a single payload, adding a modal event could // add additional shared fields to the component level object - fun log(context: Context, component: TrackingComponent) { + fun log(context: Context, component: AnalyticsComponent) { // We have a component level scoped payload, that we need to add to our request. // First we determine if this is a new component or not // IF it is, we add it to our base payload with no issues @@ -106,7 +106,7 @@ class Logger private constructor() { } private var job: Job? = null - private fun sendEvent(context: Context, finalPayload: TrackingPayload) { + private fun sendEvent(context: Context, finalPayload: AnalyticsPayload) { job?.cancel() job = CoroutineScope(Dispatchers.IO).launch { delay(5000) // Wait 5 seconds before sending our payload diff --git a/library/src/main/java/com/paypal/messages/logger/TrackingPayload.kt b/library/src/main/java/com/paypal/messages/analytics/AnalyticsPayload.kt similarity index 89% rename from library/src/main/java/com/paypal/messages/logger/TrackingPayload.kt rename to library/src/main/java/com/paypal/messages/analytics/AnalyticsPayload.kt index 3299331d..7726dfac 100644 --- a/library/src/main/java/com/paypal/messages/logger/TrackingPayload.kt +++ b/library/src/main/java/com/paypal/messages/analytics/AnalyticsPayload.kt @@ -1,10 +1,10 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.annotations.SerializedName import com.paypal.messages.BuildConfig import java.util.UUID -data class TrackingPayload( +data class AnalyticsPayload( // Integration Details @SerializedName("client_id") val clientId: String, @@ -32,5 +32,5 @@ data class TrackingPayload( val libraryVersion: String = BuildConfig.LIBRARY_VERSION, // Event Groups @SerializedName("components") - val components: MutableList, + val components: MutableList, ) diff --git a/library/src/main/java/com/paypal/messages/logger/CloudEvent.kt b/library/src/main/java/com/paypal/messages/analytics/CloudEvent.kt similarity index 93% rename from library/src/main/java/com/paypal/messages/logger/CloudEvent.kt rename to library/src/main/java/com/paypal/messages/analytics/CloudEvent.kt index c43dd25c..9fe9ca79 100644 --- a/library/src/main/java/com/paypal/messages/logger/CloudEvent.kt +++ b/library/src/main/java/com/paypal/messages/analytics/CloudEvent.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.annotations.SerializedName import java.text.SimpleDateFormat @@ -17,7 +17,7 @@ data class CloudEvent( @SerializedName("dataschema") val dataSchema: String = "ppaas:events.credit.FinancingPresentmentAsyncAPISpecification/v1/schema/json/credit_upstream_presentment_event.json", var time: String = "", - val data: TrackingPayload, + val data: AnalyticsPayload, ) { init { val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") diff --git a/library/src/main/java/com/paypal/messages/analytics/ComponentType.kt b/library/src/main/java/com/paypal/messages/analytics/ComponentType.kt new file mode 100644 index 00000000..82297eee --- /dev/null +++ b/library/src/main/java/com/paypal/messages/analytics/ComponentType.kt @@ -0,0 +1,11 @@ +package com.paypal.messages.analytics + +enum class ComponentType { + MODAL, + MESSAGE, + ; + + override fun toString(): String { + return super.toString().lowercase() + } +} diff --git a/library/src/main/java/com/paypal/messages/logger/EventType.kt b/library/src/main/java/com/paypal/messages/analytics/EventType.kt similarity index 52% rename from library/src/main/java/com/paypal/messages/logger/EventType.kt rename to library/src/main/java/com/paypal/messages/analytics/EventType.kt index e343f6f4..8b2c4fba 100644 --- a/library/src/main/java/com/paypal/messages/logger/EventType.kt +++ b/library/src/main/java/com/paypal/messages/analytics/EventType.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics enum class EventType { MESSAGE_RENDER, @@ -8,4 +8,9 @@ enum class EventType { MODAL_OPEN, MODAL_CLOSE, MODAL_ERROR, + ; + + override fun toString(): String { + return super.toString().lowercase() + } } diff --git a/library/src/main/java/com/paypal/messages/analytics/IntegrationIdentifier.kt b/library/src/main/java/com/paypal/messages/analytics/IntegrationIdentifier.kt new file mode 100644 index 00000000..342c813b --- /dev/null +++ b/library/src/main/java/com/paypal/messages/analytics/IntegrationIdentifier.kt @@ -0,0 +1,3 @@ +package com.paypal.messages.analytics + +enum class IntegrationIdentifier diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index 251f30e3..db5c358b 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -1,10 +1,10 @@ package com.paypal.messages.io import android.content.Context -import com.google.gson.Gson +import com.google.gson.GsonBuilder import com.paypal.messages.BuildConfig -import com.paypal.messages.logger.CloudEvent -import com.paypal.messages.logger.TrackingPayload +import com.paypal.messages.analytics.AnalyticsPayload +import com.paypal.messages.analytics.CloudEvent import com.paypal.messages.utils.LogCat import com.paypal.messages.utils.PayPalErrors import kotlinx.coroutines.CoroutineScope @@ -26,7 +26,7 @@ import com.paypal.messages.config.message.PayPalMessageConfig as MessageConfig object Api { private const val TAG = "Api" private val client = OkHttpClient() - private val gson = Gson() + private val gson = GsonBuilder().setPrettyPrinting().create() var env = Env.SANDBOX var devTouchpoint: Boolean = false var ignoreCache: Boolean = false @@ -92,9 +92,8 @@ object Api { if (code != 200) return ApiResult.Failure(PayPalErrors.FailedToFetchDataException("Code was $code")) - val bodyJsonNoFdata = bodyJson?.replace(""""fdata":".*?"""".toRegex(), "") - LogCat.debug(TAG, "callMessageDataEndpoint response: $bodyJsonNoFdata") val body = gson.fromJson(bodyJson, ApiMessageData.Response::class.java) + LogCat.debug(TAG, "callMessageDataEndpoint response: ${gson.toJson(body)}") val isValidResponse = body?.content != null && body.meta != null return if (isValidResponse) { @@ -281,7 +280,7 @@ object Api { return jsonObject.toString() } - fun callLoggerEndpoint(payload: TrackingPayload) { + fun callLoggerEndpoint(payload: AnalyticsPayload) { val json = gson.toJson(CloudEvent(data = payload)) val request = createLoggerRequest(preventEmptyValues(json)) val response = client.newCall(request).execute() diff --git a/library/src/main/java/com/paypal/messages/logger/ComponentType.kt b/library/src/main/java/com/paypal/messages/logger/ComponentType.kt deleted file mode 100644 index 7c503fb2..00000000 --- a/library/src/main/java/com/paypal/messages/logger/ComponentType.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.paypal.messages.logger - -enum class ComponentType { - MODAL, - MESSAGE, -} diff --git a/library/src/main/java/com/paypal/messages/logger/IntegrationIdentifier.kt b/library/src/main/java/com/paypal/messages/logger/IntegrationIdentifier.kt deleted file mode 100644 index 1024f221..00000000 --- a/library/src/main/java/com/paypal/messages/logger/IntegrationIdentifier.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.paypal.messages.logger - -enum class IntegrationIdentifier diff --git a/library/src/test/java/com/paypal/messages/logger/TrackingComponentTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt similarity index 64% rename from library/src/test/java/com/paypal/messages/logger/TrackingComponentTest.kt rename to library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt index 18360d75..34c29377 100644 --- a/library/src/test/java/com/paypal/messages/logger/TrackingComponentTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.Gson import com.paypal.messages.config.PayPalMessageOfferType @@ -9,7 +9,7 @@ import com.paypal.messages.config.message.style.PayPalMessageLogoType import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test -class TrackingComponentTest { +class AnalyticsComponentTest { private val offerType = PayPalMessageOfferType.PAY_LATER_SHORT_TERM private val amount = "100.00" private val pageType = PayPalMessagePageType.CART @@ -33,9 +33,9 @@ class TrackingComponentTest { private val instanceId = "test_instance_id" private val originatingInstanceId = "test_originating_instance_id" private val sessionId = "test_session_id" - private val componentEvents = mutableListOf(TrackingEvent(EventType.MESSAGE_CLICK)) + private val componentEvents = mutableListOf(AnalyticsEvent(EventType.MESSAGE_CLICK)) - private val trackingComponent = TrackingComponent( + private val analyticsComponent = AnalyticsComponent( offerType = offerType, amount = amount, pageType = pageType, @@ -64,36 +64,36 @@ class TrackingComponentTest { @Test fun testConstructor() { - assertEquals(offerType, trackingComponent.offerType) - assertEquals(amount, trackingComponent.amount) - assertEquals(pageType, trackingComponent.pageType) - assertEquals(buyerCountryCode, trackingComponent.buyerCountryCode) - assertEquals(channel, trackingComponent.channel) - assertEquals(styleLogoType, trackingComponent.styleLogoType) - assertEquals(styleColor, trackingComponent.styleColor) - assertEquals(styleTextAlign, trackingComponent.styleTextAlign) - assertEquals(messageType, trackingComponent.messageType) - assertEquals(views, trackingComponent.views) - assertEquals(qualifiedProducts, trackingComponent.qualifiedProducts) - assertEquals(integrationIdentifier, trackingComponent.integrationIdentifier) - assertEquals(fdata, trackingComponent.fdata) - assertEquals(debugId, trackingComponent.debugId) - assertEquals(experimentationExperienceIds, trackingComponent.experimentationExperienceIds) - assertEquals(experimentationTreatmentIds, trackingComponent.experimentationTreatmentIds) - assertEquals(creditProductIdentifiers, trackingComponent.creditProductIdentifiers) - assertEquals(offerCountryCode, trackingComponent.offerCountryCode) - assertEquals(merchantCountryCode, trackingComponent.merchantCountryCode) - assertEquals(type, trackingComponent.type) - assertEquals(instanceId, trackingComponent.instanceId) - assertEquals(originatingInstanceId, trackingComponent.originatingInstanceId) - assertEquals(sessionId, trackingComponent.sessionId) - assertEquals(componentEvents, trackingComponent.componentEvents) + assertEquals(offerType, analyticsComponent.offerType) + assertEquals(amount, analyticsComponent.amount) + assertEquals(pageType, analyticsComponent.pageType) + assertEquals(buyerCountryCode, analyticsComponent.buyerCountryCode) + assertEquals(channel, analyticsComponent.channel) + assertEquals(styleLogoType, analyticsComponent.styleLogoType) + assertEquals(styleColor, analyticsComponent.styleColor) + assertEquals(styleTextAlign, analyticsComponent.styleTextAlign) + assertEquals(messageType, analyticsComponent.messageType) + assertEquals(views, analyticsComponent.views) + assertEquals(qualifiedProducts, analyticsComponent.qualifiedProducts) + assertEquals(integrationIdentifier, analyticsComponent.integrationIdentifier) + assertEquals(fdata, analyticsComponent.fdata) + assertEquals(debugId, analyticsComponent.debugId) + assertEquals(experimentationExperienceIds, analyticsComponent.experimentationExperienceIds) + assertEquals(experimentationTreatmentIds, analyticsComponent.experimentationTreatmentIds) + assertEquals(creditProductIdentifiers, analyticsComponent.creditProductIdentifiers) + assertEquals(offerCountryCode, analyticsComponent.offerCountryCode) + assertEquals(merchantCountryCode, analyticsComponent.merchantCountryCode) + assertEquals(type, analyticsComponent.type) + assertEquals(instanceId, analyticsComponent.instanceId) + assertEquals(originatingInstanceId, analyticsComponent.originatingInstanceId) + assertEquals(sessionId, analyticsComponent.sessionId) + assertEquals(componentEvents, analyticsComponent.componentEvents) } @Test fun testSerialization() { val gson = Gson() - val json = gson.toJson(trackingComponent) + val json = gson.toJson(analyticsComponent) @Suppress("ktlint:standard:max-line-length") val expectedJson = """{"offer_type":"PAY_LATER_SHORT_TERM","amount":"100.00","page_type":"CART","buyer_country_code":"US","channel":"NATIVE","style_logo_type":"ALTERNATIVE","style_color":"MONOCHROME","style_text_align":"CENTER","message_type":"OFFER","views":["VIEW"],"qualified_products":["PRODUCT"],"fdata":"test_fdata","debug_id":"test_debug_id","experimentation_experience_ids":["EXP_1","EXP_2"],"experimentation_treatment_ids":["TRT_1","TRT_2"],"credit_product_identifiers":["CPI_1","CPI_2"],"offer_country_code":"US","merchant_country_code":"US","type":"OFFER","instance_id":"test_instance_id","originating_instance_id":"test_originating_instance_id","session_id":"test_session_id","component_events":[{"event_type":"MESSAGE_CLICK"}],"__shared__":{}}""" diff --git a/library/src/test/java/com/paypal/messages/logger/TrackingEventTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt similarity index 61% rename from library/src/test/java/com/paypal/messages/logger/TrackingEventTest.kt rename to library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt index 96b3a053..a1d79170 100644 --- a/library/src/test/java/com/paypal/messages/logger/TrackingEventTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt @@ -1,20 +1,20 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.Gson import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test -class TrackingEventTest { +class AnalyticsEventTest { private val eventType = EventType.MESSAGE_CLICK - private val renderDuration = 100 - private val requestDuration = 200 + private val renderDuration = "100" + private val requestDuration = "200" private val pageViewLinkName = "test_link_name" private val pageViewLinkSource = "test_link_src" private val data = "test_data" private val errorName = "test_error_name" private val errorDescription = "test_error_description" - private val trackingEvent = TrackingEvent( + private val analyticsEvent = AnalyticsEvent( eventType = eventType, renderDuration = renderDuration, requestDuration = requestDuration, @@ -27,20 +27,20 @@ class TrackingEventTest { @Test fun testConstructor() { - assertEquals(eventType, trackingEvent.eventType) - assertEquals(renderDuration, trackingEvent.renderDuration) - assertEquals(requestDuration, trackingEvent.requestDuration) - assertEquals(pageViewLinkName, trackingEvent.pageViewLinkName) - assertEquals(pageViewLinkSource, trackingEvent.pageViewLinkSource) - assertEquals(data, trackingEvent.data) - assertEquals(errorName, trackingEvent.errorName) - assertEquals(errorDescription, trackingEvent.errorDescription) + assertEquals(eventType, analyticsEvent.eventType) + assertEquals(renderDuration, analyticsEvent.renderDuration) + assertEquals(requestDuration, analyticsEvent.requestDuration) + assertEquals(pageViewLinkName, analyticsEvent.pageViewLinkName) + assertEquals(pageViewLinkSource, analyticsEvent.pageViewLinkSource) + assertEquals(data, analyticsEvent.data) + assertEquals(errorName, analyticsEvent.errorName) + assertEquals(errorDescription, analyticsEvent.errorDescription) } @Test fun testSerialization() { val gson = Gson() - val json = gson.toJson(trackingEvent) + val json = gson.toJson(analyticsEvent) @Suppress("ktlint:standard:max-line-length") val expectedJson = """{"event_type":"MESSAGE_CLICK","render_duration":100,"request_duration":200,"page_view_link_name":"test_link_name","page_view_link_source":"test_link_src","data":"test_data","error_name":"test_error_name","error_description":"test_error_description"}""" diff --git a/library/src/test/java/com/paypal/messages/logger/TrackingPayloadTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt similarity index 64% rename from library/src/test/java/com/paypal/messages/logger/TrackingPayloadTest.kt rename to library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt index 8858778d..86346296 100644 --- a/library/src/test/java/com/paypal/messages/logger/TrackingPayloadTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt @@ -1,10 +1,10 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.Gson import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test -class TrackingPayloadTest { +class AnalyticsPayloadTest { private val clientId = "test_client_id" private val merchantId = "test_merchant_id" private val partnerAttributionId = "test_partner_attribution_id" @@ -16,9 +16,9 @@ class TrackingPayloadTest { private val integrationType = "test_integration_type" private val integrationVersion = "test_integration_version" private val libraryVersion = "test_library_version" - private val components = mutableListOf() + private val components = mutableListOf() - private val trackingPayload = TrackingPayload( + private val analyticsPayload = AnalyticsPayload( clientId = clientId, merchantId = merchantId, partnerAttributionId = partnerAttributionId, @@ -32,27 +32,27 @@ class TrackingPayloadTest { libraryVersion = libraryVersion, components = components, ) - + @Test fun testConstructor() { - assertEquals(clientId, trackingPayload.clientId) - assertEquals(merchantId, trackingPayload.merchantId) - assertEquals(partnerAttributionId, trackingPayload.partnerAttributionId) - assertEquals(merchantProfileHash, trackingPayload.merchantProfileHash) - assertEquals(deviceId, trackingPayload.deviceId) - assertEquals(sessionId, trackingPayload.sessionId) - assertEquals(instanceId, trackingPayload.instanceId) - assertEquals(integrationName, trackingPayload.integrationName) - assertEquals(integrationType, trackingPayload.integrationType) - assertEquals(integrationVersion, trackingPayload.integrationVersion) - assertEquals(libraryVersion, trackingPayload.libraryVersion) - assertEquals(components, trackingPayload.components) + assertEquals(clientId, analyticsPayload.clientId) + assertEquals(merchantId, analyticsPayload.merchantId) + assertEquals(partnerAttributionId, analyticsPayload.partnerAttributionId) + assertEquals(merchantProfileHash, analyticsPayload.merchantProfileHash) + assertEquals(deviceId, analyticsPayload.deviceId) + assertEquals(sessionId, analyticsPayload.sessionId) + assertEquals(instanceId, analyticsPayload.instanceId) + assertEquals(integrationName, analyticsPayload.integrationName) + assertEquals(integrationType, analyticsPayload.integrationType) + assertEquals(integrationVersion, analyticsPayload.integrationVersion) + assertEquals(libraryVersion, analyticsPayload.libraryVersion) + assertEquals(components, analyticsPayload.components) } @Test fun testSerialization() { val gson = Gson() - val json = gson.toJson(trackingPayload) + val json = gson.toJson(analyticsPayload) @Suppress("ktlint:standard:max-line-length") val expectedJson = """{"client_id":"test_client_id","merchant_id":"test_merchant_id","partner_attribution_id":"test_partner_attribution_id","merchant_profile_hash":"test_merchant_profile_hash","device_id":"test_device_id","session_id":"test_session_id","instance_id":"test_instance_id","integration_name":"test_integration_name","integration_type":"test_integration_type","integration_version":"test_integration_version","lib_version":"test_library_version","components":[]}""" diff --git a/library/src/test/java/com/paypal/messages/logger/CloudEventTest.kt b/library/src/test/java/com/paypal/messages/analytics/CloudEventTest.kt similarity index 95% rename from library/src/test/java/com/paypal/messages/logger/CloudEventTest.kt rename to library/src/test/java/com/paypal/messages/analytics/CloudEventTest.kt index 89c9300c..8372a56d 100644 --- a/library/src/test/java/com/paypal/messages/logger/CloudEventTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/CloudEventTest.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import com.google.gson.Gson import org.junit.jupiter.api.Assertions.assertEquals @@ -16,7 +16,7 @@ class CloudEventTest { private val integrationType = "test_integration_type" private val integrationVersion = "test_integration_version" private val libraryVersion = "test_library_version" - private val components = mutableListOf() + private val components = mutableListOf() private val specVersion = "1.0" private val type = "com.paypal.credit.upstream-presentment.v1" private val source = "urn:paypal:event-src:v1:android:messages" @@ -25,7 +25,7 @@ class CloudEventTest { @Suppress("ktlint:standard:max-line-length") private val dataSchema = "ppaas:events.credit.FinancingPresentmentAsyncAPISpecification/v1/schema/json/credit_upstream_presentment_event.json" - private val data = TrackingPayload( + private val data = AnalyticsPayload( clientId = clientId, merchantId = merchantId, partnerAttributionId = partnerAttributionId, diff --git a/library/src/test/java/com/paypal/messages/logger/ComponentTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt similarity index 88% rename from library/src/test/java/com/paypal/messages/logger/ComponentTypeTest.kt rename to library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt index cf5befca..5ba196ff 100644 --- a/library/src/test/java/com/paypal/messages/logger/ComponentTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test diff --git a/library/src/test/java/com/paypal/messages/logger/EventTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt similarity index 95% rename from library/src/test/java/com/paypal/messages/logger/EventTypeTest.kt rename to library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt index e9f528bc..648531f6 100644 --- a/library/src/test/java/com/paypal/messages/logger/EventTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.logger +package com.paypal.messages.analytics import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test From 3aca8406825493cf4a7adcb749a6bf3d60c7e09b Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Fri, 12 Apr 2024 09:09:20 -0400 Subject: [PATCH 03/14] Add messages to assertTrues --- .../paypal/messages/PayPalMessageViewTest.kt | 15 +- .../messages/analytics/AnalyticsLoggerTest.kt | 6 +- .../java/com/paypal/messages/io/ApiTest.kt | 168 ++++++++++++------ .../paypal/messages/io/LocalStorageTest.kt | 2 +- .../java/com/paypal/messages/ModalFragment.kt | 10 +- .../com/paypal/messages/PayPalMessageView.kt | 4 +- .../paypal/messages/analytics/EventType.kt | 12 +- .../analytics/AnalyticsComponentTest.kt | 33 +++- .../messages/analytics/AnalyticsEventTest.kt | 2 +- .../messages/analytics/EventTypeTest.kt | 12 +- .../messages/config/PayPalEnvironmentTest.kt | 8 +- .../paypal/messages/extensions/GsonTest.kt | 10 +- .../com/paypal/messages/io/ApiResultTest.kt | 5 +- .../paypal/messages/utils/PayPalErrorsTest.kt | 33 +++- 14 files changed, 220 insertions(+), 100 deletions(-) diff --git a/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt b/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt index 828ddcb4..28892421 100644 --- a/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt @@ -68,8 +68,14 @@ class PayPalMessageViewTest { payPalMessageView.onActionCompleted(ApiResult.Success(response)) val messageTextView = payPalMessageView.findViewById(R.id.content) - assertTrue(messageTextView.text.toString().contains(defaultMain)) - assertTrue(messageTextView.text.toString().contains(defaultDisclaimer)) + assertTrue( + "text does not contain defaultMain value: $defaultMain", + messageTextView.text.toString().contains(defaultMain), + ) + assertTrue( + "text does not contain defaultDisclaimer value: $defaultDisclaimer", + messageTextView.text.toString().contains(defaultDisclaimer), + ) } @Test @@ -89,7 +95,10 @@ class PayPalMessageViewTest { config.viewStateCallbacks = PayPalMessageViewStateCallbacks(onLoading = emptyFunction) config.eventsCallbacks = PayPalMessageEventsCallbacks(onClick = emptyFunction) - assertTrue(payPalMessageView.getConfig().data.amount!!.equals(100.00)) + assertTrue( + "amount does not equal 100.00", + payPalMessageView.getConfig().data.amount!!.equals(100.00), + ) assertFalse(payPalMessageView.getConfig().viewStateCallbacks?.onLoading == emptyFunction) assertFalse(payPalMessageView.getConfig().eventsCallbacks?.onClick == emptyFunction) } diff --git a/library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt b/library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt index a3310a7b..f9b47994 100644 --- a/library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/analytics/AnalyticsLoggerTest.kt @@ -6,7 +6,6 @@ import androidx.test.platform.app.InstrumentationRegistry import com.paypal.messages.config.message.PayPalMessageConfig import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -44,14 +43,13 @@ class AnalyticsLoggerTest { @Test fun testLog() { - component.componentEvents.add(AnalyticsEvent(EventType.MESSAGE_CLICK)) + component.componentEvents.add(AnalyticsEvent(EventType.MESSAGE_CLICKED)) analyticsLogger.log(context, component) val payload = analyticsLogger.payload assertNotNull(payload) payload?.run { assertEquals("test_client_id", payload.clientId) - assertTrue(payload.sessionId != "") assertEquals("test_integration_name", payload.integrationName) assertEquals("test_integration_version", payload.integrationVersion) assertEquals("test_device_id", payload.deviceId) @@ -61,7 +59,7 @@ class AnalyticsLoggerTest { assertEquals("test_type", payload.components[0].type) assertEquals("test_instance_id", payload.components[0].instanceId) assertEquals(1, payload.components[0].componentEvents.size) - assertEquals(EventType.MESSAGE_CLICK, payload.components[0].componentEvents[0].eventType) + assertEquals(EventType.MESSAGE_CLICKED, payload.components[0].componentEvents[0].eventType) } } } diff --git a/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt b/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt index 5ef40e6b..96397881 100644 --- a/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt @@ -69,17 +69,22 @@ class ApiTest { val url = messageDataRequest.url.toString() val expectedPath = "credit-presentment/native/message" + assertTrue( + "url does not contain expectedPath value: $expectedPath", + url.contains(expectedPath), + ) + val expectedQueryParts = arrayOf( "client_id=test_client_id", "instance_id", ) + expectedQueryParts.forEach { assertTrue("url does not contain $it", url.contains(it)) } - assertTrue(url.contains(expectedPath)) - assertTrue(url.contains("client_id=test_client_id")) - assertFalse(url.contains("devTouchpoint=false")) - assertFalse(url.contains("ignore_cache=false")) - assertTrue(url.contains("instance_id")) - expectedQueryParts.forEach { assertTrue(url.contains(it)) } + val notExpectedQueryParts = arrayOf( + "dev_touchpoint=false", + "ignore_cache=false", + ) + notExpectedQueryParts.forEach { assertFalse("url contains $it", url.contains(it)) } } @Test @@ -98,6 +103,11 @@ class ApiTest { val url = messageDataRequest.url.toString() val expectedPath = "credit-presentment/native/message" + assertTrue( + "url does not contain expectedPath value: $expectedPath", + url.contains(expectedPath), + ) + val expectedQueryParts = arrayOf( "client_id=test_client_id", "instance_id", @@ -107,16 +117,7 @@ class ApiTest { "offer=PAY_LATER_PAY_IN_1", "merchant_config=hash", ) - - assertTrue(url.contains(expectedPath)) - assertTrue(url.contains("client_id=test_client_id")) - assertTrue(url.contains("instance_id")) - assertTrue(url.contains("session_id")) // - assertTrue(url.contains("amount=1.0")) - assertTrue(url.contains("buyer_country=US")) - assertTrue(url.contains("offer=PAY_LATER_PAY_IN_1")) - assertTrue(url.contains("merchant_config=hash")) - expectedQueryParts.forEach { assertTrue(url.contains(it)) } + expectedQueryParts.forEach { assertTrue("url does not contain $it", url.contains(it)) } } @OptIn(ExperimentalCoroutinesApi::class) @@ -133,10 +134,19 @@ class ApiTest { launch { val result = Api.callMessageDataEndpoint(messageConfig, null, instanceId) - assertTrue(result is ApiResult.Failure<*>) + assertTrue( + "result is not ApiResult.Failure", + result is ApiResult.Failure<*>, + ) val error = (result as ApiResult.Failure<*>).error - assertTrue(error is PayPalErrors.FailedToFetchDataException) - assertTrue(error?.message?.contains("Code was 404") ?: false) + assertTrue( + "error is not FailedToFetchDataException", + error is PayPalErrors.FailedToFetchDataException, + ) + assertTrue( + """error message does not contain "Code was 404"""", + error?.message?.contains("Code was 404") ?: false, + ) } } @@ -155,11 +165,23 @@ class ApiTest { launch { val result = Api.callMessageDataEndpoint(messageConfig, null, instanceId) - assertTrue(result is ApiResult.Failure<*>) + assertTrue( + "result is not ApiResult.Failure", + result is ApiResult.Failure<*>, + ) val error = (result as ApiResult.Failure<*>).error - assertTrue(error is PayPalErrors.InvalidResponseException) - assertTrue(error?.message?.contains("12345") ?: false) - assertTrue(error?.message?.contains("Invalid Response") ?: false) + assertTrue( + "error is not InvalidResponseException", + error is PayPalErrors.InvalidResponseException, + ) + assertTrue( + """error message does not contain 12345""", + error?.message?.contains("12345") ?: false, + ) + assertTrue( + """error message does not contain Invalid Response""", + error?.message?.contains("Invalid Response") ?: false, + ) } } @@ -177,10 +199,19 @@ class ApiTest { launch { val result = Api.callMessageDataEndpoint(messageConfig, null, instanceId) - assertTrue(result is ApiResult.Success<*>) + assertTrue( + "result is not ApiResult.Success", + result is ApiResult.Success<*>, + ) val response = (result as ApiResult.Success<*>).response - assertTrue(response.toJson().contains("content")) - assertTrue(response.toJson().contains("meta")) + assertTrue( + "response contains content", + response.toJson().contains("content"), + ) + assertTrue( + "response contains meta", + response.toJson().contains("meta"), + ) } } @@ -202,11 +233,14 @@ class ApiTest { val onActionCompleted = object : OnActionCompleted { override fun onActionCompleted(result: ApiResult) { - assertNotNull(result) - assertTrue(result is ApiResult.Success<*>) + assertNotNull("result is null", result) + assertTrue( + "result is not ApiResult.Success", + result is ApiResult.Success<*>, + ) val data = (result as ApiResult.Success<*>).response as ApiMessageData.Response - assertNotNull(data.content) - assertNotNull(data.meta) + assertNotNull("content is null", data.content) + assertNotNull("meta is null", data.meta) } } @@ -224,8 +258,11 @@ class ApiTest { val expectedPath = "credit-presentment/merchant-profile" val expectedQueryParts = arrayOf("client_id=test_client_id") - assertTrue(request.url.toString().contains(expectedPath)) - expectedQueryParts.forEach { assertTrue(url.contains(it)) } + assertTrue( + "url does not contain expectedPath: $expectedPath", + request.url.toString().contains(expectedPath), + ) + expectedQueryParts.forEach { assertTrue("url does not contain $it", url.contains(it)) } } @OptIn(ExperimentalCoroutinesApi::class) @@ -243,11 +280,23 @@ class ApiTest { launch { val result = Api.callMessageHashEndpoint("test_client_id") - assertTrue(result is ApiResult.Failure<*>) + assertTrue( + "result is not ApiResult.Failure", + result is ApiResult.Failure<*>, + ) val error = (result as ApiResult.Failure<*>).error - assertTrue(error is PayPalErrors.InvalidResponseException) - assertTrue(error?.message?.contains("12345") ?: false) - assertTrue(error?.message?.contains("Invalid Response") ?: false) + assertTrue( + "error is not InvalidResponseException", + error is PayPalErrors.InvalidResponseException, + ) + assertTrue( + """error message does not contain 12345""", + error?.message?.contains("12345") ?: false, + ) + assertTrue( + """error message does not contain Invalid Response""", + error?.message?.contains("Invalid Response") ?: false, + ) } } @@ -265,13 +314,24 @@ class ApiTest { launch { val result = Api.callMessageHashEndpoint("test_client_id") - assertTrue(result is ApiResult.Success<*>) + assertTrue( + "result is not ApiResult.Success", + result is ApiResult.Success<*>, + ) val response = (result as ApiResult.Success<*>).response - assertTrue(response.toJson().contains("cache_flow_disabled")) - assertTrue(response.toJson().contains("ttl_soft")) - assertTrue(response.toJson().contains("ttl_hard")) - assertTrue(response.toJson().contains("merchant_profile")) - assertTrue(response.toJson().contains("hash")) + val expectedParts = arrayOf( + "cache_flow_disabled", + "ttl_soft", + "ttl_hard", + "merchant_profile", + "hash", + ) + expectedParts.forEach { + assertTrue( + "response does not contain $it", + response.toJson().contains(it), + ) + } } } @@ -294,8 +354,8 @@ class ApiTest { "offer=PAY_LATER_PAY_IN_1", ) - assertTrue(url.contains(expectedPath)) - expectedQueryParts.forEach { assertTrue(url.contains(it)) } + assertTrue("url does not contain expectedPath: $expectedPath", url.contains(expectedPath)) + expectedQueryParts.forEach { assertTrue("url does not contain $it", url.contains(it)) } } @Test @@ -331,14 +391,18 @@ class ApiTest { } """.trimIndent() - val updated = preventEmptyValues(payloadJson) + val updatedPayload = preventEmptyValues(payloadJson) - assertNotEquals(payloadJson, updated) - assertFalse(updated.contains("integration_name")) - assertFalse(updated.contains("integration_version")) - - assertFalse(updated.contains("__shared__")) - assertFalse(updated.contains("amount")) - assertFalse(updated.contains("component_events")) + assertNotEquals(payloadJson, updatedPayload) + val notExpectedParts = arrayOf( + "integration_name", + "integration_version", + "__shared__", + "amount", + "component_events", + ) + notExpectedParts.forEach { + assertFalse("updatedPayload contains $it", updatedPayload.contains(it)) + } } } diff --git a/library/src/androidTest/java/com/paypal/messages/io/LocalStorageTest.kt b/library/src/androidTest/java/com/paypal/messages/io/LocalStorageTest.kt index 55e21825..c1899770 100644 --- a/library/src/androidTest/java/com/paypal/messages/io/LocalStorageTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/io/LocalStorageTest.kt @@ -123,7 +123,7 @@ class LocalStorageTest { val deviceIdFirstRetrieval = localStorage.deviceId assertNotNull(deviceIdFirstRetrieval) - assertTrue(deviceIdFirstRetrieval != "") + assertTrue("deviceIdFirstRetrieval not empty", deviceIdFirstRetrieval != "") val deviceIdSecondRetrieval = localStorage.deviceId assertEquals(deviceIdFirstRetrieval, deviceIdSecondRetrieval) diff --git a/library/src/main/java/com/paypal/messages/ModalFragment.kt b/library/src/main/java/com/paypal/messages/ModalFragment.kt index b7ae4007..dbeb5601 100644 --- a/library/src/main/java/com/paypal/messages/ModalFragment.kt +++ b/library/src/main/java/com/paypal/messages/ModalFragment.kt @@ -119,7 +119,7 @@ internal class ModalFragment( closeButton.background.colorFilter = PorterDuffColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP) closeButton?.setOnClickListener { - logEvent(AnalyticsEvent(eventType = EventType.MODAL_CLOSE)) + logEvent(AnalyticsEvent(eventType = EventType.MODAL_CLOSED)) dialog?.hide() } @@ -325,7 +325,7 @@ internal class ModalFragment( // This function is called when the modal is usually already instantiated override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - logEvent(AnalyticsEvent(eventType = EventType.MODAL_OPEN)) + logEvent(AnalyticsEvent(eventType = EventType.MODAL_OPENED)) this.onLoading() val url = Api.createModalUrl(clientId, amount, buyerCountry, offerType) @@ -354,7 +354,7 @@ internal class ModalFragment( logEvent( AnalyticsEvent( - eventType = EventType.MODAL_RENDER, + eventType = EventType.MODAL_RENDERED, renderDuration = renderDuration.toString(), requestDuration = requestDuration.toString(), ), @@ -388,7 +388,7 @@ internal class ModalFragment( } logEvent( AnalyticsEvent( - eventType = EventType.MODAL_CLICK, + eventType = EventType.MODAL_CLICKED, pageViewLinkSource = pageViewLinkSource, pageViewLinkName = pageViewLinkName, ), @@ -401,7 +401,7 @@ internal class ModalFragment( this.onCalculate() logEvent( AnalyticsEvent( - eventType = EventType.MODAL_CLICK, + eventType = EventType.MODAL_CLICKED, data = "$calculatorAmount", ), shared, diff --git a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt index 56159a4b..9ad2b5b0 100644 --- a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt +++ b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt @@ -474,7 +474,7 @@ class PayPalMessageView @JvmOverloads constructor( // Log that we successfully rendered the message logEvent( AnalyticsEvent( - eventType = EventType.MESSAGE_RENDER, + eventType = EventType.MESSAGE_RENDERED, renderDuration = renderDuration.toString(), requestDuration = requestDuration.toString(), ), @@ -505,7 +505,7 @@ class PayPalMessageView @JvmOverloads constructor( // Log Message Click logEvent( AnalyticsEvent( - eventType = EventType.MESSAGE_CLICK, + eventType = EventType.MESSAGE_CLICKED, pageViewLinkName = "banner_wrapper", pageViewLinkSource = "message", ), diff --git a/library/src/main/java/com/paypal/messages/analytics/EventType.kt b/library/src/main/java/com/paypal/messages/analytics/EventType.kt index 8b2c4fba..6ed26a2e 100644 --- a/library/src/main/java/com/paypal/messages/analytics/EventType.kt +++ b/library/src/main/java/com/paypal/messages/analytics/EventType.kt @@ -1,12 +1,12 @@ package com.paypal.messages.analytics enum class EventType { - MESSAGE_RENDER, - MESSAGE_CLICK, - MODAL_RENDER, - MODAL_CLICK, - MODAL_OPEN, - MODAL_CLOSE, + MESSAGE_RENDERED, + MESSAGE_CLICKED, + MODAL_RENDERED, + MODAL_CLICKED, + MODAL_OPENED, + MODAL_CLOSED, MODAL_ERROR, ; diff --git a/library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt index 34c29377..8c5936d5 100644 --- a/library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsComponentTest.kt @@ -7,6 +7,7 @@ import com.paypal.messages.config.message.style.PayPalMessageAlign import com.paypal.messages.config.message.style.PayPalMessageColor import com.paypal.messages.config.message.style.PayPalMessageLogoType import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test class AnalyticsComponentTest { @@ -33,7 +34,7 @@ class AnalyticsComponentTest { private val instanceId = "test_instance_id" private val originatingInstanceId = "test_originating_instance_id" private val sessionId = "test_session_id" - private val componentEvents = mutableListOf(AnalyticsEvent(EventType.MESSAGE_CLICK)) + private val componentEvents = mutableListOf(AnalyticsEvent(EventType.MESSAGE_CLICKED)) private val analyticsComponent = AnalyticsComponent( offerType = offerType, @@ -95,8 +96,32 @@ class AnalyticsComponentTest { val gson = Gson() val json = gson.toJson(analyticsComponent) - @Suppress("ktlint:standard:max-line-length") - val expectedJson = """{"offer_type":"PAY_LATER_SHORT_TERM","amount":"100.00","page_type":"CART","buyer_country_code":"US","channel":"NATIVE","style_logo_type":"ALTERNATIVE","style_color":"MONOCHROME","style_text_align":"CENTER","message_type":"OFFER","views":["VIEW"],"qualified_products":["PRODUCT"],"fdata":"test_fdata","debug_id":"test_debug_id","experimentation_experience_ids":["EXP_1","EXP_2"],"experimentation_treatment_ids":["TRT_1","TRT_2"],"credit_product_identifiers":["CPI_1","CPI_2"],"offer_country_code":"US","merchant_country_code":"US","type":"OFFER","instance_id":"test_instance_id","originating_instance_id":"test_originating_instance_id","session_id":"test_session_id","component_events":[{"event_type":"MESSAGE_CLICK"}],"__shared__":{}}""" - assertEquals(expectedJson, json) + val expectedParts = arrayOf( + """"offer_type":"PAY_LATER_SHORT_TERM"""", + """"amount":"100.00"""", + """"page_type":"CART"""", + """"buyer_country_code":"US"""", + """"presentment_channel":"NATIVE"""", + """"style_logo_type":"ALTERNATIVE"""", + """"style_color":"MONOCHROME"""", + """"style_text_align":"CENTER"""", + """"message_type":"OFFER"""", + """"views":["VIEW"]""", + """"qualified_products":["PRODUCT"]""", + """"fdata":"test_fdata"""", + """"debug_id":"test_debug_id"""", + """"experimentation_experience_ids":["EXP_1","EXP_2"]""", + """"experimentation_treatment_ids":["TRT_1","TRT_2"]""", + """"credit_product_identifiers":["CPI_1","CPI_2"]""", + """"offer_country_code":"US"""", + """"merchant_country_code":"US"""", + """"type":"OFFER"""", + """"instance_id":"test_instance_id"""", + """"originating_instance_id":"test_originating_instance_id"""", + """"session_id":"test_session_id"""", + """"component_events":[{"event_type":"MESSAGE_CLICKED"}]""", + """"__shared__":{}""", + ) + expectedParts.forEach { assertTrue(it in json, "json does not contain $it") } } } diff --git a/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt index a1d79170..44124c50 100644 --- a/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test class AnalyticsEventTest { - private val eventType = EventType.MESSAGE_CLICK + private val eventType = EventType.MESSAGE_CLICKED private val renderDuration = "100" private val requestDuration = "200" private val pageViewLinkName = "test_link_name" diff --git a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt index 648531f6..203800b0 100644 --- a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt @@ -6,32 +6,32 @@ import org.junit.jupiter.api.Test class EventTypeTest { @Test fun testMessageRender() { - assertEquals(EventType.MESSAGE_RENDER.toString(), "MESSAGE_RENDER") + assertEquals(EventType.MESSAGE_RENDERED.toString(), "MESSAGE_RENDER") } @Test fun testMessageClick() { - assertEquals(EventType.MESSAGE_CLICK.toString(), "MESSAGE_CLICK") + assertEquals(EventType.MESSAGE_CLICKED.toString(), "MESSAGE_CLICK") } @Test fun testModalRender() { - assertEquals(EventType.MODAL_RENDER.toString(), "MODAL_RENDER") + assertEquals(EventType.MODAL_RENDERED.toString(), "MODAL_RENDER") } @Test fun testModalClick() { - assertEquals(EventType.MODAL_CLICK.toString(), "MODAL_CLICK") + assertEquals(EventType.MODAL_CLICKED.toString(), "MODAL_CLICK") } @Test fun testModalOpen() { - assertEquals(EventType.MODAL_OPEN.toString(), "MODAL_OPEN") + assertEquals(EventType.MODAL_OPENED.toString(), "MODAL_OPEN") } @Test fun testModalClose() { - assertEquals(EventType.MODAL_CLOSE.toString(), "MODAL_CLOSE") + assertEquals(EventType.MODAL_CLOSED.toString(), "MODAL_CLOSE") } @Test diff --git a/library/src/test/java/com/paypal/messages/config/PayPalEnvironmentTest.kt b/library/src/test/java/com/paypal/messages/config/PayPalEnvironmentTest.kt index a6f626a9..b971ad26 100644 --- a/library/src/test/java/com/paypal/messages/config/PayPalEnvironmentTest.kt +++ b/library/src/test/java/com/paypal/messages/config/PayPalEnvironmentTest.kt @@ -29,10 +29,10 @@ class PayPalEnvironmentTest { @Test fun testIsProduction() { - assertTrue(Env.LIVE.isProduction) - assertTrue(Env.SANDBOX.isProduction) - assertFalse(Env.STAGE.isProduction) - assertFalse(Env.LOCAL.isProduction) + assertTrue(Env.LIVE.isProduction, "LIVE is not production") + assertTrue(Env.SANDBOX.isProduction, "SANDBOX is not production") + assertFalse(Env.STAGE.isProduction, "STAGE is production") + assertFalse(Env.LOCAL.isProduction, "LOCAL is production") } @Test diff --git a/library/src/test/java/com/paypal/messages/extensions/GsonTest.kt b/library/src/test/java/com/paypal/messages/extensions/GsonTest.kt index 5023db0a..7aa3027d 100644 --- a/library/src/test/java/com/paypal/messages/extensions/GsonTest.kt +++ b/library/src/test/java/com/paypal/messages/extensions/GsonTest.kt @@ -32,35 +32,35 @@ class GsonTest { fun testJsonValueToAnyWithNumber() { val parsedJson = JsonParser.parseString("1") val number = Gson::class.jsonValueToAny(parsedJson) - assertTrue(number is Number) + assertTrue(number is Number, "number is not Number") } @Test fun testJsonValueToAnyWithBoolean() { val parsedJson = JsonParser.parseString("true") val boolean = Gson::class.jsonValueToAny(parsedJson) - assertTrue(boolean is Boolean) + assertTrue(boolean is Boolean, "boolean is not Boolean") } @Test fun testJsonValueToAnyWithString() { val parsedJson = JsonParser.parseString("string") val string = Gson::class.jsonValueToAny(parsedJson) - assertTrue(string is String) + assertTrue(string is String, "string is not String") } @Test fun testJsonValueToAnyWithArray() { val parsedJson = JsonParser.parseString("[1]") val array = Gson::class.jsonValueToAny(parsedJson) - assertTrue(array is JsonArray) + assertTrue(array is JsonArray, "array is not JsonArray") } @Test fun testJsonValueToAnyWithObject() { val parsedJson = JsonParser.parseString("{}") val map = Gson::class.jsonValueToAny(parsedJson) - assertTrue(map is MutableMap<*, *>) + assertTrue(map is MutableMap<*, *>, "map is not MutableMap<*, *>") } @Test diff --git a/library/src/test/java/com/paypal/messages/io/ApiResultTest.kt b/library/src/test/java/com/paypal/messages/io/ApiResultTest.kt index da587c1d..e12a325f 100644 --- a/library/src/test/java/com/paypal/messages/io/ApiResultTest.kt +++ b/library/src/test/java/com/paypal/messages/io/ApiResultTest.kt @@ -22,7 +22,10 @@ class ApiResultTest { fun testFailureToJson() { val failure = ApiResult.Failure(PayPalErrors.InvalidResponseException("test_message", "test_debug_id")) - assertTrue(failure.error.message?.contains("test_message") ?: false) + assertTrue( + failure.error.message?.contains("test_message") ?: false, + "failure does not contain test_message", + ) assertEquals("test_debug_id", failure.error.debugId) } diff --git a/library/src/test/java/com/paypal/messages/utils/PayPalErrorsTest.kt b/library/src/test/java/com/paypal/messages/utils/PayPalErrorsTest.kt index 5822a84d..96687090 100644 --- a/library/src/test/java/com/paypal/messages/utils/PayPalErrorsTest.kt +++ b/library/src/test/java/com/paypal/messages/utils/PayPalErrorsTest.kt @@ -27,6 +27,7 @@ class PayPalErrorsTest { assertTrue( exception.message?.contains("Failed to get Message Data: test_message") ?: false, + "FailedToFetchDataException with ID does not contain expected message", ) assertEquals("test_id", exception.debugId) @@ -34,6 +35,7 @@ class PayPalErrorsTest { assertTrue( exceptionNoId.message?.contains("Failed to get Message Data: test_message") ?: false, + "FailedToFetchDataException with no ID does not contain expected message", ) assertEquals(null, exceptionNoId.debugId) } @@ -47,6 +49,7 @@ class PayPalErrorsTest { "Attempted to create a enum_name with an invalid index. " + "Please use an index that is between 0 and 9 and try again.", ) ?: false, + "IllegalEnumArgException does not contain expected message", ) assertEquals(null, exception.debugId) } @@ -55,12 +58,18 @@ class PayPalErrorsTest { fun testInvalidClientIdException() { val exception = PayPalErrors.InvalidClientIdException("test_message", "test_id") - assertTrue(exception.message?.contains("Invalid ClientID: test_message") ?: false) + assertTrue( + exception.message?.contains("Invalid ClientID: test_message") ?: false, + "InvalidClientIdException with ID does not contain expected message", + ) assertEquals("test_id", exception.debugId) val exceptionNoId = PayPalErrors.InvalidClientIdException("test_message") - assertTrue(exceptionNoId.message?.contains("Invalid ClientID: test_message") ?: false) + assertTrue( + exceptionNoId.message?.contains("Invalid ClientID: test_message") ?: false, + "InvalidClientIdException with no ID does not contain expected message", + ) assertEquals(null, exceptionNoId.debugId) } @@ -68,12 +77,18 @@ class PayPalErrorsTest { fun testInvalidResponseException() { val exception = PayPalErrors.InvalidResponseException("test_message", "test_id") - assertTrue(exception.message?.contains("Invalid Response: test_message") ?: false) + assertTrue( + exception.message?.contains("Invalid Response: test_message") ?: false, + "InvalidResponseException with ID does not contain expected message", + ) assertEquals("test_id", exception.debugId) val exceptionNoId = PayPalErrors.InvalidResponseException("test_message") - assertTrue(exceptionNoId.message?.contains("Invalid Response: test_message") ?: false) + assertTrue( + exceptionNoId.message?.contains("Invalid Response: test_message") ?: false, + "InvalidResponseException with no ID does not contain expected message", + ) assertEquals(null, exceptionNoId.debugId) } @@ -81,12 +96,18 @@ class PayPalErrorsTest { fun testModalFailedToLoadException() { val exception = PayPalErrors.ModalFailedToLoad("test_message", "test_id") - assertTrue(exception.message?.contains("Modal failed to open: test_message") ?: false) + assertTrue( + exception.message?.contains("Modal failed to open: test_message") ?: false, + "ModalFailedToLoadException with ID does not contain expected message", + ) assertEquals("test_id", exception.debugId) val exceptionNoId = PayPalErrors.ModalFailedToLoad("test_message") - assertTrue(exceptionNoId.message?.contains("Modal failed to open: test_message") ?: false) + assertTrue( + exceptionNoId.message?.contains("Modal failed to open: test_message") ?: false, + "ModalFailedToLoadException with no ID does not contain expected message", + ) assertEquals(null, exceptionNoId.debugId) } } From a2ffcaf84866785b8d608156ea5438893a84a556 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Fri, 12 Apr 2024 09:11:10 -0400 Subject: [PATCH 04/14] Fix types --- .../paypal/messages/analytics/ComponentTypeTest.kt | 4 ++-- .../com/paypal/messages/analytics/EventTypeTest.kt | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt index 5ba196ff..9656e590 100644 --- a/library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/ComponentTypeTest.kt @@ -6,11 +6,11 @@ import org.junit.jupiter.api.Test class ComponentTypeTest { @Test fun testModal() { - assertEquals(ComponentType.MODAL.toString(), "MODAL") + assertEquals(ComponentType.MODAL.toString(), "modal") } @Test fun testMessage() { - assertEquals(ComponentType.MESSAGE.toString(), "MESSAGE") + assertEquals(ComponentType.MESSAGE.toString(), "message") } } diff --git a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt index 203800b0..ca1e5aa3 100644 --- a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt @@ -6,36 +6,36 @@ import org.junit.jupiter.api.Test class EventTypeTest { @Test fun testMessageRender() { - assertEquals(EventType.MESSAGE_RENDERED.toString(), "MESSAGE_RENDER") + assertEquals(EventType.MESSAGE_RENDERED.toString(), "message_rendered") } @Test fun testMessageClick() { - assertEquals(EventType.MESSAGE_CLICKED.toString(), "MESSAGE_CLICK") + assertEquals(EventType.MESSAGE_CLICKED.toString(), "message_clicked") } @Test fun testModalRender() { - assertEquals(EventType.MODAL_RENDERED.toString(), "MODAL_RENDER") + assertEquals(EventType.MODAL_RENDERED.toString(), "modal_rendered") } @Test fun testModalClick() { - assertEquals(EventType.MODAL_CLICKED.toString(), "MODAL_CLICK") + assertEquals(EventType.MODAL_CLICKED.toString(), "modal_clicked") } @Test fun testModalOpen() { - assertEquals(EventType.MODAL_OPENED.toString(), "MODAL_OPEN") + assertEquals(EventType.MODAL_OPENED.toString(), "modal_opened") } @Test fun testModalClose() { - assertEquals(EventType.MODAL_CLOSED.toString(), "MODAL_CLOSE") + assertEquals(EventType.MODAL_CLOSED.toString(), "modal_closed") } @Test fun testModalError() { - assertEquals(EventType.MODAL_ERROR.toString(), "MODAL_ERROR") + assertEquals(EventType.MODAL_ERROR.toString(), "modal_error") } } From ababf62ebdb9477e6b8ba3cd4729961d969382b2 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Fri, 12 Apr 2024 09:20:03 -0400 Subject: [PATCH 05/14] Simplify tests --- .../messages/analytics/AnalyticsEventTest.kt | 17 ++++++++++++--- .../analytics/AnalyticsPayloadTest.kt | 21 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt index 44124c50..de94fb8e 100644 --- a/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt @@ -1,6 +1,8 @@ package com.paypal.messages.analytics +import android.util.Log import com.google.gson.Gson +import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -42,8 +44,17 @@ class AnalyticsEventTest { val gson = Gson() val json = gson.toJson(analyticsEvent) - @Suppress("ktlint:standard:max-line-length") - val expectedJson = """{"event_type":"MESSAGE_CLICK","render_duration":100,"request_duration":200,"page_view_link_name":"test_link_name","page_view_link_source":"test_link_src","data":"test_data","error_name":"test_error_name","error_description":"test_error_description"}""" - assertEquals(expectedJson, json) + Log.d("test", json) + val expectedParts = arrayOf( + """"event_type":"MESSAGE_CLICKED"""", + """"render_duration":"100"""", + """"request_duration":"200"""", + """"page_view_link_name":"test_link_name"""", + """"page_view_link_source":"test_link_src"""", + """"data":"test_data"""", + """"error_name":"test_error_name"""", + """"error_description":"test_error_description"""", + ) + expectedParts.forEach { Assertions.assertTrue(it in json, "json does not contain $it") } } } diff --git a/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt index 86346296..37e4a68d 100644 --- a/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt @@ -1,6 +1,8 @@ package com.paypal.messages.analytics +import android.util.Log import com.google.gson.Gson +import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -54,8 +56,21 @@ class AnalyticsPayloadTest { val gson = Gson() val json = gson.toJson(analyticsPayload) - @Suppress("ktlint:standard:max-line-length") - val expectedJson = """{"client_id":"test_client_id","merchant_id":"test_merchant_id","partner_attribution_id":"test_partner_attribution_id","merchant_profile_hash":"test_merchant_profile_hash","device_id":"test_device_id","session_id":"test_session_id","instance_id":"test_instance_id","integration_name":"test_integration_name","integration_type":"test_integration_type","integration_version":"test_integration_version","lib_version":"test_library_version","components":[]}""" - assertEquals(expectedJson, json) + Log.d("test", json) + val expectedParts = arrayOf( + """"client_id":"test_client_id"""", + """"merchant_id":"test_merchant_id"""", + """"partner_attribution_id":"test_partner_attribution_id"""", + """"merchant_profile_hash":"test_merchant_profile_hash"""", + """"device_id":"test_device_id"""", + """"session_id":"test_session_id"""", + """"instance_id":"test_instance_id"""", + """"integration_name":"test_integration_name"""", + """"integration_type":"test_integration_type"""", + """"integration_version":"test_integration_version"""", + """"lib_version":"test_library_version"""", + """"components":[]""", + ) + expectedParts.forEach { Assertions.assertTrue(it in json, "json does not contain $it") } } } From bd9c0b7ecc730b00bed8f9a6c0a5a297679997f5 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Fri, 12 Apr 2024 09:21:18 -0400 Subject: [PATCH 06/14] Change to MODAL_VIEWED --- library/src/main/java/com/paypal/messages/ModalFragment.kt | 2 +- .../src/main/java/com/paypal/messages/analytics/EventType.kt | 2 +- .../test/java/com/paypal/messages/analytics/EventTypeTest.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/paypal/messages/ModalFragment.kt b/library/src/main/java/com/paypal/messages/ModalFragment.kt index dbeb5601..664a1f52 100644 --- a/library/src/main/java/com/paypal/messages/ModalFragment.kt +++ b/library/src/main/java/com/paypal/messages/ModalFragment.kt @@ -325,7 +325,7 @@ internal class ModalFragment( // This function is called when the modal is usually already instantiated override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - logEvent(AnalyticsEvent(eventType = EventType.MODAL_OPENED)) + logEvent(AnalyticsEvent(eventType = EventType.MODAL_VIEWED)) this.onLoading() val url = Api.createModalUrl(clientId, amount, buyerCountry, offerType) diff --git a/library/src/main/java/com/paypal/messages/analytics/EventType.kt b/library/src/main/java/com/paypal/messages/analytics/EventType.kt index 6ed26a2e..771b1c89 100644 --- a/library/src/main/java/com/paypal/messages/analytics/EventType.kt +++ b/library/src/main/java/com/paypal/messages/analytics/EventType.kt @@ -5,7 +5,7 @@ enum class EventType { MESSAGE_CLICKED, MODAL_RENDERED, MODAL_CLICKED, - MODAL_OPENED, + MODAL_VIEWED, MODAL_CLOSED, MODAL_ERROR, ; diff --git a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt index ca1e5aa3..76b29dea 100644 --- a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt @@ -26,7 +26,7 @@ class EventTypeTest { @Test fun testModalOpen() { - assertEquals(EventType.MODAL_OPENED.toString(), "modal_opened") + assertEquals(EventType.MODAL_VIEWED.toString(), "modal_opened") } @Test From dacab2888742e67fb8ddc1f381240e786b70b8d1 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Fri, 12 Apr 2024 10:13:48 -0400 Subject: [PATCH 07/14] Fix test --- .../test/java/com/paypal/messages/analytics/EventTypeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt index 76b29dea..95a72702 100644 --- a/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/EventTypeTest.kt @@ -26,7 +26,7 @@ class EventTypeTest { @Test fun testModalOpen() { - assertEquals(EventType.MODAL_VIEWED.toString(), "modal_opened") + assertEquals(EventType.MODAL_VIEWED.toString(), "modal_viewed") } @Test From de90d5c69d53608479daa1df9f3afd613a8eae17 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Mon, 15 Apr 2024 08:10:24 -0400 Subject: [PATCH 08/14] Add messages to analytics tests --- library/build.gradle | 4 ++-- .../java/com/paypal/messages/analytics/AnalyticsEventTest.kt | 2 -- .../com/paypal/messages/analytics/AnalyticsPayloadTest.kt | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index 36980b02..08370002 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -105,6 +105,8 @@ koverReport { '*KoverExcludeGenerated' ) classes( + // AnalyticsLogger, + 'com.paypal.messages.logger.AnalyticsLogger*', // config 'com.paypal.messages.config.message.PayPalMessageEventsCallbacks\$*', 'com.paypal.messages.config.message.PayPalMessageViewStateCallbacks\$*', @@ -116,8 +118,6 @@ koverReport { 'com.paypal.messages.io.Api\$*', 'com.paypal.messages.io.LocalStorage*', 'com.paypal.messages.io.OnActionCompleted', - // logger, - 'com.paypal.messages.logger.Logger*', // utils 'com.paypal.messages.utils.LogCat*', // UI Stuff diff --git a/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt index de94fb8e..9e166b92 100644 --- a/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsEventTest.kt @@ -1,6 +1,5 @@ package com.paypal.messages.analytics -import android.util.Log import com.google.gson.Gson import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assertions.assertEquals @@ -44,7 +43,6 @@ class AnalyticsEventTest { val gson = Gson() val json = gson.toJson(analyticsEvent) - Log.d("test", json) val expectedParts = arrayOf( """"event_type":"MESSAGE_CLICKED"""", """"render_duration":"100"""", diff --git a/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt b/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt index 37e4a68d..f14f8edc 100644 --- a/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/AnalyticsPayloadTest.kt @@ -1,6 +1,5 @@ package com.paypal.messages.analytics -import android.util.Log import com.google.gson.Gson import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assertions.assertEquals @@ -56,7 +55,6 @@ class AnalyticsPayloadTest { val gson = Gson() val json = gson.toJson(analyticsPayload) - Log.d("test", json) val expectedParts = arrayOf( """"client_id":"test_client_id"""", """"merchant_id":"test_merchant_id"""", From bdf1391d5499de8c521e0732a76ce434e4a7ba54 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:37:24 -0400 Subject: [PATCH 09/14] Fix gradle --- library/build.gradle | 2 +- .../java/com/paypal/messages/PayPalMessageViewTest.kt | 10 ++++++++-- .../com/paypal/messages/analytics/AnalyticsLogger.kt | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index 08370002..d2a7414c 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -106,7 +106,7 @@ koverReport { ) classes( // AnalyticsLogger, - 'com.paypal.messages.logger.AnalyticsLogger*', + 'com.paypal.messages.analytics.AnalyticsLogger*', // config 'com.paypal.messages.config.message.PayPalMessageEventsCallbacks\$*', 'com.paypal.messages.config.message.PayPalMessageViewStateCallbacks\$*', diff --git a/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt b/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt index 28892421..f2f9c993 100644 --- a/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt +++ b/library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt @@ -99,7 +99,13 @@ class PayPalMessageViewTest { "amount does not equal 100.00", payPalMessageView.getConfig().data.amount!!.equals(100.00), ) - assertFalse(payPalMessageView.getConfig().viewStateCallbacks?.onLoading == emptyFunction) - assertFalse(payPalMessageView.getConfig().eventsCallbacks?.onClick == emptyFunction) + assertFalse( + "viewStateCallbacks.onClick was not an empty function", + payPalMessageView.getConfig().viewStateCallbacks?.onLoading == emptyFunction, + ) + assertFalse( + "eventsCallbacks.onClick was not an empty function", + payPalMessageView.getConfig().eventsCallbacks?.onClick == emptyFunction, + ) } } diff --git a/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt b/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt index 3c269a19..eb3228b0 100644 --- a/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt +++ b/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt @@ -17,7 +17,7 @@ class AnalyticsLogger private constructor() { private val uuidSessionId = UUID.randomUUID().toString() companion object { - private const val TAG: String = "Logger" + private const val TAG: String = "AnalyticsLogger" @Volatile private var instance: AnalyticsLogger? = null From adb16d7a510fe2da561b1d8b89869192d368e1cf Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:56:41 -0400 Subject: [PATCH 10/14] fix: allow messages to be updated any time --- .../com/paypal/messages/PayPalMessageView.kt | 31 +++++++------------ scripts/pre-commit | 10 ++---- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt index 9ad2b5b0..3abdebd7 100644 --- a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt +++ b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt @@ -67,7 +67,6 @@ class PayPalMessageView @JvmOverloads constructor( ) : FrameLayout(context, attributeSet, defStyleAttr), OnActionCompleted { private val TAG = "PayPalMessage" private var messageTextView: TextView - private var updateInProgress = false private var instanceId = UUID.randomUUID() fun getConfig(): MessageConfig { @@ -441,23 +440,18 @@ class PayPalMessageView @JvmOverloads constructor( * This function updates message content uses [Api.getMessageWithHash] to fetch the data. */ private fun updateMessageContent() { - LogCat.debug(TAG, "updateMessageContent config: ${getConfig()}") - if (!updateInProgress) { - // Call OnLoading callback and prepare view for the process - onLoading.invoke() - messageTextView.visibility = View.GONE - updateInProgress = true - LogCat.debug(TAG, "Firing request to get message") - - requestDuration = measureTimeMillis { - Api.getMessageWithHash( - context, - getConfig(), - this.instanceId, - this, - ) - }.toInt() - } + // Call OnLoading callback and prepare view for the process + onLoading.invoke() + LogCat.debug(TAG, "Firing request to get message with config: ${getConfig()}") + + requestDuration = measureTimeMillis { + Api.getMessageWithHash( + context, + getConfig(), + this.instanceId, + this, + ) + }.toInt() } override fun onActionCompleted(result: ApiResult) { @@ -487,7 +481,6 @@ class PayPalMessageView @JvmOverloads constructor( result.error?.let { this.onError(it) } } } - updateInProgress = false } /** diff --git a/scripts/pre-commit b/scripts/pre-commit index 71397dd0..25d47b06 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -12,18 +12,14 @@ if [[ "$stagedFilesCount" -eq "0" ]]; then fi echo "Found $stagedFilesCount staged files." -echo git diff --staged --name-only | grep -E '(library|demo)' +git diff --staged --name-only | grep -E '(library|demo)' echo "" echo "Running ktFormat to fix any auto-fixable issues" -git stash --keep-index --quiet - ./gradlew ktFormat -git add library/ -git add demo/ - -git stash pop --quiet +# Only re-add staged files that are in library/ or demo/ folders +git diff --staged --name-only | grep -E '(library|demo)' | xargs git add echo "***********************************************" echo "Added changed files to commit" From cee7c21cca0a3dc963e5f07fa82fa1f1fcf3fecb Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:29:22 -0400 Subject: [PATCH 11/14] fix: require name and version for setGA, re-org --- demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt | 2 +- .../java/com/paypal/messages/analytics/AnalyticsLogger.kt | 1 - .../messages/{config => analytics}/GlobalAnalytics.kt | 2 +- .../paypal/messages/config/message/PayPalMessageConfig.kt | 6 +++--- .../{config/message => utils}/KoverExcludeGenerated.kt | 2 +- .../java/com/paypal/messages/config/GlobalAnalyticsTest.kt | 1 + .../messages/config/message/PayPalMessageConfigTest.kt | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) rename library/src/main/java/com/paypal/messages/{config => analytics}/GlobalAnalytics.kt (80%) rename library/src/main/java/com/paypal/messages/{config/message => utils}/KoverExcludeGenerated.kt (89%) diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt index 70f59276..17430ed2 100644 --- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt +++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt @@ -190,7 +190,7 @@ class XmlActivity : AppCompatActivity() { binding = ActivityMessageBinding.inflate(layoutInflater) setContentView(binding.root) - PayPalMessageConfig.setGlobalAnalytics() + PayPalMessageConfig.setGlobalAnalytics("", "") val config = PayPalMessageConfig(data = PayPalMessageData(clientID = "someClientID")) val message = PayPalMessageView(context = this, config = config) message.getConfig() diff --git a/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt b/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt index eb3228b0..3228001e 100644 --- a/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt +++ b/library/src/main/java/com/paypal/messages/analytics/AnalyticsLogger.kt @@ -1,7 +1,6 @@ package com.paypal.messages.analytics import android.content.Context -import com.paypal.messages.config.GlobalAnalytics import com.paypal.messages.io.Api import com.paypal.messages.io.LocalStorage import com.paypal.messages.utils.LogCat diff --git a/library/src/main/java/com/paypal/messages/config/GlobalAnalytics.kt b/library/src/main/java/com/paypal/messages/analytics/GlobalAnalytics.kt similarity index 80% rename from library/src/main/java/com/paypal/messages/config/GlobalAnalytics.kt rename to library/src/main/java/com/paypal/messages/analytics/GlobalAnalytics.kt index 9a3b8ec6..758275bd 100644 --- a/library/src/main/java/com/paypal/messages/config/GlobalAnalytics.kt +++ b/library/src/main/java/com/paypal/messages/analytics/GlobalAnalytics.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.config +package com.paypal.messages.analytics object GlobalAnalytics { var integrationName: String = "" diff --git a/library/src/main/java/com/paypal/messages/config/message/PayPalMessageConfig.kt b/library/src/main/java/com/paypal/messages/config/message/PayPalMessageConfig.kt index 55aae562..11930957 100644 --- a/library/src/main/java/com/paypal/messages/config/message/PayPalMessageConfig.kt +++ b/library/src/main/java/com/paypal/messages/config/message/PayPalMessageConfig.kt @@ -1,6 +1,6 @@ package com.paypal.messages.config.message -import com.paypal.messages.config.GlobalAnalytics +import com.paypal.messages.analytics.GlobalAnalytics /** * [PayPalMessageConfig] is the main configuration model for interacting with the PayPalMessage component @@ -19,8 +19,8 @@ data class PayPalMessageConfig( companion object { fun setGlobalAnalytics( - integrationName: String = "", - integrationVersion: String = "", + integrationName: String, + integrationVersion: String, deviceId: String = "", sessionId: String = "", ) { diff --git a/library/src/main/java/com/paypal/messages/config/message/KoverExcludeGenerated.kt b/library/src/main/java/com/paypal/messages/utils/KoverExcludeGenerated.kt similarity index 89% rename from library/src/main/java/com/paypal/messages/config/message/KoverExcludeGenerated.kt rename to library/src/main/java/com/paypal/messages/utils/KoverExcludeGenerated.kt index df42f0e0..25dab997 100644 --- a/library/src/main/java/com/paypal/messages/config/message/KoverExcludeGenerated.kt +++ b/library/src/main/java/com/paypal/messages/utils/KoverExcludeGenerated.kt @@ -1,4 +1,4 @@ -package com.paypal.messages.config.message +package com.paypal.messages.utils @Retention(AnnotationRetention.RUNTIME) @Target( diff --git a/library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt b/library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt index 8f4fcf31..0a239d83 100644 --- a/library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt +++ b/library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt @@ -1,5 +1,6 @@ package com.paypal.messages.config +import com.paypal.messages.analytics.GlobalAnalytics import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test diff --git a/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt b/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt index 6ec762c8..77243d52 100644 --- a/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt +++ b/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt @@ -1,6 +1,6 @@ package com.paypal.messages.config.message -import com.paypal.messages.config.GlobalAnalytics +import com.paypal.messages.analytics.GlobalAnalytics import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNotEquals import org.junit.jupiter.api.Test From 50fe40c5904eadc79444c1522df107efe1dc74eb Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:43:36 -0400 Subject: [PATCH 12/14] chore: improve logging --- library/src/main/java/com/paypal/messages/io/Api.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/paypal/messages/io/Api.kt b/library/src/main/java/com/paypal/messages/io/Api.kt index db5c358b..9f69a48a 100644 --- a/library/src/main/java/com/paypal/messages/io/Api.kt +++ b/library/src/main/java/com/paypal/messages/io/Api.kt @@ -170,7 +170,10 @@ object Api { return ApiResult.getFailureWithDebugId(response.headers) } - LogCat.debug(TAG, "callMessageHashEndpoint response: $bodyJson") + LogCat.debug( + TAG, + "callMessageHashEndpoint response: ${bodyJson?.let { JSONObject(it).toString(2) }}}", + ) val hashResponse = gson.fromJson(bodyJson, ApiHashData.Response::class.java) return ApiResult.Success(hashResponse) @@ -221,12 +224,14 @@ object Api { } internal fun createLoggerRequest(json: String): Request { + LogCat.debug(TAG, "json after removal: ${JSONObject(json).toString(2)}") val request = Request.Builder().apply { url(env.url(Env.Endpoints.LOGGER)) post(json.toRequestBody("application/json".toMediaType())) }.build() - val jsonNoFdata = json.replace(""""fdata":".*?"""".toRegex(), "") + val jsonNoFdata = JSONObject(json).toString(2) + .replace(""""fdata":.*?",""".toRegex(), "") LogCat.debug(TAG, "createLoggerRequest: $request\npayloadJson: $jsonNoFdata") return request } From 006271a6a85873f3eca1da565b3c1662220bcf0d Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:46:11 -0400 Subject: [PATCH 13/14] chore: move global analytics test --- .../messages/{config => analytics}/GlobalAnalyticsTest.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename library/src/test/java/com/paypal/messages/{config => analytics}/GlobalAnalyticsTest.kt (80%) diff --git a/library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt b/library/src/test/java/com/paypal/messages/analytics/GlobalAnalyticsTest.kt similarity index 80% rename from library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt rename to library/src/test/java/com/paypal/messages/analytics/GlobalAnalyticsTest.kt index 0a239d83..6b5eacfe 100644 --- a/library/src/test/java/com/paypal/messages/config/GlobalAnalyticsTest.kt +++ b/library/src/test/java/com/paypal/messages/analytics/GlobalAnalyticsTest.kt @@ -1,6 +1,5 @@ -package com.paypal.messages.config +package com.paypal.messages.analytics -import com.paypal.messages.analytics.GlobalAnalytics import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test From 74af6b2222a9d99af93249c3f1fc9f69fab950d8 Mon Sep 17 00:00:00 2001 From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:19:19 -0400 Subject: [PATCH 14/14] Fix tests --- .../paypal/messages/config/message/PayPalMessageConfigTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt b/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt index 77243d52..a2e8d803 100644 --- a/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt +++ b/library/src/test/java/com/paypal/messages/config/message/PayPalMessageConfigTest.kt @@ -50,7 +50,7 @@ class PayPalMessageConfigTest { // It is also required for full test coverage as calculated by kover @Test fun testSetGlobalAnalyticsWithNoValues() { - PayPalMessageConfig.setGlobalAnalytics() + PayPalMessageConfig.setGlobalAnalytics("", "") assertEquals("", GlobalAnalytics.integrationName) assertEquals("", GlobalAnalytics.integrationVersion)