package com.fireworksdk.bridge.models import org.json.JSONObject import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test class FWTrackPurchaseModelDeserializerTest { @Test fun `deserialize returns null for null json`() { assertNull(FWTrackPurchaseModelDeserializer.deserialize(null)) } @Test fun `deserialize maps all fields including V2 fields`() { val json = JSONObject( mapOf( "orderId" to "test_order_id", "value" to 16.49, "currencyCode" to "USD", "countryCode" to "US", "shippingPrice" to 1.99, "subtotal" to 17.5, "totalDiscounts" to 3.0, "products" to listOf( mapOf( "extProductId" to "test_product_id", "price" to 10.25, "quantity" to 1, "productName" to "Test product", "sku" to "test_sku", ), mapOf( "extProductId" to "test_sku_2", "price" to 3.625, "quantity" to 2, ), ), "additionalInfo" to mapOf("additionalKey1" to "additionalValue1"), ) ) val model = FWTrackPurchaseModelDeserializer.deserialize(json)!! assertEquals("test_order_id", model.orderId) assertEquals(16.49, model.value!!, 0.0) assertEquals("USD", model.currencyCode) assertEquals("US", model.countryCode) assertEquals(1.99, model.shippingPrice!!, 0.0) assertEquals(17.5, model.subtotal!!, 0.0) assertEquals(3.0, model.totalDiscounts!!, 0.0) assertEquals(mapOf("additionalKey1" to "additionalValue1"), model.additionalInfo) val products = model.products!! assertEquals(2, products.size) assertEquals( FWTrackPurchaseProduct( extProductId = "test_product_id", price = 10.25, quantity = 1, productName = "Test product", sku = "test_sku", ), products[0], ) assertEquals( FWTrackPurchaseProduct( extProductId = "test_sku_2", price = 3.625, quantity = 2, productName = null, sku = null, ), products[1], ) } @Test fun `deserialize leaves missing optional fields null`() { val json = JSONObject(mapOf("orderId" to "test_order_id")) val model = FWTrackPurchaseModelDeserializer.deserialize(json)!! assertEquals("test_order_id", model.orderId) assertNull(model.value) assertNull(model.currencyCode) assertNull(model.countryCode) assertNull(model.shippingPrice) assertNull(model.subtotal) assertNull(model.totalDiscounts) assertNull(model.products) assertNull(model.additionalInfo) } @Test fun `deserialize keeps integer amounts as doubles`() { val json = JSONObject( mapOf( "orderId" to "test_order_id", "value" to 16, "subtotal" to 17, "totalDiscounts" to 3, ) ) val model = FWTrackPurchaseModelDeserializer.deserialize(json)!! assertEquals(16.0, model.value!!, 0.0) assertEquals(17.0, model.subtotal!!, 0.0) assertEquals(3.0, model.totalDiscounts!!, 0.0) } }