From 6a94a4390b47c37f23e938198f736447bf363484 Mon Sep 17 00:00:00 2001 From: bohdan-go-wombat Date: Mon, 31 Jul 2023 16:45:11 +0300 Subject: [PATCH] update generation of message body for DIA-2458-review-message-param --- .../cmplibrary/data/ServiceImpl.kt | 30 ++++++++++---- .../data/network/model/MessageModelReqExt.kt | 15 ------- .../model/optimized/MessagesApiModelExt.kt | 12 +++--- .../optimized/includeData/IncludeData.kt | 20 ++++++++++ .../optimized/includeData/IncludeDataExt.kt | 11 ++++++ .../optimized/includeData/IncludeDataParam.kt | 10 +++++ .../includeData/IncludeDataParamType.kt | 13 +++++++ .../optimized/messages/MessagesBodyReq.kt | 28 +++++++++++++ .../messages/OperatingSystemInfoParam.kt | 18 +++++++++ .../cmplibrary/model/ConsentReq.kt | 37 ------------------ .../cmplibrary/model/MessageModelReq.kt | 10 ----- .../model/optimized/MessagesApiModelTest.kt | 39 ------------------- .../data/network/util/HttpUrlManagerTest.kt | 27 +++++++++---- 13 files changed, 147 insertions(+), 123 deletions(-) delete mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/MessageModelReqExt.kt create mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeData.kt create mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataExt.kt create mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParam.kt create mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParamType.kt create mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/MessagesBodyReq.kt create mode 100644 cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/OperatingSystemInfoParam.kt diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/ServiceImpl.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/ServiceImpl.kt index 138c31a06..4d1aeadd8 100644 --- a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/ServiceImpl.kt +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/ServiceImpl.kt @@ -11,6 +11,9 @@ import com.sourcepoint.cmplibrary.data.network.converter.converter import com.sourcepoint.cmplibrary.data.network.converter.genericFail import com.sourcepoint.cmplibrary.data.network.converter.toMapOfAny import com.sourcepoint.cmplibrary.data.network.model.optimized.* //ktlint-disable +import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.generateIncludeDataForMessages +import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.MessagesBodyReq +import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.OperatingSystemInfoParam import com.sourcepoint.cmplibrary.data.network.util.Env import com.sourcepoint.cmplibrary.exception.CampaignType.CCPA import com.sourcepoint.cmplibrary.exception.CampaignType.GDPR @@ -23,6 +26,8 @@ import com.sourcepoint.cmplibrary.model.exposed.SPConsents import com.sourcepoint.cmplibrary.util.check import com.sourcepoint.cmplibrary.util.extensions.toJsonObject import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonObject import org.json.JSONArray import org.json.JSONObject @@ -160,15 +165,24 @@ private class ServiceImpl( if (campaignManager.shouldCallMessages) { - val body = createGetMessagesRequestBody( + val operatingSystemInfo = OperatingSystemInfoParam() + + val localState = campaignManager.messagesOptimizedLocalState?.jsonObject + ?: JsonObject(mapOf()) + + val body = MessagesBodyReq( accountId = messageReq.accountId, - propertyHref = messageReq.propertyHref, - campaigns = campaignManager.campaigns4Config, - gdprConsentStatus = campaignManager.gdprConsentStatus?.consentStatus, - ccpaConsentStatus = campaignManager.ccpaConsentStatus?.status?.name, - campaignEnv = campaignManager.spConfig.campaignsEnv, + propertyHref = "https://${messageReq.propertyHref}", + campaigns = campaignManager.campaigns4Config.toMetadataBody( + gdprConsentStatus = campaignManager.gdprConsentStatus?.consentStatus, + ccpaConsentStatus = campaignManager.ccpaConsentStatus?.status?.name, + ), + campaignEnv = campaignManager.spConfig.campaignsEnv.env, consentLanguage = campaignManager.messageLanguage.value, - localState = campaignManager.messagesOptimizedLocalState?.jsonObject, + hasCSP = false, + includeData = generateIncludeDataForMessages(), + localState = localState, + operatingSystem = operatingSystemInfo, ) val messagesParamReq = MessagesParamReq( @@ -177,7 +191,7 @@ private class ServiceImpl( authId = messageReq.authId, propertyHref = messageReq.propertyHref, env = messageReq.env, - body = body.toString(), + body = JsonConverter.converter.encodeToString(body), metadataArg = metadataResponse.getOrNull()?.toMetaDataArg(), nonKeyedLocalState = campaignManager.nonKeyedLocalState?.jsonObject, ) diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/MessageModelReqExt.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/MessageModelReqExt.kt deleted file mode 100644 index 210acb74c..000000000 --- a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/MessageModelReqExt.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.sourcepoint.cmplibrary.data.network.model - -import com.sourcepoint.cmplibrary.model.* // ktlint-disable -import org.json.JSONObject - -internal fun IncludeData.toJsonObject(): JSONObject { - return JSONObject() - .apply { - put("messageMetaData", JSONObject().apply { put("type", messageMetaData.type) }) - put("TCData", JSONObject().apply { put("type", tCData.type) }) - put("localState", JSONObject().apply { put("type", localState.type) }) - put("customVendorsResponse", JSONObject().apply { put("type", customVendorsResponse.type) }) - put("webConsentPayload", JSONObject().apply { put("type", webConsentPayload.type) }) - } -} diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelExt.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelExt.kt index b9f000268..0b197e6ed 100644 --- a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelExt.kt +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelExt.kt @@ -68,8 +68,8 @@ internal fun createGetMessagesRequestBody( } internal fun List.toMetadataBody( - cs: ConsentStatus? = null, - ccpaStatus: String? = null + gdprConsentStatus: ConsentStatus? = null, + ccpaConsentStatus: String? = null ): JsonObject { return buildJsonObject { this@toMetadataBody.forEach { c -> @@ -77,13 +77,13 @@ internal fun List.toMetadataBody( if (c.campaignType == CampaignType.GDPR) { put( "consentStatus", - cs?.let { JsonConverter.converter.encodeToJsonElement(it) } ?: JsonObject(mapOf()) + gdprConsentStatus?.let { JsonConverter.converter.encodeToJsonElement(it) } ?: JsonObject(mapOf()) ) - put("hasLocalData", cs != null) + put("hasLocalData", gdprConsentStatus != null) } if (c.campaignType == CampaignType.CCPA) { - put("status", ccpaStatus ?: "") - put("hasLocalData", ccpaStatus != null) + put("status", ccpaConsentStatus ?: "") + put("hasLocalData", ccpaConsentStatus != null) } putJsonObject("targetingParams") { c.targetingParams.forEach { t -> put(t.key, t.value) } diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeData.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeData.kt new file mode 100644 index 000000000..6d13d2da9 --- /dev/null +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeData.kt @@ -0,0 +1,20 @@ +package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class IncludeData( + @SerialName("localState") + val localState: IncludeDataParam? = null, + @SerialName("TCData") + val tcData: IncludeDataParam? = null, + @SerialName("campaigns") + val campaigns: IncludeDataParam? = null, + @SerialName("customVendorsResponse") + val customVendorsResponse: IncludeDataParam? = null, + @SerialName("messageMetaData") + val messageMetaData: IncludeDataParam? = null, + @SerialName("webConsentPayload") + val webConsentPayload: IncludeDataParam? = null, +) diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataExt.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataExt.kt new file mode 100644 index 000000000..800cb7314 --- /dev/null +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataExt.kt @@ -0,0 +1,11 @@ +package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData + +/** + * Method that generates include data for /messages request. This method pick out proper + * params to add to the IncludeData param of the request. + */ +fun generateIncludeDataForMessages(): IncludeData = IncludeData( + tcData = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type), + campaigns = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type), + webConsentPayload = IncludeDataParam(IncludeDataParamType.RECORD_STRING.type), +) diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParam.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParam.kt new file mode 100644 index 000000000..9e5686c3b --- /dev/null +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParam.kt @@ -0,0 +1,10 @@ +package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class IncludeDataParam( + @SerialName("type") + val type: String, +) diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParamType.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParamType.kt new file mode 100644 index 000000000..7bf0869ed --- /dev/null +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/includeData/IncludeDataParamType.kt @@ -0,0 +1,13 @@ +package com.sourcepoint.cmplibrary.data.network.model.optimized.includeData + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class IncludeDataParamType( + @SerialName("type") + val type: String, +) { + STRING("string"), + RECORD_STRING("RecordString"), +} diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/MessagesBodyReq.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/MessagesBodyReq.kt new file mode 100644 index 000000000..65fc7ebdf --- /dev/null +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/MessagesBodyReq.kt @@ -0,0 +1,28 @@ +package com.sourcepoint.cmplibrary.data.network.model.optimized.messages + +import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.IncludeData +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +@Serializable +internal data class MessagesBodyReq( + @SerialName("accountId") + val accountId: Long, + @SerialName("propertyHref") + val propertyHref: String, + @SerialName("campaigns") + val campaigns: JsonObject, + @SerialName("campaignEnv") + val campaignEnv: String?, + @SerialName("consentLanguage") + val consentLanguage: String?, + @SerialName("hasCSP") + val hasCSP: Boolean, + @SerialName("includeData") + val includeData: IncludeData, + @SerialName("localState") + val localState: JsonObject?, + @SerialName("os") + val operatingSystem: OperatingSystemInfoParam, +) diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/OperatingSystemInfoParam.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/OperatingSystemInfoParam.kt new file mode 100644 index 000000000..ed8d3f7e8 --- /dev/null +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/data/network/model/optimized/messages/OperatingSystemInfoParam.kt @@ -0,0 +1,18 @@ +package com.sourcepoint.cmplibrary.data.network.model.optimized.messages + +import android.os.Build +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class OperatingSystemInfoParam( + @SerialName("name") + val name: String? = DEFAULT_ANDROID_OS_NAME, + @SerialName("version") + val version: String? = Build.VERSION.SDK_INT.toString(), +) { + + companion object { + private const val DEFAULT_ANDROID_OS_NAME = "android" + } +} diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/ConsentReq.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/ConsentReq.kt index 0e7b3139d..cb01a732a 100644 --- a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/ConsentReq.kt +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/ConsentReq.kt @@ -1,6 +1,5 @@ package com.sourcepoint.cmplibrary.model -import com.sourcepoint.cmplibrary.data.network.model.toJsonObject import com.sourcepoint.cmplibrary.exception.CampaignType import com.sourcepoint.cmplibrary.model.exposed.SPCustomConsents import org.json.JSONArray @@ -10,42 +9,6 @@ import org.json.JSONObject * REQUEST */ -internal data class ConsentReq( - val uuid: String, - val choiceId: String, - val consentLanguage: String, - val meta: String, - val propertyHref: String, - val privacyManagerId: String, - val requestUUID: String, - val accountId: Int, - val actionType: Int, - val requestFromPM: Boolean, - val pubData: JSONObject = JSONObject(), - val pmSaveAndExitVariables: JSONObject = JSONObject(), - val includeData: IncludeData = IncludeData() -) - -internal fun ConsentReq.toBodyRequest(): String { - return JSONObject() - .apply { - put("uuid", uuid) - put("choiceId", choiceId) - put("consentLanguage", consentLanguage) - put("meta", meta) - put("propertyHref", propertyHref) - put("privacyManagerId", privacyManagerId) - put("requestUUID", requestUUID) - put("accountId", accountId) - put("actionType", actionType) - put("requestFromPM", requestFromPM) - put("pubData", pubData) - put("includeData", includeData.toJsonObject()) - put("pmSaveAndExitVariables", pmSaveAndExitVariables) - } - .toString() -} - internal class CustomConsentReq( val consentUUID: String, val propertyId: Int, diff --git a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/MessageModelReq.kt b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/MessageModelReq.kt index 2a5ba3fec..51da74a15 100644 --- a/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/MessageModelReq.kt +++ b/cmplibrary/src/main/java/com/sourcepoint/cmplibrary/model/MessageModelReq.kt @@ -19,13 +19,3 @@ internal data class CampaignReqImpl( override val campaignType: CampaignType, override val groupPmId: String? = null ) : CampaignReq - -data class DataType(val type: String) -data class IncludeData( - val localState: DataType = DataType("RecordString"), - val tCData: DataType = DataType("RecordString"), - val campaigns: DataType = DataType("RecordString"), - val customVendorsResponse: DataType = DataType("RecordString"), - val messageMetaData: DataType = DataType("RecordString"), - val webConsentPayload: DataType = DataType("RecordString"), -) diff --git a/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelTest.kt b/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelTest.kt index 6999f2b0e..00d146aee 100644 --- a/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelTest.kt +++ b/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/model/optimized/MessagesApiModelTest.kt @@ -1,16 +1,9 @@ package com.sourcepoint.cmplibrary.data.network.model.optimized -import com.sourcepoint.cmplibrary.assertEquals -import com.sourcepoint.cmplibrary.assertTrue import com.sourcepoint.cmplibrary.data.network.converter.JsonConverter import com.sourcepoint.cmplibrary.data.network.converter.converter -import com.sourcepoint.cmplibrary.data.network.util.CampaignsEnv -import com.sourcepoint.cmplibrary.exception.CampaignType -import com.sourcepoint.cmplibrary.model.CampaignReqImpl import com.sourcepoint.cmplibrary.util.file2String import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.encodeToJsonElement import org.junit.Test @@ -34,38 +27,6 @@ class MessagesApiModelTest { message.campaignList[1] as GDPR } - @Test - fun `GIVEN a ConsentStatus RETURN a messages body`() { - - val json = "v7/consent_status_with_auth_id.json".file2String() - val cs = JsonConverter.converter.decodeFromString(json) - val list = listOf( - CampaignReqImpl( - targetingParams = emptyList(), - campaignsEnv = CampaignsEnv.PUBLIC, - campaignType = CampaignType.GDPR, - groupPmId = null - ) - ) - - val body = createGetMessagesRequestBody( - accountId = 22, - gdprConsentStatus = cs.consentStatusData?.gdpr?.consentStatus, - propertyHref = "tests.unified-script.com", - campaigns = list, - ccpaConsentStatus = null, - consentLanguage = null, - campaignEnv = CampaignsEnv.STAGE, - localState = JsonObject(mapOf()), - ) - - (body["accountId"] as JsonPrimitive).content.assertEquals("22") - (body["campaignEnv"] as JsonPrimitive).content.assertEquals("stage") - (body["propertyHref"] as JsonPrimitive).content.assertEquals("https://tests.unified-script.com") - (body["hasCSP"] as JsonPrimitive).content.assertEquals("false") - body.contains("campaigns").assertTrue() - } - @Test fun `GIVEN IncludeData verify the output`() { val mess = "v7/messagesObjSwitchOrder.json".file2String() diff --git a/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/util/HttpUrlManagerTest.kt b/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/util/HttpUrlManagerTest.kt index 2d2686640..0598d0d4e 100644 --- a/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/util/HttpUrlManagerTest.kt +++ b/cmplibrary/src/test/java/com/sourcepoint/cmplibrary/data/network/util/HttpUrlManagerTest.kt @@ -7,6 +7,9 @@ import com.sourcepoint.cmplibrary.assertTrue import com.sourcepoint.cmplibrary.data.network.converter.JsonConverter import com.sourcepoint.cmplibrary.data.network.converter.converter import com.sourcepoint.cmplibrary.data.network.model.optimized.* // ktlint-disable +import com.sourcepoint.cmplibrary.data.network.model.optimized.includeData.generateIncludeDataForMessages +import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.MessagesBodyReq +import com.sourcepoint.cmplibrary.data.network.model.optimized.messages.OperatingSystemInfoParam import com.sourcepoint.cmplibrary.exception.CampaignType import com.sourcepoint.cmplibrary.model.CampaignReqImpl import com.sourcepoint.cmplibrary.model.PMTab @@ -15,6 +18,7 @@ import com.sourcepoint.cmplibrary.model.exposed.ActionType import com.sourcepoint.cmplibrary.model.exposed.MessageSubCategory.* //ktlint-disable import com.sourcepoint.cmplibrary.util.file2String import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.JsonObject import org.json.JSONObject import org.junit.Test @@ -295,20 +299,26 @@ class HttpUrlManagerTest { ) ) - val body = createGetMessagesRequestBody( + val operatingSystemInfo = OperatingSystemInfoParam() + + val body = MessagesBodyReq( accountId = 22, - gdprConsentStatus = cs.consentStatusData?.gdpr?.consentStatus, - propertyHref = "tests.unified-script.com", - campaigns = list, - ccpaConsentStatus = null, + propertyHref = "https://tests.unified-script.com", + campaigns = list.toMetadataBody( + gdprConsentStatus = cs.consentStatusData?.gdpr?.consentStatus, + ccpaConsentStatus = null, + ), + campaignEnv = CampaignsEnv.STAGE.env, consentLanguage = "ES", - campaignEnv = CampaignsEnv.STAGE, + hasCSP = false, + includeData = generateIncludeDataForMessages(), localState = JsonObject(mapOf()), + operatingSystem = operatingSystemInfo, ) val param = MessagesParamReq( env = Env.PROD, - body = body.toString(), + body = JsonConverter.converter.encodeToString(body), metadataArg = JsonConverter.converter.decodeFromString("""{"ccpa":{"applies":true},"gdpr":{"applies":true}}"""), authId = null, accountId = 1212, @@ -316,6 +326,7 @@ class HttpUrlManagerTest { propertyHref = "asdfasdfasd" ) val sut = HttpUrlManagerSingleton.getMessagesUrl(param).toString() - sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/messages?env=prod&nonKeyedLocalState=%7B%7D&body={%22accountId%22:22,%22propertyHref%22:%22https://tests.unified-script.com%22,%22campaigns%22:{%22gdpr%22:{%22consentStatus%22:{%22consentedAll%22:true,%22consentedToAny%22:false,%22granularStatus%22:{%22defaultConsent%22:false,%22previousOptInAll%22:false,%22purposeConsent%22:%22ALL%22,%22purposeLegInt%22:%22ALL%22,%22vendorConsent%22:%22ALL%22,%22vendorLegInt%22:%22ALL%22},%22hasConsentData%22:false,%22rejectedAny%22:false,%22rejectedLI%22:false},%22hasLocalData%22:true,%22targetingParams%22:{}}},%22campaignEnv%22:%22stage%22,%22consentLanguage%22:%22ES%22,%22hasCSP%22:false,%22includeData%22:{%22TCData%22:{%22type%22:%22RecordString%22},%22campaigns%22:{%22type%22:%22RecordString%22},%22webConsentPayload%22:{%22type%22:%22RecordString%22}},%22localState%22:{},%22os%22:{%22name%22:%22android%22,%22version%22:%220%22}}&metadata={%20%20%22ccpa%22:%20{%20%20%20%20%22applies%22:%20true%20%20},%20%20%22gdpr%22:%20{%20%20%20%20%22applies%22:%20true%20%20}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}") + print("URL - $sut") + sut.assertEquals("https://cdn.privacy-mgmt.com/wrapper/v2/messages?env=prod&nonKeyedLocalState=%7B%7D&body={%20%20%22accountId%22:%2022,%20%20%22propertyHref%22:%20%22https://tests.unified-script.com%22,%20%20%22campaigns%22:%20{%20%20%20%20%22gdpr%22:%20{%20%20%20%20%20%20%22consentStatus%22:%20{%20%20%20%20%20%20%20%20%22consentedAll%22:%20true,%20%20%20%20%20%20%20%20%22consentedToAny%22:%20false,%20%20%20%20%20%20%20%20%22granularStatus%22:%20{%20%20%20%20%20%20%20%20%20%20%22defaultConsent%22:%20false,%20%20%20%20%20%20%20%20%20%20%22previousOptInAll%22:%20false,%20%20%20%20%20%20%20%20%20%20%22purposeConsent%22:%20%22ALL%22,%20%20%20%20%20%20%20%20%20%20%22purposeLegInt%22:%20%22ALL%22,%20%20%20%20%20%20%20%20%20%20%22vendorConsent%22:%20%22ALL%22,%20%20%20%20%20%20%20%20%20%20%22vendorLegInt%22:%20%22ALL%22%20%20%20%20%20%20%20%20},%20%20%20%20%20%20%20%20%22hasConsentData%22:%20false,%20%20%20%20%20%20%20%20%22rejectedAny%22:%20false,%20%20%20%20%20%20%20%20%22rejectedLI%22:%20false%20%20%20%20%20%20},%20%20%20%20%20%20%22hasLocalData%22:%20true,%20%20%20%20%20%20%22targetingParams%22:%20{%20%20%20%20%20%20}%20%20%20%20}%20%20},%20%20%22campaignEnv%22:%20%22stage%22,%20%20%22consentLanguage%22:%20%22ES%22,%20%20%22hasCSP%22:%20false,%20%20%22includeData%22:%20{%20%20%20%20%22TCData%22:%20{%20%20%20%20%20%20%22type%22:%20%22RecordString%22%20%20%20%20},%20%20%20%20%22campaigns%22:%20{%20%20%20%20%20%20%22type%22:%20%22RecordString%22%20%20%20%20},%20%20%20%20%22webConsentPayload%22:%20{%20%20%20%20%20%20%22type%22:%20%22RecordString%22%20%20%20%20}%20%20},%20%20%22localState%22:%20{%20%20},%20%20%22os%22:%20{%20%20%20%20%22name%22:%20%22android%22,%20%20%20%20%22version%22:%20%220%22%20%20}}&metadata={%20%20%22ccpa%22:%20{%20%20%20%20%22applies%22:%20true%20%20},%20%20%22gdpr%22:%20{%20%20%20%20%22applies%22:%20true%20%20}}&scriptType=android&scriptVersion=${BuildConfig.VERSION_NAME}") } }