From eeb710201ee97aa6ae8c5a3c35008a238ae96b4d Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 10 Feb 2025 13:58:16 +0200 Subject: [PATCH 01/10] [PAY-5475] - added BIN metadata fields --- .../com/siftscience/model/PaymentMethod.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/com/siftscience/model/PaymentMethod.java b/src/main/java/com/siftscience/model/PaymentMethod.java index bd42349a..37575c1e 100644 --- a/src/main/java/com/siftscience/model/PaymentMethod.java +++ b/src/main/java/com/siftscience/model/PaymentMethod.java @@ -35,6 +35,9 @@ public class PaymentMethod { @Expose @SerializedName("$sepa_direct_debit_mandate") private Boolean sepaDirectDebitMandate; @Expose @SerializedName("$wallet_address") private String walletAddress; @Expose @SerializedName("$wallet_type") private String walletType; + @Expose @SerializedName("$card_bin_country") private String cardBinCountry; + @Expose @SerializedName("$card_type") private String cardType; + @Expose @SerializedName("$card_brand") private String cardBrand; public String getPaymentType() { return paymentType; @@ -305,4 +308,31 @@ public PaymentMethod setWalletType(String walletType) { this.walletType = walletType; return this; } + + public String getCardBinCountry() { + return cardBinCountry; + } + + public PaymentMethod setCardBinCountry(String cardBinCountry) { + this.cardBinCountry = cardBinCountry; + return this; + } + + public String getCardType() { + return cardType; + } + + public PaymentMethod setCardType(String cardType) { + this.cardType = cardType; + return this; + } + + public String getCardBrand() { + return cardBrand; + } + + public PaymentMethod setCardBrand(String cardBrand) { + this.cardBrand = cardBrand; + return this; + } } From 193b1d983690bbf05f5114939a60be0352916377 Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 10 Feb 2025 13:58:54 +0200 Subject: [PATCH 02/10] [PAY-5495] - added amount/price USD fields --- .../java/com/siftscience/model/BaseOrderFieldSet.java | 10 ++++++++++ src/main/java/com/siftscience/model/Booking.java | 9 +++++++++ src/main/java/com/siftscience/model/Discount.java | 10 ++++++++++ src/main/java/com/siftscience/model/Item.java | 10 ++++++++++ .../com/siftscience/model/TransactionFieldSet.java | 11 ++++++++++- .../java/com/siftscience/model/WagerFieldSet.java | 10 ++++++++++ 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/siftscience/model/BaseOrderFieldSet.java b/src/main/java/com/siftscience/model/BaseOrderFieldSet.java index 98faefba..8b6c83e8 100644 --- a/src/main/java/com/siftscience/model/BaseOrderFieldSet.java +++ b/src/main/java/com/siftscience/model/BaseOrderFieldSet.java @@ -10,6 +10,7 @@ public abstract class BaseOrderFieldSet> @Expose @SerializedName("$order_id") private String orderId; @Expose @SerializedName(USER_EMAIL) private String userEmail; @Expose @SerializedName("$amount") private Long amount; + @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$billing_address") private Address billingAddress; @Expose @SerializedName("$shipping_address") private Address shippingAddress; @@ -201,4 +202,13 @@ public T setDigitalOrders(List digitalOrders) { this.digitalOrders = digitalOrders; return (T) this; } + + public Long getAmountUsd() { + return amountUsd; + } + + public T setAmountUsd(Long amountUsd) { + this.amountUsd = amountUsd; + return (T) this; + } } diff --git a/src/main/java/com/siftscience/model/Booking.java b/src/main/java/com/siftscience/model/Booking.java index ad3d40f1..6f32f23a 100644 --- a/src/main/java/com/siftscience/model/Booking.java +++ b/src/main/java/com/siftscience/model/Booking.java @@ -11,6 +11,7 @@ public class Booking { @Expose @SerializedName("$start_time") private Long startTime; @Expose @SerializedName("$end_time") private Long endTime; @Expose @SerializedName("$price") private Long price; + @Expose @SerializedName("$price_usd") private Long priceUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$quantity") private Long quantity; @Expose @SerializedName("$iata_carrier_code") private String iataCarrierCode; @@ -167,4 +168,12 @@ public Booking setTags(List tags) { return this; } + public Long getPriceUsd() { + return priceUsd; + } + + public Booking setPriceUsd(Long priceUsd) { + this.priceUsd = priceUsd; + return this; + } } diff --git a/src/main/java/com/siftscience/model/Discount.java b/src/main/java/com/siftscience/model/Discount.java index 43bc5365..b6d888c3 100644 --- a/src/main/java/com/siftscience/model/Discount.java +++ b/src/main/java/com/siftscience/model/Discount.java @@ -6,6 +6,7 @@ public class Discount { @Expose @SerializedName("$percentage_off") private Double percentageOff; @Expose @SerializedName("$amount") private Long amount; + @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$minimum_purchase_amount") private Long minimumPurchaseAmount; @@ -44,4 +45,13 @@ public Discount setMinimumPurchaseAmount(Long minimumPurchaseAmount) { this.minimumPurchaseAmount = minimumPurchaseAmount; return this; } + + public Long getAmountUsd() { + return amountUsd; + } + + public Discount setAmountUsd(Long amountUsd) { + this.amountUsd = amountUsd; + return this; + } } diff --git a/src/main/java/com/siftscience/model/Item.java b/src/main/java/com/siftscience/model/Item.java index 65ebbe7f..ec19d249 100644 --- a/src/main/java/com/siftscience/model/Item.java +++ b/src/main/java/com/siftscience/model/Item.java @@ -9,6 +9,7 @@ public class Item { @Expose @SerializedName("$item_id") private String itemId; @Expose @SerializedName("$product_title") private String productTitle; @Expose @SerializedName("$price") private Long price; + @Expose @SerializedName("$price_usd") private Long priceUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$quantity") private Long quantity; @Expose @SerializedName("$upc") private String upc; @@ -146,4 +147,13 @@ public Item setQuantity(Long quantity) { this.quantity = quantity; return this; } + + public Long getPriceUsd() { + return priceUsd; + } + + public Item setPriceUsd(Long priceUsd) { + this.priceUsd = priceUsd; + return this; + } } diff --git a/src/main/java/com/siftscience/model/TransactionFieldSet.java b/src/main/java/com/siftscience/model/TransactionFieldSet.java index 4e55f547..5f2b0729 100644 --- a/src/main/java/com/siftscience/model/TransactionFieldSet.java +++ b/src/main/java/com/siftscience/model/TransactionFieldSet.java @@ -7,6 +7,7 @@ public class TransactionFieldSet extends BaseAppBrowserSiteBrandFieldSet { @Expose @SerializedName("$amount") private Long amount; + @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName(USER_EMAIL) private String userEmail; @Expose @SerializedName("$transaction_type") private String transactionType; @@ -38,7 +39,6 @@ public class TransactionFieldSet extends BaseAppBrowserSiteBrandFieldSet { @Expose @SerializedName("$wager_type") private String wagerType; @Expose @SerializedName("$wager_status") private String wagerStatus; @Expose @SerializedName("$amount") private Long amount; + @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$wager_event_type") private String wagerEventType; @Expose @SerializedName("$wager_event_name") private String wagerEventName; @@ -104,4 +105,13 @@ public WagerFieldSet setMinimumWagerAmount(Long minimumWagerAmount) { this.minimumWagerAmount = minimumWagerAmount; return this; } + + public Long getAmountUsd() { + return amountUsd; + } + + public WagerFieldSet setAmountUsd(Long amountUsd) { + this.amountUsd = amountUsd; + return this; + } } From 865a6e209a543e07b2aaa7ed659022d46fbbe8ee Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 10 Feb 2025 13:59:07 +0200 Subject: [PATCH 03/10] unit tests --- .../com/siftscience/CreateOrderEventTest.java | 105 ++++++++++++++++++ .../java/com/siftscience/SiftRequestTest.java | 2 +- src/test/java/com/siftscience/TestUtils.java | 65 ++++++++--- .../com/siftscience/TransactionEventTest.java | 71 ++++++++++++ .../com/siftscience/UpdateOrderEventTest.java | 81 ++++++++++++++ .../com/siftscience/WagerFieldSetTest.java | 6 +- 6 files changed, 313 insertions(+), 17 deletions(-) diff --git a/src/test/java/com/siftscience/CreateOrderEventTest.java b/src/test/java/com/siftscience/CreateOrderEventTest.java index ae756693..4280cfda 100644 --- a/src/test/java/com/siftscience/CreateOrderEventTest.java +++ b/src/test/java/com/siftscience/CreateOrderEventTest.java @@ -2,6 +2,7 @@ import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; import static java.net.HttpURLConnection.HTTP_OK; +import static java.util.Collections.singletonList; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -1045,4 +1046,108 @@ public void testCreateOrderEventWithCryptoFields() throws JSONException, IOExcep server.shutdown(); } + + @Test + public void testCreateOrderEventBookingWithPromoWithAmountUsd() throws JSONException, + IOException, InterruptedException { + + // The expected JSON payload of the request. + String expectedRequestBody = "{\n" + + " \"$type\" : \"$create_order\",\n" + + " \"$api_key\" : \"YOUR_API_KEY\",\n" + + " \"$user_id\" : \"billy_jones_301\",\n" + + "\n" + + " \"$order_id\" : \"ORDER-28168441\",\n" + + " \"$user_email\" : \"bill@gmail.com\",\n" + + " \"$amount\" : 115940000,\n" + + " \"$amount_usd\" : 155540000,\n" + + " \"$currency_code\" : \"EUR\",\n" + + " \"$payment_methods\" : [\n" + + " {\n" + + " \"$payment_type\" : \"$credit_card\",\n" + + " \"$payment_gateway\" : \"$braintree\",\n" + + " \"$card_bin\" : \"542486\",\n" + + " \"$card_last4\" : \"4444\",\n" + + " \"$card_bin_country\": \"US\",\n" + + " \"$card_type\" : \"Gold\",\n" + + " \"$card_brand\" : \"Visa\"\n" + + " }\n" + + " ],\n" + + " \"$bookings\": [\n" + + " {\n" + + " \"$booking_type\": \"$flight\",\n" + + " \"$title\": \"SFO - LAS, 2 Adults\",\n" + + " \"$start_time\": 12038412903,\n" + + " \"$end_time\": 12048412903,\n" + + " \"$price\": 49900000,\n" + + " \"$price_usd\": 55500000,\n" + + " \"$currency_code\": \"EUR\",\n" + + " \"$quantity\": 1,\n" + + " }\n" + + " ],\n" + + "\n" + + " \"$promotions\" : [\n" + + " {\n" + + " \"$promotion_id\" : \"FirstTimeBuyer\",\n" + + " \"$status\" : \"$success\",\n" + + " \"$description\" : \"$5 off\",\n" + + " \"$discount\" : {\n" + + " \"$amount\" : 5000000,\n" + + " \"$amount_usd\" : 5550000,\n" + + " \"$currency_code\" : \"EUR\"\n" + + " }\n" + + " }\n" + + " ]\n" + + "}"; + + // Start a new mock server and enqueue a mock response. + MockWebServer server = new MockWebServer(); + MockResponse response = new MockResponse(); + response.setResponseCode(HTTP_OK); + response.setBody("{\n" + + " \"status\" : 0,\n" + + " \"error_message\" : \"OK\",\n" + + " \"time\" : 1327604222,\n" + + " \"request\" : \"" + TestUtils.unescapeJson(expectedRequestBody) + "\"\n" + + "}"); + server.enqueue(response); + server.start(); + + // Create a new client and link it to the mock server. + SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID", + new OkHttpClient.Builder() + .addInterceptor(OkHttpUtils.urlRewritingInterceptor(server)) + .build()); + + // Build and execute the request against the mock server. + EventRequest request = client.buildRequest( + new CreateOrderFieldSet() + .setUserId("billy_jones_301") + .setOrderId("ORDER-28168441") + .setUserEmail("bill@gmail.com") + .setAmount(115940000L) + .setAmountUsd(155540000L) + .setCurrencyCode("EUR") + .setPaymentMethods(singletonList(TestUtils.samplePaymentMethodBinMetadata())) + .setBookings(singletonList(TestUtils.sampleBookingWithPriceUsd())) + .setPromotions(singletonList(TestUtils.samplePromotionWithAmountUsd())) + ); + + EventResponse siftResponse = request.send(); + + // Verify the request. + RecordedRequest request1 = server.takeRequest(); + Assert.assertEquals("POST", request1.getMethod()); + Assert.assertEquals("/v205/events", request1.getPath()); + JSONAssert.assertEquals(expectedRequestBody, request.getFieldSet().toJson(), true); + + // Verify the response. + Assert.assertEquals(HTTP_OK, siftResponse.getHttpStatusCode()); + Assert.assertNotNull(siftResponse.getBody()); + Assert.assertEquals(0, (int) siftResponse.getBody().getStatus()); + JSONAssert.assertEquals(response.getBody().readUtf8(), + siftResponse.getBody().toJson(), true); + + server.shutdown(); + } } diff --git a/src/test/java/com/siftscience/SiftRequestTest.java b/src/test/java/com/siftscience/SiftRequestTest.java index 48824990..e0f64501 100644 --- a/src/test/java/com/siftscience/SiftRequestTest.java +++ b/src/test/java/com/siftscience/SiftRequestTest.java @@ -29,7 +29,7 @@ public void testUserAgentHeader() throws Exception { // then RecordedRequest recordedRequest = server.takeRequest(); - assertEquals("SiftScience/v205 sift-java/3.17.1", + assertEquals("SiftScience/v205 sift-java/3.18.0", recordedRequest.getHeader("User-Agent")); } diff --git a/src/test/java/com/siftscience/TestUtils.java b/src/test/java/com/siftscience/TestUtils.java index 48342149..aa8ecea3 100644 --- a/src/test/java/com/siftscience/TestUtils.java +++ b/src/test/java/com/siftscience/TestUtils.java @@ -45,14 +45,6 @@ static Address sampleAddress2() { .setZipCode("03257"); } - static Address sampleAddress3() { - return new Address() - .setCity("Seattle") - .setRegion("Washington") - .setCountry("US") - .setZipCode("98112"); - } - static PaymentMethod samplePaymentMethod1() { return new PaymentMethod() .setPaymentType("$credit_card") @@ -68,6 +60,16 @@ static PaymentMethod samplePaymentMethod2() { .setCardLast4("4444"); } + static PaymentMethod samplePaymentMethodBinMetadata() { + return new PaymentMethod() + .setPaymentType("$credit_card") + .setPaymentGateway("$braintree") + .setCardBin("542486") + .setCardLast4("4444") + .setCardBinCountry("US") + .setCardBrand("Visa") + .setCardType("Gold"); + } static PaymentMethod samplePaymentMethodAch() { return new PaymentMethod() @@ -170,6 +172,22 @@ static Item sampleItem2() { .setQuantity(2L); } + static Item sampleItemPriceUsd() { + return new Item() + .setItemId("B004834GQO") + .setProductTitle("The Slanket Blanket-Texas Tea") + .setPrice(39990000L) + .setPriceUsd(44490000L) + .setUpc("67862114510011") + .setSku("004834GQ") + .setBrand("Slanket") + .setManufacturer("Slanket") + .setCategory("Blankets & Throws") + .setTags(sampleTags2()) + .setColor("Texas Tea") + .setQuantity(2L); + } + static Booking sampleBooking() { List guests = new ArrayList<>(); guests.add(sampleGuest1()); @@ -192,6 +210,18 @@ static Booking sampleBooking() { .setQuantity(1L); } + static Booking sampleBookingWithPriceUsd() { + return new Booking() + .setBookingType("$flight") + .setTitle("SFO - LAS, 2 Adults") + .setStartTime(12038412903L) + .setEndTime(12048412903L) + .setPrice(49900000L) + .setPriceUsd(55500000L) + .setCurrencyCode("EUR") + .setQuantity(1L); + } + static OrderedFrom sampleOrderedFrom() { return new OrderedFrom() .setStoreId("123") @@ -239,6 +269,13 @@ static Discount sampleDiscount2() { .setCurrencyCode("USD"); } + static Discount sampleDiscountWithAmountUsd() { + return new Discount() + .setAmount(5000000L) + .setAmountUsd(5550000L) + .setCurrencyCode("EUR"); + } + static CreditPoint sampleCreditPoint() { return new CreditPoint() .setAmount(100L) @@ -270,11 +307,11 @@ static Promotion samplePromotion3() { .setDiscount(sampleDiscount2()); } - static List sampleCategories() { - List categories = new ArrayList<>(); - categories.add("Housing"); - categories.add("Apartments"); - categories.add("2 Bedrooms"); - return categories; + static Promotion samplePromotionWithAmountUsd() { + return new Promotion() + .setPromotionId("FirstTimeBuyer") + .setStatus("$success") + .setDescription("$5 off") + .setDiscount(sampleDiscountWithAmountUsd()); } } diff --git a/src/test/java/com/siftscience/TransactionEventTest.java b/src/test/java/com/siftscience/TransactionEventTest.java index 9077ebd9..571feb7b 100644 --- a/src/test/java/com/siftscience/TransactionEventTest.java +++ b/src/test/java/com/siftscience/TransactionEventTest.java @@ -794,4 +794,75 @@ public void testTransactionEventWithExtraWithdrawalFields() throws Exception { server.shutdown(); } + + @Test + public void testTransactionEventWithAmountUsdAndBinMetadata() throws Exception { + String expectedRequestBody = "{\n" + + " \"$type\" : \"$transaction\",\n" + + " \"$api_key\" : \"YOUR_API_KEY\",\n" + + " \"$user_id\" : \"billy_jones_301\",\n" + + " \"$amount\" : 506790000,\n" + + " \"$amount_usd\" : 555790000,\n" + + " \"$currency_code\" : \"EUR\",\n" + + "\n" + + " \"$user_email\" : \"bill@gmail.com\",\n" + + " \"$transaction_type\" : \"$buy\",\n" + + " \"$transaction_id\" : \"719637215\",\n" + + "\n" + + " \"$payment_method\" : {\n" + + " \"$payment_type\" : \"$credit_card\",\n" + + " \"$payment_gateway\" : \"$braintree\",\n" + + " \"$card_bin\" : \"542486\",\n" + + " \"$card_last4\" : \"4444\",\n" + + " \"$card_bin_country\": \"US\",\n" + + " \"$card_type\" : \"Gold\",\n" + + " \"$card_brand\" : \"Visa\"\n" + + " },\n" + + "}"; + + // Start a new mock server and enqueue a mock response. + MockWebServer server = new MockWebServer(); + MockResponse response = new MockResponse(); + response.setResponseCode(HTTP_OK); + response.setBody("{\n" + + " \"status\" : 0,\n" + + " \"error_message\" : \"OK\",\n" + + " \"time\" : 1327604222,\n" + + " \"request\" : \"" + TestUtils.unescapeJson(expectedRequestBody) + "\"\n" + + "}"); + server.enqueue(response); + server.start(); + + // Create a new client and link it to the mock server. + SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID", + new OkHttpClient.Builder() + .addInterceptor(OkHttpUtils.urlRewritingInterceptor(server)) + .build()); + + // Build and execute the request against the mock server. + EventRequest request = client.buildRequest(new TransactionFieldSet() + .setUserId("billy_jones_301") + .setAmount(506790000L) + .setAmountUsd(555790000L) + .setCurrencyCode("EUR") + .setUserEmail("bill@gmail.com") + .setTransactionType("$buy") + .setTransactionId("719637215") + .setPaymentMethod(TestUtils.samplePaymentMethodBinMetadata())); + EventResponse siftResponse = request.send(); + + // Verify the request. + RecordedRequest request1 = server.takeRequest(); + Assert.assertEquals("POST", request1.getMethod()); + Assert.assertEquals("/v205/events", request1.getPath()); + JSONAssert.assertEquals(expectedRequestBody, request.getFieldSet().toJson(), true); + + // Verify the response. + Assert.assertEquals(HTTP_OK, siftResponse.getHttpStatusCode()); + Assert.assertEquals(0, (int) siftResponse.getBody().getStatus()); + JSONAssert.assertEquals(response.getBody().readUtf8(), + siftResponse.getBody().toJson(), true); + + server.shutdown(); + } } diff --git a/src/test/java/com/siftscience/UpdateOrderEventTest.java b/src/test/java/com/siftscience/UpdateOrderEventTest.java index 7f3a2096..06393847 100644 --- a/src/test/java/com/siftscience/UpdateOrderEventTest.java +++ b/src/test/java/com/siftscience/UpdateOrderEventTest.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import com.siftscience.exception.InvalidFieldException; @@ -1041,4 +1042,84 @@ public void testUpdateOrderEventWithCryptoFields() server.shutdown(); } + + @Test + public void testUpdateOrderEventWithItemsPriceUsd() + throws JSONException, IOException, InterruptedException { + + // The expected JSON payload of the request. + String expectedRequestBody = "{\n" + + " \"$type\": \"$update_order\",\n" + + " \"$api_key\": \"YOUR_API_KEY\",\n" + + " \"$user_id\": \"billy_jones_301\",\n" + + " \"$order_id\": \"ORDER-28168441\",\n" + + " \"$user_email\": \"bill@gmail.com\",\n" + + " \"$amount\": 115940000,\n" + + " \"$amount_usd\": 155540000,\n" + + " \"$currency_code\": \"EUR\",\n" + + " \"$items\" : [\n" + + " {\n" + + " \"$item_id\" : \"B004834GQO\",\n" + + " \"$product_title\" : \"The Slanket Blanket-Texas Tea\",\n" + + " \"$price\" : 39990000,\n" + + " \"$price_usd\" : 44490000,\n" + + " \"$upc\" : \"67862114510011\",\n" + + " \"$sku\" : \"004834GQ\",\n" + + " \"$brand\" : \"Slanket\",\n" + + " \"$manufacturer\" : \"Slanket\",\n" + + " \"$category\" : \"Blankets & Throws\",\n" + + " \"$tags\" : [\"Awesome\", \"Wintertime specials\"],\n" + + " \"$color\" : \"Texas Tea\",\n" + + " \"$quantity\" : 2\n" + + " }\n" + + " ],\n" + + "}\n"; + + // Start a new mock server and enqueue a mock response. + MockWebServer server = new MockWebServer(); + MockResponse response = new MockResponse(); + response.setResponseCode(HTTP_OK); + response.setBody("{\n" + + " \"status\" : 0,\n" + + " \"error_message\" : \"OK\",\n" + + " \"time\" : 1327604222,\n" + + " \"request\" : \"" + TestUtils.unescapeJson(expectedRequestBody) + "\"\n" + + "}"); + server.enqueue(response); + server.start(); + + // Create a new client and link it to the mock server. + SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID", + new OkHttpClient.Builder() + .addInterceptor(OkHttpUtils.urlRewritingInterceptor(server)) + .build()); + + // Build and execute the request against the mock server. + EventRequest request = client.buildRequest( + new UpdateOrderFieldSet() + .setUserId("billy_jones_301") + .setOrderId("ORDER-28168441") + .setUserEmail("bill@gmail.com") + .setAmount(115940000L) + .setAmountUsd(155540000L) + .setCurrencyCode("EUR") + .setItems(Collections.singletonList(TestUtils.sampleItemPriceUsd())) + ); + + EventResponse siftResponse = request.send(); + + // Verify the request. + RecordedRequest request1 = server.takeRequest(); + Assert.assertEquals("POST", request1.getMethod()); + Assert.assertEquals("/v205/events", request1.getPath()); + JSONAssert.assertEquals(expectedRequestBody, request.getFieldSet().toJson(), true); + + // Verify the response. + Assert.assertEquals(HTTP_OK, siftResponse.getHttpStatusCode()); + Assert.assertEquals(0, (int) siftResponse.getBody().getStatus()); + JSONAssert.assertEquals(response.getBody().readUtf8(), + siftResponse.getBody().toJson(), true); + + server.shutdown(); + } } diff --git a/src/test/java/com/siftscience/WagerFieldSetTest.java b/src/test/java/com/siftscience/WagerFieldSetTest.java index dfd296c7..12d03c85 100644 --- a/src/test/java/com/siftscience/WagerFieldSetTest.java +++ b/src/test/java/com/siftscience/WagerFieldSetTest.java @@ -22,7 +22,8 @@ public void testWagerEvent() throws Exception { " \"$wager_type\" : \"win_1\",\n" + " \"$wager_status\" : \"$accept\",\n" + " \"$amount\" : 506790000,\n" + - " \"$currency_code\" : \"USD\",\n" + + " \"$amount_usd\" : 555790000,\n" + + " \"$currency_code\" : \"EUR\",\n" + " \"$wager_event_type\" : \"sportsbook\",\n" + " \"$wager_event_name\" : \"NFL\",\n" + " \"$wager_event_id\" : \"NFL_2024_N1234\",\n" + @@ -55,7 +56,8 @@ public void testWagerEvent() throws Exception { .setWagerType("win_1") .setWagerStatus("$accept") .setAmount(506790000L) - .setCurrencyCode("USD") + .setAmountUsd(555790000L) + .setCurrencyCode("EUR") .setWagerEventType("sportsbook") .setWagerEventName("NFL") .setWagerEventId("NFL_2024_N1234") From 8b2bbdc723091365e8ce0f8131305cc8e3b1bf8a Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 10 Feb 2025 13:59:27 +0200 Subject: [PATCH 04/10] lib version update --- CHANGES.MD | 6 ++++++ README.md | 4 ++-- build.gradle | 2 +- src/main/java/com/siftscience/Constants.java | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES.MD b/CHANGES.MD index db040d29..b3424a70 100644 --- a/CHANGES.MD +++ b/CHANGES.MD @@ -1,3 +1,9 @@ +3.18.0 (2025-01-11) +================= +- Added support for `$amount_usd` in `$transaction`, `$create_order`, `$update_order`, `$wager` event types and in `$discount` complex field +- Added support for `$price_usd` in `$booking` and `$item` complex fields +- Added support for `$card_bin_country`, `$card_type`, and `$card_brand` for `$payment_method` complex type + 3.17.1 (2024-12-31) ================= - Included HTTP Status codes into `SiftException` message when possible diff --git a/README.md b/README.md index 6b3d4da2..13c06d15 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ Java 1.7 or later. com.siftscience sift-java - 3.17.1 + 3.18.0 ``` ### Gradle ``` dependencies { - compile 'com.siftscience:sift-java:3.17.1' + compile 'com.siftscience:sift-java:3.18.0' } ``` ### Other diff --git a/build.gradle b/build.gradle index 0ed34634..70b8bf0f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'signing' apply plugin: 'java-library-distribution' group = 'com.siftscience' -version = '3.17.1' +version = '3.18.0' repositories { mavenCentral() diff --git a/src/main/java/com/siftscience/Constants.java b/src/main/java/com/siftscience/Constants.java index 90499cf7..4458a705 100644 --- a/src/main/java/com/siftscience/Constants.java +++ b/src/main/java/com/siftscience/Constants.java @@ -3,6 +3,6 @@ public class Constants { public static final String API_VERSION = "v205"; - public static final String LIB_VERSION = "3.17.1"; + public static final String LIB_VERSION = "3.18.0"; public static final String USER_AGENT_HEADER = String.format("SiftScience/%s sift-java/%s", API_VERSION, LIB_VERSION); } From da5f7b7870cf6b23af36f1e34c088ab59ec6fdf3 Mon Sep 17 00:00:00 2001 From: ademianenko Date: Wed, 12 Feb 2025 14:18:24 +0200 Subject: [PATCH 05/10] changelog fix --- CHANGES.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.MD b/CHANGES.MD index b3424a70..421ba12b 100644 --- a/CHANGES.MD +++ b/CHANGES.MD @@ -1,4 +1,4 @@ -3.18.0 (2025-01-11) +3.18.0 (2025-02-13) ================= - Added support for `$amount_usd` in `$transaction`, `$create_order`, `$update_order`, `$wager` event types and in `$discount` complex field - Added support for `$price_usd` in `$booking` and `$item` complex fields From 48735e2020915b949dea7db6912dafa5505b7525 Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 24 Mar 2025 12:23:20 +0200 Subject: [PATCH 06/10] CardBinMetadata --- .../siftscience/model/CardBinMetadata.java | 58 +++++++++++++++++++ .../com/siftscience/model/PaymentMethod.java | 30 ++-------- 2 files changed, 63 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/siftscience/model/CardBinMetadata.java diff --git a/src/main/java/com/siftscience/model/CardBinMetadata.java b/src/main/java/com/siftscience/model/CardBinMetadata.java new file mode 100644 index 00000000..ad18943f --- /dev/null +++ b/src/main/java/com/siftscience/model/CardBinMetadata.java @@ -0,0 +1,58 @@ +package com.siftscience.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class CardBinMetadata { + @Expose + @SerializedName("$country") private String country; + @Expose @SerializedName("$level") private String level; + @Expose @SerializedName("$type") private String type; + @Expose @SerializedName("$brand") private Address brand; + @Expose @SerializedName("$bank") private Address bank; + + public String getCountry() { + return country; + } + + public CardBinMetadata setCountry(String country) { + this.country = country; + return this; + } + + public String getLevel() { + return level; + } + + public CardBinMetadata setLevel(String level) { + this.level = level; + return this; + } + + public String getType() { + return type; + } + + public CardBinMetadata setType(String type) { + this.type = type; + return this; + } + + public Address getBrand() { + return brand; + } + + public CardBinMetadata setBrand(Address brand) { + this.brand = brand; + return this; + } + + public Address getBank() { + return bank; + } + + public CardBinMetadata setBank(Address bank) { + this.bank = bank; + return this; + } +} diff --git a/src/main/java/com/siftscience/model/PaymentMethod.java b/src/main/java/com/siftscience/model/PaymentMethod.java index 37575c1e..9fcd96be 100644 --- a/src/main/java/com/siftscience/model/PaymentMethod.java +++ b/src/main/java/com/siftscience/model/PaymentMethod.java @@ -35,9 +35,7 @@ public class PaymentMethod { @Expose @SerializedName("$sepa_direct_debit_mandate") private Boolean sepaDirectDebitMandate; @Expose @SerializedName("$wallet_address") private String walletAddress; @Expose @SerializedName("$wallet_type") private String walletType; - @Expose @SerializedName("$card_bin_country") private String cardBinCountry; - @Expose @SerializedName("$card_type") private String cardType; - @Expose @SerializedName("$card_brand") private String cardBrand; + @Expose @SerializedName("$card_bin_metadata") private CardBinMetadata cardBinMetadata; public String getPaymentType() { return paymentType; @@ -309,30 +307,12 @@ public PaymentMethod setWalletType(String walletType) { return this; } - public String getCardBinCountry() { - return cardBinCountry; + public CardBinMetadata getCardBinMetadata() { + return cardBinMetadata; } - public PaymentMethod setCardBinCountry(String cardBinCountry) { - this.cardBinCountry = cardBinCountry; - return this; - } - - public String getCardType() { - return cardType; - } - - public PaymentMethod setCardType(String cardType) { - this.cardType = cardType; - return this; - } - - public String getCardBrand() { - return cardBrand; - } - - public PaymentMethod setCardBrand(String cardBrand) { - this.cardBrand = cardBrand; + public PaymentMethod setCardBinMetadata(CardBinMetadata cardBinMetadata) { + this.cardBinMetadata = cardBinMetadata; return this; } } From fb250d54825b776233b23ea540af31e5590b3069 Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 24 Mar 2025 12:23:26 +0200 Subject: [PATCH 07/10] Revert "[PAY-5495] - added amount/price USD fields" This reverts commit 193b1d983690bbf05f5114939a60be0352916377. --- .../java/com/siftscience/model/BaseOrderFieldSet.java | 10 ---------- src/main/java/com/siftscience/model/Booking.java | 9 --------- src/main/java/com/siftscience/model/Discount.java | 10 ---------- src/main/java/com/siftscience/model/Item.java | 10 ---------- .../com/siftscience/model/TransactionFieldSet.java | 11 +---------- .../java/com/siftscience/model/WagerFieldSet.java | 10 ---------- 6 files changed, 1 insertion(+), 59 deletions(-) diff --git a/src/main/java/com/siftscience/model/BaseOrderFieldSet.java b/src/main/java/com/siftscience/model/BaseOrderFieldSet.java index 8b6c83e8..98faefba 100644 --- a/src/main/java/com/siftscience/model/BaseOrderFieldSet.java +++ b/src/main/java/com/siftscience/model/BaseOrderFieldSet.java @@ -10,7 +10,6 @@ public abstract class BaseOrderFieldSet> @Expose @SerializedName("$order_id") private String orderId; @Expose @SerializedName(USER_EMAIL) private String userEmail; @Expose @SerializedName("$amount") private Long amount; - @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$billing_address") private Address billingAddress; @Expose @SerializedName("$shipping_address") private Address shippingAddress; @@ -202,13 +201,4 @@ public T setDigitalOrders(List digitalOrders) { this.digitalOrders = digitalOrders; return (T) this; } - - public Long getAmountUsd() { - return amountUsd; - } - - public T setAmountUsd(Long amountUsd) { - this.amountUsd = amountUsd; - return (T) this; - } } diff --git a/src/main/java/com/siftscience/model/Booking.java b/src/main/java/com/siftscience/model/Booking.java index 6f32f23a..ad3d40f1 100644 --- a/src/main/java/com/siftscience/model/Booking.java +++ b/src/main/java/com/siftscience/model/Booking.java @@ -11,7 +11,6 @@ public class Booking { @Expose @SerializedName("$start_time") private Long startTime; @Expose @SerializedName("$end_time") private Long endTime; @Expose @SerializedName("$price") private Long price; - @Expose @SerializedName("$price_usd") private Long priceUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$quantity") private Long quantity; @Expose @SerializedName("$iata_carrier_code") private String iataCarrierCode; @@ -168,12 +167,4 @@ public Booking setTags(List tags) { return this; } - public Long getPriceUsd() { - return priceUsd; - } - - public Booking setPriceUsd(Long priceUsd) { - this.priceUsd = priceUsd; - return this; - } } diff --git a/src/main/java/com/siftscience/model/Discount.java b/src/main/java/com/siftscience/model/Discount.java index b6d888c3..43bc5365 100644 --- a/src/main/java/com/siftscience/model/Discount.java +++ b/src/main/java/com/siftscience/model/Discount.java @@ -6,7 +6,6 @@ public class Discount { @Expose @SerializedName("$percentage_off") private Double percentageOff; @Expose @SerializedName("$amount") private Long amount; - @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$minimum_purchase_amount") private Long minimumPurchaseAmount; @@ -45,13 +44,4 @@ public Discount setMinimumPurchaseAmount(Long minimumPurchaseAmount) { this.minimumPurchaseAmount = minimumPurchaseAmount; return this; } - - public Long getAmountUsd() { - return amountUsd; - } - - public Discount setAmountUsd(Long amountUsd) { - this.amountUsd = amountUsd; - return this; - } } diff --git a/src/main/java/com/siftscience/model/Item.java b/src/main/java/com/siftscience/model/Item.java index ec19d249..65ebbe7f 100644 --- a/src/main/java/com/siftscience/model/Item.java +++ b/src/main/java/com/siftscience/model/Item.java @@ -9,7 +9,6 @@ public class Item { @Expose @SerializedName("$item_id") private String itemId; @Expose @SerializedName("$product_title") private String productTitle; @Expose @SerializedName("$price") private Long price; - @Expose @SerializedName("$price_usd") private Long priceUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$quantity") private Long quantity; @Expose @SerializedName("$upc") private String upc; @@ -147,13 +146,4 @@ public Item setQuantity(Long quantity) { this.quantity = quantity; return this; } - - public Long getPriceUsd() { - return priceUsd; - } - - public Item setPriceUsd(Long priceUsd) { - this.priceUsd = priceUsd; - return this; - } } diff --git a/src/main/java/com/siftscience/model/TransactionFieldSet.java b/src/main/java/com/siftscience/model/TransactionFieldSet.java index 5f2b0729..4e55f547 100644 --- a/src/main/java/com/siftscience/model/TransactionFieldSet.java +++ b/src/main/java/com/siftscience/model/TransactionFieldSet.java @@ -7,7 +7,6 @@ public class TransactionFieldSet extends BaseAppBrowserSiteBrandFieldSet { @Expose @SerializedName("$amount") private Long amount; - @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName(USER_EMAIL) private String userEmail; @Expose @SerializedName("$transaction_type") private String transactionType; @@ -39,6 +38,7 @@ public class TransactionFieldSet extends BaseAppBrowserSiteBrandFieldSet { @Expose @SerializedName("$wager_type") private String wagerType; @Expose @SerializedName("$wager_status") private String wagerStatus; @Expose @SerializedName("$amount") private Long amount; - @Expose @SerializedName("$amount_usd") private Long amountUsd; @Expose @SerializedName("$currency_code") private String currencyCode; @Expose @SerializedName("$wager_event_type") private String wagerEventType; @Expose @SerializedName("$wager_event_name") private String wagerEventName; @@ -105,13 +104,4 @@ public WagerFieldSet setMinimumWagerAmount(Long minimumWagerAmount) { this.minimumWagerAmount = minimumWagerAmount; return this; } - - public Long getAmountUsd() { - return amountUsd; - } - - public WagerFieldSet setAmountUsd(Long amountUsd) { - this.amountUsd = amountUsd; - return this; - } } From a967c1c254a81852d9af13637fb762310c6e525d Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 24 Mar 2025 13:49:11 +0200 Subject: [PATCH 08/10] CardBinMetadata and tests --- CHANGES.MD | 6 +- .../siftscience/model/CardBinMetadata.java | 12 +- .../com/siftscience/CreateOrderEventTest.java | 105 ------------------ src/test/java/com/siftscience/TestUtils.java | 53 --------- .../com/siftscience/TransactionEventTest.java | 33 ++++-- .../com/siftscience/UpdateOrderEventTest.java | 81 -------------- .../com/siftscience/WagerFieldSetTest.java | 6 +- 7 files changed, 32 insertions(+), 264 deletions(-) diff --git a/CHANGES.MD b/CHANGES.MD index 421ba12b..a5c1b4fd 100644 --- a/CHANGES.MD +++ b/CHANGES.MD @@ -1,8 +1,6 @@ -3.18.0 (2025-02-13) +3.18.0 (2025-03-28) ================= -- Added support for `$amount_usd` in `$transaction`, `$create_order`, `$update_order`, `$wager` event types and in `$discount` complex field -- Added support for `$price_usd` in `$booking` and `$item` complex fields -- Added support for `$card_bin_country`, `$card_type`, and `$card_brand` for `$payment_method` complex type +- Added support for `$card_bin_metadata` complex field to `$payment_method` 3.17.1 (2024-12-31) ================= diff --git a/src/main/java/com/siftscience/model/CardBinMetadata.java b/src/main/java/com/siftscience/model/CardBinMetadata.java index ad18943f..64cf6074 100644 --- a/src/main/java/com/siftscience/model/CardBinMetadata.java +++ b/src/main/java/com/siftscience/model/CardBinMetadata.java @@ -8,8 +8,8 @@ public class CardBinMetadata { @SerializedName("$country") private String country; @Expose @SerializedName("$level") private String level; @Expose @SerializedName("$type") private String type; - @Expose @SerializedName("$brand") private Address brand; - @Expose @SerializedName("$bank") private Address bank; + @Expose @SerializedName("$brand") private String brand; + @Expose @SerializedName("$bank") private String bank; public String getCountry() { return country; @@ -38,20 +38,20 @@ public CardBinMetadata setType(String type) { return this; } - public Address getBrand() { + public String getBrand() { return brand; } - public CardBinMetadata setBrand(Address brand) { + public CardBinMetadata setBrand(String brand) { this.brand = brand; return this; } - public Address getBank() { + public String getBank() { return bank; } - public CardBinMetadata setBank(Address bank) { + public CardBinMetadata setBank(String bank) { this.bank = bank; return this; } diff --git a/src/test/java/com/siftscience/CreateOrderEventTest.java b/src/test/java/com/siftscience/CreateOrderEventTest.java index 4280cfda..ae756693 100644 --- a/src/test/java/com/siftscience/CreateOrderEventTest.java +++ b/src/test/java/com/siftscience/CreateOrderEventTest.java @@ -2,7 +2,6 @@ import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; import static java.net.HttpURLConnection.HTTP_OK; -import static java.util.Collections.singletonList; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -1046,108 +1045,4 @@ public void testCreateOrderEventWithCryptoFields() throws JSONException, IOExcep server.shutdown(); } - - @Test - public void testCreateOrderEventBookingWithPromoWithAmountUsd() throws JSONException, - IOException, InterruptedException { - - // The expected JSON payload of the request. - String expectedRequestBody = "{\n" + - " \"$type\" : \"$create_order\",\n" + - " \"$api_key\" : \"YOUR_API_KEY\",\n" + - " \"$user_id\" : \"billy_jones_301\",\n" + - "\n" + - " \"$order_id\" : \"ORDER-28168441\",\n" + - " \"$user_email\" : \"bill@gmail.com\",\n" + - " \"$amount\" : 115940000,\n" + - " \"$amount_usd\" : 155540000,\n" + - " \"$currency_code\" : \"EUR\",\n" + - " \"$payment_methods\" : [\n" + - " {\n" + - " \"$payment_type\" : \"$credit_card\",\n" + - " \"$payment_gateway\" : \"$braintree\",\n" + - " \"$card_bin\" : \"542486\",\n" + - " \"$card_last4\" : \"4444\",\n" + - " \"$card_bin_country\": \"US\",\n" + - " \"$card_type\" : \"Gold\",\n" + - " \"$card_brand\" : \"Visa\"\n" + - " }\n" + - " ],\n" + - " \"$bookings\": [\n" + - " {\n" + - " \"$booking_type\": \"$flight\",\n" + - " \"$title\": \"SFO - LAS, 2 Adults\",\n" + - " \"$start_time\": 12038412903,\n" + - " \"$end_time\": 12048412903,\n" + - " \"$price\": 49900000,\n" + - " \"$price_usd\": 55500000,\n" + - " \"$currency_code\": \"EUR\",\n" + - " \"$quantity\": 1,\n" + - " }\n" + - " ],\n" + - "\n" + - " \"$promotions\" : [\n" + - " {\n" + - " \"$promotion_id\" : \"FirstTimeBuyer\",\n" + - " \"$status\" : \"$success\",\n" + - " \"$description\" : \"$5 off\",\n" + - " \"$discount\" : {\n" + - " \"$amount\" : 5000000,\n" + - " \"$amount_usd\" : 5550000,\n" + - " \"$currency_code\" : \"EUR\"\n" + - " }\n" + - " }\n" + - " ]\n" + - "}"; - - // Start a new mock server and enqueue a mock response. - MockWebServer server = new MockWebServer(); - MockResponse response = new MockResponse(); - response.setResponseCode(HTTP_OK); - response.setBody("{\n" + - " \"status\" : 0,\n" + - " \"error_message\" : \"OK\",\n" + - " \"time\" : 1327604222,\n" + - " \"request\" : \"" + TestUtils.unescapeJson(expectedRequestBody) + "\"\n" + - "}"); - server.enqueue(response); - server.start(); - - // Create a new client and link it to the mock server. - SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID", - new OkHttpClient.Builder() - .addInterceptor(OkHttpUtils.urlRewritingInterceptor(server)) - .build()); - - // Build and execute the request against the mock server. - EventRequest request = client.buildRequest( - new CreateOrderFieldSet() - .setUserId("billy_jones_301") - .setOrderId("ORDER-28168441") - .setUserEmail("bill@gmail.com") - .setAmount(115940000L) - .setAmountUsd(155540000L) - .setCurrencyCode("EUR") - .setPaymentMethods(singletonList(TestUtils.samplePaymentMethodBinMetadata())) - .setBookings(singletonList(TestUtils.sampleBookingWithPriceUsd())) - .setPromotions(singletonList(TestUtils.samplePromotionWithAmountUsd())) - ); - - EventResponse siftResponse = request.send(); - - // Verify the request. - RecordedRequest request1 = server.takeRequest(); - Assert.assertEquals("POST", request1.getMethod()); - Assert.assertEquals("/v205/events", request1.getPath()); - JSONAssert.assertEquals(expectedRequestBody, request.getFieldSet().toJson(), true); - - // Verify the response. - Assert.assertEquals(HTTP_OK, siftResponse.getHttpStatusCode()); - Assert.assertNotNull(siftResponse.getBody()); - Assert.assertEquals(0, (int) siftResponse.getBody().getStatus()); - JSONAssert.assertEquals(response.getBody().readUtf8(), - siftResponse.getBody().toJson(), true); - - server.shutdown(); - } } diff --git a/src/test/java/com/siftscience/TestUtils.java b/src/test/java/com/siftscience/TestUtils.java index aa8ecea3..a7913a00 100644 --- a/src/test/java/com/siftscience/TestUtils.java +++ b/src/test/java/com/siftscience/TestUtils.java @@ -60,17 +60,6 @@ static PaymentMethod samplePaymentMethod2() { .setCardLast4("4444"); } - static PaymentMethod samplePaymentMethodBinMetadata() { - return new PaymentMethod() - .setPaymentType("$credit_card") - .setPaymentGateway("$braintree") - .setCardBin("542486") - .setCardLast4("4444") - .setCardBinCountry("US") - .setCardBrand("Visa") - .setCardType("Gold"); - } - static PaymentMethod samplePaymentMethodAch() { return new PaymentMethod() .setPaymentType("$ach_credit") @@ -172,22 +161,6 @@ static Item sampleItem2() { .setQuantity(2L); } - static Item sampleItemPriceUsd() { - return new Item() - .setItemId("B004834GQO") - .setProductTitle("The Slanket Blanket-Texas Tea") - .setPrice(39990000L) - .setPriceUsd(44490000L) - .setUpc("67862114510011") - .setSku("004834GQ") - .setBrand("Slanket") - .setManufacturer("Slanket") - .setCategory("Blankets & Throws") - .setTags(sampleTags2()) - .setColor("Texas Tea") - .setQuantity(2L); - } - static Booking sampleBooking() { List guests = new ArrayList<>(); guests.add(sampleGuest1()); @@ -210,18 +183,6 @@ static Booking sampleBooking() { .setQuantity(1L); } - static Booking sampleBookingWithPriceUsd() { - return new Booking() - .setBookingType("$flight") - .setTitle("SFO - LAS, 2 Adults") - .setStartTime(12038412903L) - .setEndTime(12048412903L) - .setPrice(49900000L) - .setPriceUsd(55500000L) - .setCurrencyCode("EUR") - .setQuantity(1L); - } - static OrderedFrom sampleOrderedFrom() { return new OrderedFrom() .setStoreId("123") @@ -269,13 +230,6 @@ static Discount sampleDiscount2() { .setCurrencyCode("USD"); } - static Discount sampleDiscountWithAmountUsd() { - return new Discount() - .setAmount(5000000L) - .setAmountUsd(5550000L) - .setCurrencyCode("EUR"); - } - static CreditPoint sampleCreditPoint() { return new CreditPoint() .setAmount(100L) @@ -307,11 +261,4 @@ static Promotion samplePromotion3() { .setDiscount(sampleDiscount2()); } - static Promotion samplePromotionWithAmountUsd() { - return new Promotion() - .setPromotionId("FirstTimeBuyer") - .setStatus("$success") - .setDescription("$5 off") - .setDiscount(sampleDiscountWithAmountUsd()); - } } diff --git a/src/test/java/com/siftscience/TransactionEventTest.java b/src/test/java/com/siftscience/TransactionEventTest.java index 571feb7b..cf845282 100644 --- a/src/test/java/com/siftscience/TransactionEventTest.java +++ b/src/test/java/com/siftscience/TransactionEventTest.java @@ -5,7 +5,9 @@ import java.util.ArrayList; import java.util.List; +import com.siftscience.model.CardBinMetadata; import com.siftscience.model.DigitalOrder; +import com.siftscience.model.PaymentMethod; import com.siftscience.model.TransactionFieldSet; import okhttp3.OkHttpClient; import okhttp3.mockwebserver.MockResponse; @@ -796,13 +798,12 @@ public void testTransactionEventWithExtraWithdrawalFields() throws Exception { } @Test - public void testTransactionEventWithAmountUsdAndBinMetadata() throws Exception { + public void testTransactionEventWithBinMetadata() throws Exception { String expectedRequestBody = "{\n" + " \"$type\" : \"$transaction\",\n" + " \"$api_key\" : \"YOUR_API_KEY\",\n" + " \"$user_id\" : \"billy_jones_301\",\n" + " \"$amount\" : 506790000,\n" + - " \"$amount_usd\" : 555790000,\n" + " \"$currency_code\" : \"EUR\",\n" + "\n" + " \"$user_email\" : \"bill@gmail.com\",\n" + @@ -810,13 +811,17 @@ public void testTransactionEventWithAmountUsdAndBinMetadata() throws Exception { " \"$transaction_id\" : \"719637215\",\n" + "\n" + " \"$payment_method\" : {\n" + - " \"$payment_type\" : \"$credit_card\",\n" + - " \"$payment_gateway\" : \"$braintree\",\n" + - " \"$card_bin\" : \"542486\",\n" + - " \"$card_last4\" : \"4444\",\n" + - " \"$card_bin_country\": \"US\",\n" + - " \"$card_type\" : \"Gold\",\n" + - " \"$card_brand\" : \"Visa\"\n" + + " \"$payment_type\" : \"$credit_card\",\n" + + " \"$payment_gateway\" : \"$braintree\",\n" + + " \"$card_bin\" : \"542486\",\n" + + " \"$card_last4\" : \"4444\",\n" + + " \"$card_bin_metadata\": {\n" + + " \"$country\": \"US\",\n" + + " \"$level\" : \"Gold\",\n" + + " \"$type\" : \"CREDIT\",\n" + + " \"$brand\" : \"VISA\",\n" + + " \"$bank\" : \"Chase\"\n" + + " },\n" + " },\n" + "}"; @@ -840,15 +845,21 @@ public void testTransactionEventWithAmountUsdAndBinMetadata() throws Exception { .build()); // Build and execute the request against the mock server. + PaymentMethod paymentMethod = TestUtils.samplePaymentMethod1() + .setCardBinMetadata(new CardBinMetadata() + .setCountry("US") + .setLevel("Gold") + .setType("CREDIT") + .setBrand("VISA") + .setBank("Chase")); EventRequest request = client.buildRequest(new TransactionFieldSet() .setUserId("billy_jones_301") .setAmount(506790000L) - .setAmountUsd(555790000L) .setCurrencyCode("EUR") .setUserEmail("bill@gmail.com") .setTransactionType("$buy") .setTransactionId("719637215") - .setPaymentMethod(TestUtils.samplePaymentMethodBinMetadata())); + .setPaymentMethod(paymentMethod)); EventResponse siftResponse = request.send(); // Verify the request. diff --git a/src/test/java/com/siftscience/UpdateOrderEventTest.java b/src/test/java/com/siftscience/UpdateOrderEventTest.java index 06393847..7f3a2096 100644 --- a/src/test/java/com/siftscience/UpdateOrderEventTest.java +++ b/src/test/java/com/siftscience/UpdateOrderEventTest.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import com.siftscience.exception.InvalidFieldException; @@ -1042,84 +1041,4 @@ public void testUpdateOrderEventWithCryptoFields() server.shutdown(); } - - @Test - public void testUpdateOrderEventWithItemsPriceUsd() - throws JSONException, IOException, InterruptedException { - - // The expected JSON payload of the request. - String expectedRequestBody = "{\n" + - " \"$type\": \"$update_order\",\n" + - " \"$api_key\": \"YOUR_API_KEY\",\n" + - " \"$user_id\": \"billy_jones_301\",\n" + - " \"$order_id\": \"ORDER-28168441\",\n" + - " \"$user_email\": \"bill@gmail.com\",\n" + - " \"$amount\": 115940000,\n" + - " \"$amount_usd\": 155540000,\n" + - " \"$currency_code\": \"EUR\",\n" + - " \"$items\" : [\n" + - " {\n" + - " \"$item_id\" : \"B004834GQO\",\n" + - " \"$product_title\" : \"The Slanket Blanket-Texas Tea\",\n" + - " \"$price\" : 39990000,\n" + - " \"$price_usd\" : 44490000,\n" + - " \"$upc\" : \"67862114510011\",\n" + - " \"$sku\" : \"004834GQ\",\n" + - " \"$brand\" : \"Slanket\",\n" + - " \"$manufacturer\" : \"Slanket\",\n" + - " \"$category\" : \"Blankets & Throws\",\n" + - " \"$tags\" : [\"Awesome\", \"Wintertime specials\"],\n" + - " \"$color\" : \"Texas Tea\",\n" + - " \"$quantity\" : 2\n" + - " }\n" + - " ],\n" + - "}\n"; - - // Start a new mock server and enqueue a mock response. - MockWebServer server = new MockWebServer(); - MockResponse response = new MockResponse(); - response.setResponseCode(HTTP_OK); - response.setBody("{\n" + - " \"status\" : 0,\n" + - " \"error_message\" : \"OK\",\n" + - " \"time\" : 1327604222,\n" + - " \"request\" : \"" + TestUtils.unescapeJson(expectedRequestBody) + "\"\n" + - "}"); - server.enqueue(response); - server.start(); - - // Create a new client and link it to the mock server. - SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID", - new OkHttpClient.Builder() - .addInterceptor(OkHttpUtils.urlRewritingInterceptor(server)) - .build()); - - // Build and execute the request against the mock server. - EventRequest request = client.buildRequest( - new UpdateOrderFieldSet() - .setUserId("billy_jones_301") - .setOrderId("ORDER-28168441") - .setUserEmail("bill@gmail.com") - .setAmount(115940000L) - .setAmountUsd(155540000L) - .setCurrencyCode("EUR") - .setItems(Collections.singletonList(TestUtils.sampleItemPriceUsd())) - ); - - EventResponse siftResponse = request.send(); - - // Verify the request. - RecordedRequest request1 = server.takeRequest(); - Assert.assertEquals("POST", request1.getMethod()); - Assert.assertEquals("/v205/events", request1.getPath()); - JSONAssert.assertEquals(expectedRequestBody, request.getFieldSet().toJson(), true); - - // Verify the response. - Assert.assertEquals(HTTP_OK, siftResponse.getHttpStatusCode()); - Assert.assertEquals(0, (int) siftResponse.getBody().getStatus()); - JSONAssert.assertEquals(response.getBody().readUtf8(), - siftResponse.getBody().toJson(), true); - - server.shutdown(); - } } diff --git a/src/test/java/com/siftscience/WagerFieldSetTest.java b/src/test/java/com/siftscience/WagerFieldSetTest.java index 12d03c85..dfd296c7 100644 --- a/src/test/java/com/siftscience/WagerFieldSetTest.java +++ b/src/test/java/com/siftscience/WagerFieldSetTest.java @@ -22,8 +22,7 @@ public void testWagerEvent() throws Exception { " \"$wager_type\" : \"win_1\",\n" + " \"$wager_status\" : \"$accept\",\n" + " \"$amount\" : 506790000,\n" + - " \"$amount_usd\" : 555790000,\n" + - " \"$currency_code\" : \"EUR\",\n" + + " \"$currency_code\" : \"USD\",\n" + " \"$wager_event_type\" : \"sportsbook\",\n" + " \"$wager_event_name\" : \"NFL\",\n" + " \"$wager_event_id\" : \"NFL_2024_N1234\",\n" + @@ -56,8 +55,7 @@ public void testWagerEvent() throws Exception { .setWagerType("win_1") .setWagerStatus("$accept") .setAmount(506790000L) - .setAmountUsd(555790000L) - .setCurrencyCode("EUR") + .setCurrencyCode("USD") .setWagerEventType("sportsbook") .setWagerEventName("NFL") .setWagerEventId("NFL_2024_N1234") From 5b2debf2a999cb1cd77f5860728a8cd93a56c6ca Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 24 Mar 2025 14:11:35 +0200 Subject: [PATCH 09/10] Revert unused methods --- src/test/java/com/siftscience/TestUtils.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/java/com/siftscience/TestUtils.java b/src/test/java/com/siftscience/TestUtils.java index a7913a00..48342149 100644 --- a/src/test/java/com/siftscience/TestUtils.java +++ b/src/test/java/com/siftscience/TestUtils.java @@ -45,6 +45,14 @@ static Address sampleAddress2() { .setZipCode("03257"); } + static Address sampleAddress3() { + return new Address() + .setCity("Seattle") + .setRegion("Washington") + .setCountry("US") + .setZipCode("98112"); + } + static PaymentMethod samplePaymentMethod1() { return new PaymentMethod() .setPaymentType("$credit_card") @@ -60,6 +68,7 @@ static PaymentMethod samplePaymentMethod2() { .setCardLast4("4444"); } + static PaymentMethod samplePaymentMethodAch() { return new PaymentMethod() .setPaymentType("$ach_credit") @@ -261,4 +270,11 @@ static Promotion samplePromotion3() { .setDiscount(sampleDiscount2()); } + static List sampleCategories() { + List categories = new ArrayList<>(); + categories.add("Housing"); + categories.add("Apartments"); + categories.add("2 Bedrooms"); + return categories; + } } From 3d01bdfbd17539033aaca19cee1522a37b87dc2a Mon Sep 17 00:00:00 2001 From: ademianenko Date: Mon, 24 Mar 2025 15:09:08 +0200 Subject: [PATCH 10/10] fields sorted alphabetically --- .../siftscience/model/CardBinMetadata.java | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/siftscience/model/CardBinMetadata.java b/src/main/java/com/siftscience/model/CardBinMetadata.java index 64cf6074..11560cd1 100644 --- a/src/main/java/com/siftscience/model/CardBinMetadata.java +++ b/src/main/java/com/siftscience/model/CardBinMetadata.java @@ -4,12 +4,29 @@ import com.google.gson.annotations.SerializedName; public class CardBinMetadata { - @Expose - @SerializedName("$country") private String country; + @Expose @SerializedName("$bank") private String bank; + @Expose @SerializedName("$brand") private String brand; + @Expose @SerializedName("$country") private String country; @Expose @SerializedName("$level") private String level; @Expose @SerializedName("$type") private String type; - @Expose @SerializedName("$brand") private String brand; - @Expose @SerializedName("$bank") private String bank; + + public String getBank() { + return bank; + } + + public CardBinMetadata setBank(String bank) { + this.bank = bank; + return this; + } + + public String getBrand() { + return brand; + } + + public CardBinMetadata setBrand(String brand) { + this.brand = brand; + return this; + } public String getCountry() { return country; @@ -37,22 +54,4 @@ public CardBinMetadata setType(String type) { this.type = type; return this; } - - public String getBrand() { - return brand; - } - - public CardBinMetadata setBrand(String brand) { - this.brand = brand; - return this; - } - - public String getBank() { - return bank; - } - - public CardBinMetadata setBank(String bank) { - this.bank = bank; - return this; - } }