diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bace614..ae136643 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,50 @@ CHANGELOG * BREAKING: Removed deprecated `TransactionReport.Builder(InetAddress, Tag)` constructor. Use `Builder(Tag)` and `ipAddress(InetAddress)` instead. * BREAKING: Removed deprecated `getUrl()` methods from `HttpException` and - `InvalidRequestException`. Use `getUri()` instead. + `InvalidRequestException`. Use `uri()` instead. * BREAKING: Removed deprecated constructors from `FactorsResponse`, `InsightsResponse`, and `Phone` classes. * BREAKING: Removed deprecated `Subscores` class and `FactorsResponse.getSubscores()` method. Use `getRiskScoreReasons()` instead. * BREAKING: Java 17 is now required (previously Java 11). +* BREAKING: Updated `geoip2` dependency to 5.0.0-SNAPSHOT. This introduces + several breaking changes due to changes in the geoip2 library: + * The `IpAddress` class no longer extends `InsightsResponse` from geoip2. + It now uses composition instead. All public methods remain the same, but + code relying on `IpAddress` being an `InsightsResponse` will need to be + updated. + * The `GeoIp2Location` class no longer extends `Location` from geoip2. It + now stores location data directly. All public methods remain the same, but + code relying on `GeoIp2Location` being a `Location` will need to be + updated. + * Removed the `getMaxMind()` method from the `IpAddress` class as this data + is not populated in minFraud responses. +* BREAKING: Converted all response classes to Java records. This change makes + these classes more concise and provides better immutability guarantees. + * All `get*()` accessor methods in response classes are now deprecated and + will be removed in 5.0.0. Use the automatically generated record accessor + methods instead (e.g., use `riskScore()` instead of `getRiskScore()`). + * The response class hierarchy has been flattened. `InsightsResponse` no + longer extends `ScoreResponse`, and `FactorsResponse` no longer extends + `InsightsResponse`. Instead, `InsightsResponse` and `FactorsResponse` now + include all fields from their former parent classes directly. + * All response classes now implement `JsonSerializable` instead of extending + `AbstractModel`. The `toJson()` method remains available for serialization. + * Removed the `AbstractAddress` interface. +* BREAKING: Updated all request classes to use record-style method naming. The + `get` prefix has been removed from all accessor methods (e.g., use `userId()` + instead of `getUserId()`). This applies to all request classes including + `Account`, `Billing`, `CreditCard`, `CustomInputs`, `Device`, `Email`, + `Event`, `Order`, `Payment`, `Shipping`, `ShoppingCartItem`, `Transaction`, + and `TransactionReport`. Unlike response classes, no deprecated helper methods + were added as these methods are primarily used for serialization. +* BREAKING: Updated exception classes to use record-style method naming. The + `get` prefix has been removed from all accessor methods. For `HttpException`, + use `httpStatus()` and `uri()` instead of `getHttpStatus()` and `getUri()`. + For `InvalidRequestException`, use `code()`, `httpStatus()`, and `uri()` + instead of `getCode()`, `getHttpStatus()`, and `getUri()`. No deprecated + helper methods were added. * Added `CREDIT_APPLICATION` and `FUND_TRANSFER` to the `Event.Type` enum. * Added the input `/event/party`. This is the party submitting the transaction. You may provide this using the `party` method on diff --git a/pom.xml b/pom.xml index 4fa11269..00b79aaa 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,19 @@ goschwald@maxmind.com + + + Central Portal Snapshots + central-portal-snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + false + + + true + + + com.fasterxml.jackson.core @@ -60,7 +73,7 @@ com.maxmind.geoip2 geoip2 - 4.4.0 + 5.0.0-SNAPSHOT org.junit.jupiter diff --git a/src/main/java/com/maxmind/minfraud/JsonSerializable.java b/src/main/java/com/maxmind/minfraud/JsonSerializable.java new file mode 100644 index 00000000..cffd91a3 --- /dev/null +++ b/src/main/java/com/maxmind/minfraud/JsonSerializable.java @@ -0,0 +1,18 @@ +package com.maxmind.minfraud; + +import java.io.IOException; + +/** + * Interface for classes that can be serialized to JSON. + * Provides default implementation for toJson() method. + */ +public interface JsonSerializable { + + /** + * @return JSON representation of this object. + * @throws IOException if there is an error serializing the object to JSON. + */ + default String toJson() throws IOException { + return Mapper.get().writeValueAsString(this); + } +} diff --git a/src/main/java/com/maxmind/minfraud/WebServiceClient.java b/src/main/java/com/maxmind/minfraud/WebServiceClient.java index f9a561db..0fb5e561 100644 --- a/src/main/java/com/maxmind/minfraud/WebServiceClient.java +++ b/src/main/java/com/maxmind/minfraud/WebServiceClient.java @@ -103,7 +103,7 @@ public static final class Builder { Duration connectTimeout; Duration requestTimeout; - List locales = Collections.singletonList("en"); + List locales = List.of("en"); private ProxySelector proxy; private HttpClient httpClient; @@ -306,8 +306,8 @@ public void reportTransaction(TransactionReport transaction) throws IOException, if (transaction == null) { throw new IllegalArgumentException("transaction report must not be null"); } - URI uri = createUri(WebServiceClient.pathBase + "transactions/report"); - HttpRequest request = requestFor(transaction, uri); + var uri = createUri(WebServiceClient.pathBase + "transactions/report"); + var request = requestFor(transaction, uri); HttpResponse response = null; try { @@ -328,8 +328,8 @@ private T responseFor(String service, AbstractModel transaction, Class cl if (transaction == null) { throw new IllegalArgumentException("transaction must not be null"); } - URI uri = createUri(WebServiceClient.pathBase + service); - HttpRequest request = requestFor(transaction, uri); + var uri = createUri(WebServiceClient.pathBase + service); + var request = requestFor(transaction, uri); HttpResponse response = null; try { @@ -346,7 +346,7 @@ private T responseFor(String service, AbstractModel transaction, Class cl private HttpRequest requestFor(AbstractModel transaction, URI uri) throws MinFraudException, IOException { - HttpRequest.Builder builder = HttpRequest.newBuilder() + var builder = HttpRequest.newBuilder() .uri(uri) .header("Accept", "application/json") .header("Authorization", authHeader) @@ -365,7 +365,7 @@ private HttpRequest requestFor(AbstractModel transaction, URI uri) private void maybeThrowException(HttpResponse response, URI uri) throws IOException, MinFraudException { - int status = response.statusCode(); + var status = response.statusCode(); if (status >= 400 && status < 500) { this.handle4xxStatus(response, uri); } else if (status >= 500 && status < 600) { @@ -383,7 +383,7 @@ private T handleResponse(HttpResponse response, URI uri, Class< throws MinFraudException, IOException { maybeThrowException(response, uri); - InjectableValues inject = new Std().addValue( + var inject = new Std().addValue( "locales", locales); try (InputStream stream = response.body()) { @@ -398,7 +398,7 @@ private void handle4xxStatus(HttpResponse response, URI uri) throws IOException, InsufficientFundsException, InvalidRequestException, AuthenticationException, PermissionRequiredException { - int status = response.statusCode(); + var status = response.statusCode(); String body; try (InputStream stream = response.body()) { @@ -425,8 +425,8 @@ private void handleErrorWithJsonBody(Map content, throws HttpException, InsufficientFundsException, InvalidRequestException, AuthenticationException, PermissionRequiredException { - String error = content.get("error"); - String code = content.get("code"); + var error = content.get("error"); + var code = content.get("code"); if (error == null || code == null) { throw new HttpException( diff --git a/src/main/java/com/maxmind/minfraud/exception/HttpException.java b/src/main/java/com/maxmind/minfraud/exception/HttpException.java index bcab2d50..e4b644f7 100644 --- a/src/main/java/com/maxmind/minfraud/exception/HttpException.java +++ b/src/main/java/com/maxmind/minfraud/exception/HttpException.java @@ -38,14 +38,14 @@ public HttpException(String message, int httpStatus, URI uri, /** * @return the HTTP status of the query that caused the exception. */ - public int getHttpStatus() { + public int httpStatus() { return httpStatus; } /** * @return the URI queried. */ - public URI getUri() { + public URI uri() { return this.uri; } diff --git a/src/main/java/com/maxmind/minfraud/exception/InvalidRequestException.java b/src/main/java/com/maxmind/minfraud/exception/InvalidRequestException.java index a128a8f1..d1637e45 100644 --- a/src/main/java/com/maxmind/minfraud/exception/InvalidRequestException.java +++ b/src/main/java/com/maxmind/minfraud/exception/InvalidRequestException.java @@ -42,7 +42,7 @@ public InvalidRequestException(String message, String code, int httpStatus, /** * @return The error code returned by the MaxMind web service. */ - public final String getCode() { + public final String code() { return code; } @@ -50,14 +50,14 @@ public final String getCode() { * @return The integer HTTP status returned by the MaxMind web service. Will be 0 if it was not * set at throw time. */ - public final int getHttpStatus() { + public final int httpStatus() { return httpStatus; } /** * @return the URI queried. */ - public URI getUri() { + public URI uri() { return this.uri; } diff --git a/src/main/java/com/maxmind/minfraud/request/AbstractLocation.java b/src/main/java/com/maxmind/minfraud/request/AbstractLocation.java index 1fcf130a..904676e0 100644 --- a/src/main/java/com/maxmind/minfraud/request/AbstractLocation.java +++ b/src/main/java/com/maxmind/minfraud/request/AbstractLocation.java @@ -7,7 +7,8 @@ /** * This class represents the shared location behavior between Billing and Shipping. */ -public abstract class AbstractLocation extends AbstractModel { +public abstract sealed class AbstractLocation extends AbstractModel + permits Billing, Shipping { private final String firstName; private final String lastName; private final String company; @@ -168,7 +169,7 @@ public final T phoneNumber(String number) { * @return The first name associated with the address */ @JsonProperty("first_name") - public final String getFirstName() { + public final String firstName() { return firstName; } @@ -176,7 +177,7 @@ public final String getFirstName() { * @return The last name associated with the address */ @JsonProperty("last_name") - public final String getLastName() { + public final String lastName() { return lastName; } @@ -184,7 +185,7 @@ public final String getLastName() { * @return The company name associated with the address */ @JsonProperty("company") - public final String getCompany() { + public final String company() { return company; } @@ -193,7 +194,7 @@ public final String getCompany() { * @return The first line of the address */ @JsonProperty("address") - public final String getAddress() { + public final String address() { return address; } @@ -202,7 +203,7 @@ public final String getAddress() { * @return The second line of the address */ @JsonProperty("address_2") - public final String getAddress2() { + public final String address2() { return address2; } @@ -211,7 +212,7 @@ public final String getAddress2() { * @return The city associated with the address */ @JsonProperty("city") - public final String getCity() { + public final String city() { return city; } @@ -220,7 +221,7 @@ public final String getCity() { * @return The region code associated with the address */ @JsonProperty("region") - public final String getRegion() { + public final String region() { return region; } @@ -229,7 +230,7 @@ public final String getRegion() { * @return The country associated with the address */ @JsonProperty("country") - public final String getCountry() { + public final String country() { return country; } @@ -237,7 +238,7 @@ public final String getCountry() { * @return The postal code associated with the address */ @JsonProperty("postal") - public final String getPostal() { + public final String postal() { return postal; } @@ -245,7 +246,7 @@ public final String getPostal() { * @return The phone number associated with the address */ @JsonProperty("phone_number") - public final String getPhoneNumber() { + public final String phoneNumber() { return phoneNumber; } @@ -253,7 +254,7 @@ public final String getPhoneNumber() { * @return The phone number country code associated with the address */ @JsonProperty("phone_country_code") - public final String getPhoneCountryCode() { + public final String phoneCountryCode() { return phoneCountryCode; } } diff --git a/src/main/java/com/maxmind/minfraud/request/Account.java b/src/main/java/com/maxmind/minfraud/request/Account.java index 6894ffe9..3852c458 100644 --- a/src/main/java/com/maxmind/minfraud/request/Account.java +++ b/src/main/java/com/maxmind/minfraud/request/Account.java @@ -70,7 +70,7 @@ public Account build() { * @return The user ID. */ @JsonProperty("user_id") - public String getUserId() { + public String userId() { return userId; } @@ -78,7 +78,7 @@ public String getUserId() { * @return The MD5 of the username passed to the builder. */ @JsonProperty("username_md5") - public String getUsernameMd5() { + public String usernameMd5() { return usernameMd5; } } \ No newline at end of file diff --git a/src/main/java/com/maxmind/minfraud/request/CreditCard.java b/src/main/java/com/maxmind/minfraud/request/CreditCard.java index 9ec8dbb5..beb5836d 100644 --- a/src/main/java/com/maxmind/minfraud/request/CreditCard.java +++ b/src/main/java/com/maxmind/minfraud/request/CreditCard.java @@ -195,7 +195,7 @@ public CreditCard build() { * @return The issuer ID number. */ @JsonProperty("issuer_id_number") - public String getIssuerIdNumber() { + public String issuerIdNumber() { return issuerIdNumber; } @@ -203,7 +203,7 @@ public String getIssuerIdNumber() { * @return The last two or four digits of the credit card number. */ @JsonProperty("last_digits") - public String getLastDigits() { + public String lastDigits() { return lastDigits; } @@ -211,7 +211,7 @@ public String getLastDigits() { * @return The name of the issuing bank as provided by the end user. */ @JsonProperty("bank_name") - public String getBankName() { + public String bankName() { return bankName; } @@ -219,7 +219,7 @@ public String getBankName() { * @return The phone country code for the issuing bank as provided by the end user. */ @JsonProperty("bank_phone_country_code") - public String getBankPhoneCountryCode() { + public String bankPhoneCountryCode() { return bankPhoneCountryCode; } @@ -228,7 +228,7 @@ public String getBankPhoneCountryCode() { * end user. */ @JsonProperty("bank_phone_number") - public String getBankPhoneNumber() { + public String bankPhoneNumber() { return bankPhoneNumber; } @@ -237,7 +237,7 @@ public String getBankPhoneNumber() { * located. */ @JsonProperty("country") - public String getCountry() { + public String country() { return country; } @@ -246,7 +246,7 @@ public String getCountry() { * card processor. The minFraud service supports the standard AVS codes. */ @JsonProperty("avs_result") - public Character getAvsResult() { + public Character avsResult() { return avsResult; } @@ -254,7 +254,7 @@ public Character getAvsResult() { * @return The card verification value (CVV) code as provided by the payment processor. */ @JsonProperty("cvv_result") - public Character getCvvResult() { + public Character cvvResult() { return cvvResult; } @@ -262,7 +262,7 @@ public Character getCvvResult() { * @return A credit card token uniquely identifying the card. */ @JsonProperty("token") - public String getToken() { + public String token() { return token; } @@ -274,7 +274,7 @@ public String getToken() { * resulted in another outcome other than success or failure. */ @JsonProperty("was_3d_secure_successful") - public Boolean getWas3dSecureSuccessful() { + public Boolean was3dSecureSuccessful() { return was3dSecureSuccessful; } } diff --git a/src/main/java/com/maxmind/minfraud/request/CustomInputs.java b/src/main/java/com/maxmind/minfraud/request/CustomInputs.java index e93c5fdd..4d72ae19 100644 --- a/src/main/java/com/maxmind/minfraud/request/CustomInputs.java +++ b/src/main/java/com/maxmind/minfraud/request/CustomInputs.java @@ -103,7 +103,7 @@ private void validateKey(String key) { * @return an unmodifiable map containing the custom inputs. */ @JsonAnyGetter - public Map getInputs() { + public Map inputs() { return inputs; } } diff --git a/src/main/java/com/maxmind/minfraud/request/Device.java b/src/main/java/com/maxmind/minfraud/request/Device.java index 47d4192b..48a03e8f 100644 --- a/src/main/java/com/maxmind/minfraud/request/Device.java +++ b/src/main/java/com/maxmind/minfraud/request/Device.java @@ -112,7 +112,7 @@ public Device build() { * @return The "User-Agent" header. */ @JsonProperty("user_agent") - public String getUserAgent() { + public String userAgent() { return userAgent; } @@ -120,7 +120,7 @@ public String getUserAgent() { * @return The "Accept-Language" header. */ @JsonProperty("accept_language") - public String getAcceptLanguage() { + public String acceptLanguage() { return acceptLanguage; } @@ -128,7 +128,7 @@ public String getAcceptLanguage() { * @return The session age. */ @JsonProperty("session_age") - public Double getSessionAge() { + public Double sessionAge() { return sessionAge; } @@ -136,7 +136,7 @@ public Double getSessionAge() { * @return The session id. */ @JsonProperty("session_id") - public String getSessionId() { + public String sessionId() { return sessionId; } @@ -144,7 +144,7 @@ public String getSessionId() { * @return The IP address used in the transaction. */ @JsonProperty("ip_address") - public InetAddress getIpAddress() { + public InetAddress ipAddress() { return ipAddress; } } diff --git a/src/main/java/com/maxmind/minfraud/request/Email.java b/src/main/java/com/maxmind/minfraud/request/Email.java index fe2562b6..7ad23384 100644 --- a/src/main/java/com/maxmind/minfraud/request/Email.java +++ b/src/main/java/com/maxmind/minfraud/request/Email.java @@ -395,7 +395,7 @@ public Email build() { * {@link Builder#hashAddress()} as well, or null if you did not set an email address. */ @JsonProperty("address") - public String getAddress() { + public String address() { if (address == null) { return null; } @@ -566,7 +566,7 @@ private static boolean isValidDomainLabel(String label) { * @return The domain of the email address used in the transaction. */ @JsonProperty("domain") - public String getDomain() { + public String domain() { return domain; } } diff --git a/src/main/java/com/maxmind/minfraud/request/Event.java b/src/main/java/com/maxmind/minfraud/request/Event.java index 1ca0da1a..faa93e98 100644 --- a/src/main/java/com/maxmind/minfraud/request/Event.java +++ b/src/main/java/com/maxmind/minfraud/request/Event.java @@ -106,7 +106,7 @@ public Event build() { * @return The party submitting the transaction. */ @JsonProperty("party") - public Party getParty() { + public Party party() { return party; } @@ -114,7 +114,7 @@ public Party getParty() { * @return The transaction ID. */ @JsonProperty("transaction_id") - public String getTransactionId() { + public String transactionId() { return transactionId; } @@ -122,7 +122,7 @@ public String getTransactionId() { * @return The shop ID. */ @JsonProperty("shop_id") - public String getShopId() { + public String shopId() { return shopId; } @@ -130,7 +130,7 @@ public String getShopId() { * @return The date and time of the event. */ @JsonIgnore - public Date getTime() { + public Date time() { return Date.from(time.toInstant()); } @@ -138,7 +138,7 @@ public Date getTime() { * @return The date and time of the event. */ @JsonProperty("time") - public ZonedDateTime getDateTime() { + public ZonedDateTime dateTime() { return time; } @@ -146,7 +146,7 @@ public ZonedDateTime getDateTime() { * @return The type of the event. */ @JsonProperty("type") - public Type getType() { + public Type type() { return type; } diff --git a/src/main/java/com/maxmind/minfraud/request/Order.java b/src/main/java/com/maxmind/minfraud/request/Order.java index 69838b21..99c39c3c 100644 --- a/src/main/java/com/maxmind/minfraud/request/Order.java +++ b/src/main/java/com/maxmind/minfraud/request/Order.java @@ -144,7 +144,7 @@ public Order build() { * @return The total order amount. */ @JsonProperty("amount") - public BigDecimal getAmount() { + public BigDecimal amount() { return amount; } @@ -152,7 +152,7 @@ public BigDecimal getAmount() { * @return The currency code. */ @JsonProperty("currency") - public String getCurrency() { + public String currency() { return currency; } @@ -160,7 +160,7 @@ public String getCurrency() { * @return The discount codes. */ @JsonProperty("discount_code") - public String getDiscountCode() { + public String discountCode() { return discountCode; } @@ -168,7 +168,7 @@ public String getDiscountCode() { * @return The affiliate ID. */ @JsonProperty("affiliate_id") - public String getAffiliateId() { + public String affiliateId() { return affiliateId; } @@ -176,7 +176,7 @@ public String getAffiliateId() { * @return The sub-affiliate ID. */ @JsonProperty("subaffiliate_id") - public String getSubaffiliateId() { + public String subaffiliateId() { return subaffiliateId; } @@ -184,7 +184,7 @@ public String getSubaffiliateId() { * @return The referrer URI. */ @JsonProperty("referrer_uri") - public URI getReferrerUri() { + public URI referrerUri() { return referrerUri; } diff --git a/src/main/java/com/maxmind/minfraud/request/Payment.java b/src/main/java/com/maxmind/minfraud/request/Payment.java index 47ac7f26..a4949f66 100644 --- a/src/main/java/com/maxmind/minfraud/request/Payment.java +++ b/src/main/java/com/maxmind/minfraud/request/Payment.java @@ -80,7 +80,7 @@ public Payment build() { * @return The payment method. */ @JsonProperty("method") - public Method getMethod() { + public Method method() { return method; } @@ -88,7 +88,7 @@ public Method getMethod() { * @return The payment processor. */ @JsonProperty("processor") - public Processor getProcessor() { + public Processor processor() { return processor; } @@ -104,7 +104,7 @@ public Boolean wasAuthorized() { * @return The decline code. */ @JsonProperty("decline_code") - public String getDeclineCode() { + public String declineCode() { return declineCode; } diff --git a/src/main/java/com/maxmind/minfraud/request/Shipping.java b/src/main/java/com/maxmind/minfraud/request/Shipping.java index e2ce8a94..43ab51ad 100644 --- a/src/main/java/com/maxmind/minfraud/request/Shipping.java +++ b/src/main/java/com/maxmind/minfraud/request/Shipping.java @@ -42,7 +42,7 @@ public Shipping build() { * @return The shipping delivery speed for the order. */ @JsonProperty("delivery_speed") - public DeliverySpeed getDeliverySpeed() { + public DeliverySpeed deliverySpeed() { return deliverySpeed; } diff --git a/src/main/java/com/maxmind/minfraud/request/ShoppingCartItem.java b/src/main/java/com/maxmind/minfraud/request/ShoppingCartItem.java index 7af9e715..fec63ace 100644 --- a/src/main/java/com/maxmind/minfraud/request/ShoppingCartItem.java +++ b/src/main/java/com/maxmind/minfraud/request/ShoppingCartItem.java @@ -95,7 +95,7 @@ public ShoppingCartItem build() { * @return The category of the item. */ @JsonProperty("category") - public String getCategory() { + public String category() { return category; } @@ -103,7 +103,7 @@ public String getCategory() { * @return The ID of the item. */ @JsonProperty("item_id") - public String getItemId() { + public String itemId() { return itemId; } @@ -111,7 +111,7 @@ public String getItemId() { * @return The quantity of the item. */ @JsonProperty("quantity") - public Integer getQuantity() { + public Integer quantity() { return quantity; } @@ -119,7 +119,7 @@ public Integer getQuantity() { * @return The price of the item. */ @JsonProperty("price") - public BigDecimal getPrice() { + public BigDecimal price() { return price; } } diff --git a/src/main/java/com/maxmind/minfraud/request/Transaction.java b/src/main/java/com/maxmind/minfraud/request/Transaction.java index 47beeb6f..66e275a4 100644 --- a/src/main/java/com/maxmind/minfraud/request/Transaction.java +++ b/src/main/java/com/maxmind/minfraud/request/Transaction.java @@ -180,7 +180,7 @@ public Transaction build() { * @return The Account object. */ @JsonProperty("account") - public Account getAccount() { + public Account account() { return account; } @@ -188,7 +188,7 @@ public Account getAccount() { * @return The Billing object. */ @JsonProperty("billing") - public Billing getBilling() { + public Billing billing() { return billing; } @@ -196,7 +196,7 @@ public Billing getBilling() { * @return The CreditCard object. */ @JsonProperty("credit_card") - public CreditCard getCreditCard() { + public CreditCard creditCard() { return creditCard; } @@ -204,7 +204,7 @@ public CreditCard getCreditCard() { * @return The CustomInputs object. */ @JsonProperty("custom_inputs") - public CustomInputs getCustomInputs() { + public CustomInputs customInputs() { return customInputs; } @@ -212,7 +212,7 @@ public CustomInputs getCustomInputs() { * @return The Device object. */ @JsonProperty("device") - public Device getDevice() { + public Device device() { return device; } @@ -220,7 +220,7 @@ public Device getDevice() { * @return The Email object. */ @JsonProperty("email") - public Email getEmail() { + public Email email() { return email; } @@ -228,7 +228,7 @@ public Email getEmail() { * @return The Event object. */ @JsonProperty("event") - public Event getEvent() { + public Event event() { return event; } @@ -236,7 +236,7 @@ public Event getEvent() { * @return The Order object. */ @JsonProperty("order") - public Order getOrder() { + public Order order() { return order; } @@ -244,7 +244,7 @@ public Order getOrder() { * @return The Payment object. */ @JsonProperty("payment") - public Payment getPayment() { + public Payment payment() { return payment; } @@ -252,7 +252,7 @@ public Payment getPayment() { * @return The Shipping object. */ @JsonProperty("shipping") - public Shipping getShipping() { + public Shipping shipping() { return shipping; } @@ -260,7 +260,7 @@ public Shipping getShipping() { * @return A list of items in the shopping cart. */ @JsonProperty("shopping_cart") - public List getShoppingCart() { + public List shoppingCart() { return List.copyOf(shoppingCart); } } diff --git a/src/main/java/com/maxmind/minfraud/request/TransactionReport.java b/src/main/java/com/maxmind/minfraud/request/TransactionReport.java index 93b064a3..d85717c7 100644 --- a/src/main/java/com/maxmind/minfraud/request/TransactionReport.java +++ b/src/main/java/com/maxmind/minfraud/request/TransactionReport.java @@ -150,7 +150,7 @@ public TransactionReport build() { * @return The IP address used in the transaction. */ @JsonProperty("ip_address") - public InetAddress getIpAddress() { + public InetAddress ipAddress() { return ipAddress; } @@ -158,7 +158,7 @@ public InetAddress getIpAddress() { * @return The tag. */ @JsonProperty("tag") - public Tag getTag() { + public Tag tag() { return tag; } @@ -166,7 +166,7 @@ public Tag getTag() { * @return The chargeback code. */ @JsonProperty("chargeback_code") - public String getChargebackCode() { + public String chargebackCode() { return chargebackCode; } @@ -174,7 +174,7 @@ public String getChargebackCode() { * @return The maxmind_id. */ @JsonProperty("maxmind_id") - public String getMaxmindId() { + public String maxmindId() { return maxmindId; } @@ -182,7 +182,7 @@ public String getMaxmindId() { * @return The minfraud_id. */ @JsonProperty("minfraud_id") - public UUID getMinfraudId() { + public UUID minfraudId() { return minfraudId; } @@ -190,7 +190,7 @@ public UUID getMinfraudId() { * @return The notes. */ @JsonProperty("notes") - public String getNotes() { + public String notes() { return notes; } @@ -198,7 +198,7 @@ public String getNotes() { * @return The transaction_id. */ @JsonProperty("transaction_id") - public String getTransactionId() { + public String transactionId() { return transactionId; } diff --git a/src/main/java/com/maxmind/minfraud/response/AbstractAddress.java b/src/main/java/com/maxmind/minfraud/response/AbstractAddress.java deleted file mode 100644 index 59d3e21f..00000000 --- a/src/main/java/com/maxmind/minfraud/response/AbstractAddress.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.maxmind.minfraud.response; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; - -/** - * This class contains minFraud response data related to the shipping and billing address. - */ -public abstract class AbstractAddress extends AbstractModel { - private final Boolean isPostalInCity; - private final Double latitude; - private final Double longitude; - private final Integer distanceToIpLocation; - private final Boolean isInIpCountry; - - protected AbstractAddress(Integer distanceToIpLocation, Boolean isInIpCountry, - Boolean isPostalInCity, Double latitude, Double longitude) { - this.distanceToIpLocation = distanceToIpLocation; - this.isInIpCountry = isInIpCountry; - this.isPostalInCity = isPostalInCity; - this.latitude = latitude; - this.longitude = longitude; - } - - /** - * @return This returns true if the address is in the IP country. It is false when the address - * is not in the IP country. If the address could not be parsed or was not provided or the - * IP address could not be geolocated, then null will be returned. - */ - @JsonProperty("is_in_ip_country") - public final Boolean isInIpCountry() { - return isInIpCountry; - } - - /** - * @return The latitude associated with the address. This will be null if there is no value in - * the response. - */ - public final Double getLatitude() { - return latitude; - } - - /** - * @return The longitude associated with the address. This will be null if there is no value in - * the response. - */ - public final Double getLongitude() { - return longitude; - } - - /** - * @return The distance in kilometers from the address to the IP location in kilometers. This - * will be null if there is no value in the response. - */ - @JsonProperty("distance_to_ip_location") - public final Integer getDistanceToIpLocation() { - return distanceToIpLocation; - } - - /** - * @return This will return true if the postal code provided with the address is in the city for - * the address. It will return false when the postal code is not in the city. If the address - * was not provided or could not be parsed, null will be returned. - */ - @JsonProperty("is_postal_in_city") - public final Boolean isPostalInCity() { - return isPostalInCity; - } -} diff --git a/src/main/java/com/maxmind/minfraud/response/BillingAddress.java b/src/main/java/com/maxmind/minfraud/response/BillingAddress.java index d3502b15..8b838e87 100644 --- a/src/main/java/com/maxmind/minfraud/response/BillingAddress.java +++ b/src/main/java/com/maxmind/minfraud/response/BillingAddress.java @@ -1,36 +1,75 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains minFraud response data related to the billing address. + * + * @param distanceToIpLocation The distance in kilometers from the address to the IP location. + * This will be null if there is no value in the response. + * @param isInIpCountry This returns true if the address is in the IP country. It is false + * when the address is not in the IP country. If the address could not + * be parsed or was not provided or the IP address could not be + * geolocated, then null will be returned. + * @param isPostalInCity This will return true if the postal code provided with the address + * is in the city for the address. It will return false when the postal + * code is not in the city. If the address was not provided or could not + * be parsed, null will be returned. + * @param latitude The latitude associated with the address. This will be null if there + * is no value in the response. + * @param longitude The longitude associated with the address. This will be null if there + * is no value in the response. */ -public final class BillingAddress extends AbstractAddress { +public record BillingAddress( + @JsonProperty("distance_to_ip_location") + Integer distanceToIpLocation, + + @JsonProperty("is_in_ip_country") + Boolean isInIpCountry, + + @JsonProperty("is_postal_in_city") + Boolean isPostalInCity, + + @JsonProperty("latitude") + Double latitude, + + @JsonProperty("longitude") + Double longitude +) implements JsonSerializable { + /** - * Constructor for {@code BillingAddress}. - * - * @param distanceToIpLocation The distance in kilometers from the billing address to the IP - * location. - * @param isInIpCountry This is true if the billing address is in the IP country. - * @param isPostalInCity This is true if the billing postal code is in the city for the IP - * location. - * @param latitude The latitude associated with the IP address. - * @param longitude The longitude associated with the IP address. + * Constructs an instance of {@code BillingAddress} with no data. */ - public BillingAddress( - @JsonProperty("distance_to_ip_location") Integer distanceToIpLocation, - @JsonProperty("is_in_ip_country") Boolean isInIpCountry, - @JsonProperty("is_postal_in_city") Boolean isPostalInCity, - @JsonProperty("latitude") Double latitude, - @JsonProperty("longitude") Double longitude - ) { - super(distanceToIpLocation, isInIpCountry, isPostalInCity, latitude, longitude); + public BillingAddress() { + this(null, null, null, null, null); } /** - * Constructor for {@code BillingAddress}. + * @return The latitude associated with the address. + * @deprecated Use {@link #latitude()} instead. This method will be removed in 5.0.0. */ - public BillingAddress() { - this(null, null, null, null, null); + @Deprecated(since = "4.0.0", forRemoval = true) + public Double getLatitude() { + return latitude(); + } + + /** + * @return The longitude associated with the address. + * @deprecated Use {@link #longitude()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + public Double getLongitude() { + return longitude(); + } + + /** + * @return The distance in kilometers from the address to the IP location. + * @deprecated Use {@link #distanceToIpLocation()} instead. This method will be removed in + * 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + public Integer getDistanceToIpLocation() { + return distanceToIpLocation(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/CreditCard.java b/src/main/java/com/maxmind/minfraud/response/CreditCard.java index d711a626..248f42f3 100644 --- a/src/main/java/com/maxmind/minfraud/response/CreditCard.java +++ b/src/main/java/com/maxmind/minfraud/response/CreditCard.java @@ -1,54 +1,70 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains minFraud response data related to the credit card. + * + * @param brand The credit card brand. + * @param country The two letter + * ISO 3166-1 alpha-2 country code associated with the + * location of the majority of customers using this credit + * card as determined by their billing address. In cases + * where the location of customers is highly mixed, this + * defaults to the country of the bank issuing the card. + * @param isBusiness True if the card is a business card. False if not a + * business card. If the IIN was not provided or is unknown, + * null will be returned. + * @param isIssuedInBillingAddressCountry True if the country of the billing address matches the + * country of the majority of customers using that IIN. In + * cases where the location of customers is highly mixed, the + * match is to the country of the bank issuing the card. + * @param isPrepaid True if the card is a prepaid card. False if not prepaid. + * If the IIN was not provided or is unknown, null will be + * returned. + * @param isVirtual True if the card is a virtual card. False if not virtual. + * If the IIN was not provided or is unknown, null will be + * returned. + * @param issuer The {@code Issuer} model object. + * @param type The credit card type. */ -public final class CreditCard extends AbstractModel { - private final Issuer issuer; - private final String brand; - private final String country; - private final Boolean isBusiness; - private final Boolean isIssuedInBillingAddressCountry; - private final Boolean isPrepaid; - private final Boolean isVirtual; - private final String type; +public record CreditCard( + @JsonProperty("brand") + String brand, + + @JsonProperty("country") + String country, + + @JsonProperty("is_business") + Boolean isBusiness, + + @JsonProperty("is_issued_in_billing_address_country") + Boolean isIssuedInBillingAddressCountry, + + @JsonProperty("is_prepaid") + Boolean isPrepaid, + + @JsonProperty("is_virtual") + Boolean isVirtual, + + @JsonProperty("issuer") + Issuer issuer, + + @JsonProperty("type") + String type +) implements JsonSerializable { /** - * @param brand The credit card brand. - * @param country The country the card was issued in. - * @param isBusiness Whether it is a business card. - * @param isIssuedInBillingAddressCountry Whether the issuing country matches billing country. - * @param isPrepaid Whether the card was prepaid. - * @param isVirtual Whether it is a virtual card. - * @param issuer The issuer information. - * @param type The type. + * Compact canonical constructor that sets defaults for null values. */ - public CreditCard( - @JsonProperty("brand") String brand, - @JsonProperty("country") String country, - @JsonProperty("is_business") Boolean isBusiness, - @JsonProperty("is_issued_in_billing_address_country") - Boolean isIssuedInBillingAddressCountry, - @JsonProperty("is_prepaid") Boolean isPrepaid, - @JsonProperty("is_virtual") Boolean isVirtual, - @JsonProperty("issuer") Issuer issuer, - @JsonProperty("type") String type - ) { - this.brand = brand; - this.country = country; - this.isBusiness = isBusiness; - this.isIssuedInBillingAddressCountry = isIssuedInBillingAddressCountry; - this.isPrepaid = isPrepaid; - this.isVirtual = isVirtual; - this.issuer = issuer == null ? new Issuer() : issuer; - this.type = type; + public CreditCard { + issuer = issuer != null ? issuer : new Issuer(); } /** - * Constructor for {@code CreditCard}. + * Constructs an instance of {@code CreditCard} with no data. */ public CreditCard() { this(null, null, null, null, null, null, null, null); @@ -56,16 +72,22 @@ public CreditCard() { /** * @return The {@code Issuer} model object. + * @deprecated Use {@link #issuer()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("issuer") public Issuer getIssuer() { - return issuer; + return issuer(); } /** * @return The credit card brand. + * @deprecated Use {@link #brand()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("brand") public String getBrand() { - return brand; + return brand(); } /** @@ -73,52 +95,21 @@ public String getBrand() { * alpha-2 country code associated with the location of the majority of customers using * this credit card as determined by their billing address. In cases where the location of * customers is highly mixed, this defaults to the country of the bank issuing the card. + * @deprecated Use {@link #country()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("country") public String getCountry() { - return country; - } - - /** - * @return True if the card is a business card. False if not a business card. If the IIN was not - * provided or is unknown, null will be returned. - */ - @JsonProperty("is_business") - public Boolean isBusiness() { - return isBusiness; - } - - /** - * @return True if the country of the billing address matches the country of the majority of - * customers using that IIN. In cases where the location of customers is highly mixed, the - * match is to the country of the bank issuing the card. - */ - @JsonProperty("is_issued_in_billing_address_country") - public Boolean isIssuedInBillingAddressCountry() { - return isIssuedInBillingAddressCountry; - } - - /** - * @return True if the card is a prepaid card. False if not prepaid. If the IIN was not provided - * or is unknown, null will be returned. - */ - @JsonProperty("is_prepaid") - public Boolean isPrepaid() { - return isPrepaid; - } - - /** - * @return True if the card is a virtual card. False if not virtual. If the IIN was not provided - * or is unknown, null will be returned. - */ - @JsonProperty("is_virtual") - public Boolean isVirtual() { - return isVirtual; + return country(); } /** * @return The credit card type. + * @deprecated Use {@link #type()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("type") public String getType() { - return type; + return type(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/Device.java b/src/main/java/com/maxmind/minfraud/response/Device.java index 87bc17c7..4a78f3a0 100644 --- a/src/main/java/com/maxmind/minfraud/response/Device.java +++ b/src/main/java/com/maxmind/minfraud/response/Device.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; import java.time.ZonedDateTime; import java.util.UUID; @@ -12,34 +12,33 @@ * In order to receive device output from minFraud Insights or minFraud Factors, you must be using * the Device Tracking Add-on. * + * @param confidence A number representing the confidence that the device ID refers to a unique + * device as opposed to a cluster of similar devices. A confidence of 0.01 + * indicates very low confidence that the device is unique, whereas 99 indicates + * very high confidence. + * @param id A UUID identifying the device associated with this IP address. + * @param lastSeen The date and time of the last sighting of the device. This is an RFC 3339 + * date-time. + * @param localTime The date and time of the transaction at the UTC offset associated with the + * device. This is an RFC 3339 date-time. * @see Device Tracking Add-on */ -public final class Device extends AbstractModel { - private final Double confidence; - private final UUID id; - private final String lastSeen; - private final String localTime; +public record Device( + @JsonProperty("confidence") + Double confidence, - /** - * @param confidence The device confidence. - * @param id The device ID. - * @param lastSeen When the device was last seen. - * @param localTime The local time of the device. - */ - public Device( - @JsonProperty("confidence") Double confidence, - @JsonProperty("id") UUID id, - @JsonProperty("last_seen") String lastSeen, - @JsonProperty("local_time") String localTime - ) { - this.confidence = confidence; - this.id = id; - this.lastSeen = lastSeen; - this.localTime = localTime; - } + @JsonProperty("id") + UUID id, + + @JsonProperty("last_seen") + String lastSeen, + + @JsonProperty("local_time") + String localTime +) implements JsonSerializable { /** - * Constructor for {@code Device}. + * Constructs an instance of {@code Device} with no data. */ public Device() { this(null, null, null, null); @@ -49,24 +48,32 @@ public Device() { * @return a number representing the confidence that the device ID refers to a unique device as * opposed to a cluster of similar devices. A confidence of 0.01 indicates very low * confidence that the device is unique, whereas 99 indicates very high confidence. + * @deprecated Use {@link #confidence()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("confidence") public Double getConfidence() { - return confidence; + return confidence(); } /** * @return A UUID identifying the device associated with this IP address. + * @deprecated Use {@link #id()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("id") public UUID getId() { - return id; + return id(); } /** * @return The date and time of the last sighting of the device. This is an RFC 3339 date-time. + * @deprecated Use {@link #lastSeen()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("last_seen") public String getLastSeen() { - return lastSeen; + return lastSeen(); } /** @@ -83,10 +90,12 @@ public ZonedDateTime getLastSeenDateTime() { /** * @return The date and time of the transaction at the UTC offset associated with the device. * This is an RFC 3339 date-time. + * @deprecated Use {@link #localTime()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("local_time") public String getLocalTime() { - return localTime; + return localTime(); } /** diff --git a/src/main/java/com/maxmind/minfraud/response/Disposition.java b/src/main/java/com/maxmind/minfraud/response/Disposition.java index 60a87e43..ac178b1a 100644 --- a/src/main/java/com/maxmind/minfraud/response/Disposition.java +++ b/src/main/java/com/maxmind/minfraud/response/Disposition.java @@ -1,35 +1,35 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains the disposition set by custom rules. + * + * @param action A {@code String} with the action to take on the transaction as defined by your + * custom rules. The current set of values are "accept", "manual_review", "reject" + * and "test". If you do not have custom rules set up, {@code null} will be + * returned. + * @param reason A {@code String} with the reason for the action. The current possible values + * are "custom_rule" and "default". If you do not have custom rules set up, + * {@code null} will be returned. + * @param ruleLabel A {@code String} with the label of the custom rule that was triggered. If you + * do not have custom rules set up, the triggered custom rule does not have a + * label, or no custom rule was triggered, {@code null} will be returned. */ -public final class Disposition extends AbstractModel { - private final String action; - private final String reason; - private final String ruleLabel; +public record Disposition( + @JsonProperty("action") + String action, - /** - * Constructor for {@code Disposition}. - * - * @param action the disposition action - * @param reason reason - * @param ruleLabel rule label - */ - public Disposition( - @JsonProperty("action") String action, - @JsonProperty("reason") String reason, - @JsonProperty("rule_label") String ruleLabel - ) { - this.action = action; - this.reason = reason; - this.ruleLabel = ruleLabel; - } + @JsonProperty("reason") + String reason, + + @JsonProperty("rule_label") + String ruleLabel +) implements JsonSerializable { /** - * Constructor for {@code Disposition}. + * Constructs an instance of {@code Disposition} with no data. */ public Disposition() { this(null, null, null); @@ -39,29 +39,35 @@ public Disposition() { * @return A {@code String} with the action to take on the transaction as defined by your custom * rules. The current set of values are "accept", "manual_review", "reject" and "test". If * you do not have custom rules set up, {@code null} will be returned. + * @deprecated Use {@link #action()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("action") public String getAction() { - return action; + return action(); } /** * @return A {@code String} with the reason for the action. The current possible values are * "custom_rule" and "default". If you do not have custom rules set up, {@code null} will be * returned. + * @deprecated Use {@link #reason()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("reason") public String getReason() { - return reason; + return reason(); } /** * @return A {@code String} with the label of the custom rule that was triggered. If you do not * have custom rules set up, the triggered custom rule does not have a label, or no custom * rule was triggered, {@code null} will be returned. + * @deprecated Use {@link #ruleLabel()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("rule_label") public String getRuleLabel() { - return ruleLabel; + return ruleLabel(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/Email.java b/src/main/java/com/maxmind/minfraud/response/Email.java index a66712cc..784a2846 100644 --- a/src/main/java/com/maxmind/minfraud/response/Email.java +++ b/src/main/java/com/maxmind/minfraud/response/Email.java @@ -2,42 +2,45 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; import java.time.LocalDate; /** * This class contains minFraud response data related to the email address. + * + * @param domain The {@code EmailDomain} model object. + * @param isDisposable Whether it is a disposable email. + * @param isFree Whether it is a free email. + * @param isHighRisk Whether it is a high risk email. + * @param firstSeen A date string (e.g. 2017-04-24) to identify the date an email address was + * first seen by MaxMind. This is expressed using the ISO 8601 date format. */ -public final class Email extends AbstractModel { - private final Boolean isDisposable; - private final Boolean isFree; - private final Boolean isHighRisk; - private final String firstSeen; - private final EmailDomain domain; +public record Email( + @JsonProperty("domain") + EmailDomain domain, + + @JsonProperty("is_disposable") + Boolean isDisposable, + + @JsonProperty("is_free") + Boolean isFree, + + @JsonProperty("is_high_risk") + Boolean isHighRisk, + + @JsonProperty("first_seen") + String firstSeen +) implements JsonSerializable { /** - * @param domain The {@code EmailDomain} model object. - * @param isDisposable Whether it is a disposable email. - * @param isFree Whether it is a free email. - * @param isHighRisk Whether it is a high risk email. - * @param firstSeen When the email was first seen. + * Compact canonical constructor that sets defaults for null values. */ - public Email( - @JsonProperty("domain") EmailDomain domain, - @JsonProperty("is_disposable") Boolean isDisposable, - @JsonProperty("is_free") Boolean isFree, - @JsonProperty("is_high_risk") Boolean isHighRisk, - @JsonProperty("first_seen") String firstSeen - ) { - this.domain = domain == null ? new EmailDomain() : domain; - this.isDisposable = isDisposable; - this.isFree = isFree; - this.isHighRisk = isHighRisk; - this.firstSeen = firstSeen; + public Email { + domain = domain != null ? domain : new EmailDomain(); } /** - * Constructor for {@code Email}. + * Constructs an instance of {@code Email} with no data. */ public Email() { this(null, null, null, null, null); @@ -45,47 +48,23 @@ public Email() { /** * @return The {@code EmailDomain} model object. + * @deprecated Use {@link #domain()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("domain") public EmailDomain getDomain() { - return domain; - } - - /** - * @return Whether the email address is from a disposable email provider. If no email address - * was passed, this will be {@code null}. - */ - @JsonProperty("is_disposable") - public Boolean isDisposable() { - return isDisposable; - } - - /** - * /** - * - * @return Whether the email address is from a free email provider such as Gmail. If no email - * address was passed, this will be {@code null}. - */ - @JsonProperty("is_free") - public Boolean isFree() { - return isFree; - } - - /** - * @return Whether the email address is associated with fraud. If no email address was passed, - * this will be {@code null}. - */ - @JsonProperty("is_high_risk") - public Boolean isHighRisk() { - return isHighRisk; + return domain(); } /** * @return A date string (e.g. 2017-04-24) to identify the date an email address was first seen * by MaxMind. This is expressed using the ISO 8601 date format. + * @deprecated Use {@link #firstSeen()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("first_seen") public String getFirstSeen() { - return firstSeen; + return firstSeen(); } /** diff --git a/src/main/java/com/maxmind/minfraud/response/EmailDomain.java b/src/main/java/com/maxmind/minfraud/response/EmailDomain.java index e060ff53..dc4452ae 100644 --- a/src/main/java/com/maxmind/minfraud/response/EmailDomain.java +++ b/src/main/java/com/maxmind/minfraud/response/EmailDomain.java @@ -1,28 +1,21 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; import java.time.LocalDate; /** * This class contains minFraud response data related to the email domain. + * + * @param firstSeen A date to identify the date an email domain was first seen by MaxMind. */ -public final class EmailDomain extends AbstractModel { - private final LocalDate firstSeen; - - /** - * Constructor for {@code EmailDomain}. - * - * @param firstSeen A date to identify the date an email domain was first seen by MaxMind. - */ - public EmailDomain( - @JsonProperty("first_seen") LocalDate firstSeen - ) { - this.firstSeen = firstSeen; - } +public record EmailDomain( + @JsonProperty("first_seen") + LocalDate firstSeen +) implements JsonSerializable { /** - * Constructor for {@code EmailDomain}. + * Constructs an instance of {@code EmailDomain} with no data. */ public EmailDomain() { this(null); @@ -30,9 +23,11 @@ public EmailDomain() { /** * @return A date to identify the date an email domain was first seen by MaxMind. + * @deprecated Use {@link #firstSeen()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("first_seen") public LocalDate getFirstSeen() { - return firstSeen; + return firstSeen(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/FactorsResponse.java b/src/main/java/com/maxmind/minfraud/response/FactorsResponse.java index e847a74b..10f3bf93 100644 --- a/src/main/java/com/maxmind/minfraud/response/FactorsResponse.java +++ b/src/main/java/com/maxmind/minfraud/response/FactorsResponse.java @@ -1,69 +1,267 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; +import com.maxmind.minfraud.JsonSerializable; import java.util.List; import java.util.UUID; /** * This class provides a model for the minFraud Factors response. + * + * @param billingAddress The {@code BillingAddress} model object. + * @param billingPhone The {@code Phone} model object for the billing phone number. + * @param creditCard The {@code CreditCard} model object. + * @param device The {@code Device} model object. + * @param disposition The disposition set by your custom rules. + * @param email The {@code Email} model object. + * @param fundsRemaining The approximate US dollar value of the funds remaining on your MaxMind + * account. + * @param id This is a UUID that identifies the minFraud request. + * @param ipAddress The {@code IpAddress} model object. + * @param queriesRemaining The approximate number of queries remaining for this service before your + * account runs out of funds. + * @param riskScore This returns the risk score, from 0.01 to 99. A higher score indicates + * a higher risk of fraud. For example, a score of 20 indicates a 20% + * chance that a transaction is fraudulent. We never return a risk score of + * 0, since all transactions have the possibility of being fraudulent. + * Likewise, we never return a risk score of 100. + * @param riskScoreReasons A list containing {@code RiskScoreReason} model objects that describe + * risk score reasons for a given transaction that change the risk score + * significantly. Risk score reasons are usually only returned for medium + * to high risk transactions. If there were no significant changes to the + * risk score due to these reasons, then this list will be empty. + * @param shippingAddress The {@code ShippingAddress} model object. + * @param shippingPhone The {@code Phone} model object for the shipping phone number. + * @param warnings An unmodifiable list containing warning objects that detail issues with + * the request such as invalid or unknown inputs. It is highly recommended + * that you check this list for issues when integrating the web service. */ -public final class FactorsResponse extends InsightsResponse { - - private final List riskScoreReasons; - - - /** - * Constructor for {@code FactorsResponse}. - * - * @param billingAddress The {@code BillingAddress} model object. - * @param creditCard The {@code CreditCard} model object. - * @param device The {@code Device} model object. - * @param disposition The {@code Disposition} model object. - * @param email The {@code Email} model object. - * @param fundsRemaining The approximate US dollar value of the funds. - * @param id This is a UUID that identifies the minFraud request. - * @param ipAddress The {@code IpAddress} model object. - * @param queriesRemaining The number of queries remaining. - * @param riskScore The risk score. - * @param shippingAddress The {@code ShippingAddress} model object. - * @param riskScoreReasons A list containing {@code RiskScoreReason} model objects that - * describe risk score reasons for a given transaction that change the risk score - * significantly. Risk score reasons are usually only returned for medium to high risk - * transactions. If there were no significant changes to the risk score due to these - * reasons, then this list will be empty. - * @param warnings A list containing warning objects. - */ - public FactorsResponse( - @JsonProperty("billing_address") BillingAddress billingAddress, - @JsonProperty("billing_phone") Phone billingPhone, - @JsonProperty("credit_card") CreditCard creditCard, - @JsonProperty("device") Device device, - @JsonProperty("disposition") Disposition disposition, - @JsonProperty("email") Email email, - @JsonProperty("funds_remaining") Double fundsRemaining, - @JsonProperty("id") UUID id, - @JsonProperty("ip_address") IpAddress ipAddress, - @JsonProperty("queries_remaining") Integer queriesRemaining, - @JsonProperty("risk_score") Double riskScore, - @JsonProperty("shipping_address") ShippingAddress shippingAddress, - @JsonProperty("shipping_phone") Phone shippingPhone, - @JsonProperty("risk_score_reasons") List riskScoreReasons, - @JsonProperty("warnings") List warnings - ) { - super(billingAddress, billingPhone, creditCard, device, disposition, email, - fundsRemaining, id, ipAddress, queriesRemaining, riskScore, - shippingAddress, shippingPhone, warnings); - this.riskScoreReasons = riskScoreReasons; +public record FactorsResponse( + @JsonProperty("billing_address") + BillingAddress billingAddress, + + @JsonProperty("billing_phone") + Phone billingPhone, + + @JsonProperty("credit_card") + CreditCard creditCard, + + @JsonProperty("device") + Device device, + + @JsonProperty("disposition") + Disposition disposition, + + @JsonProperty("email") + Email email, + + @JsonProperty("funds_remaining") + Double fundsRemaining, + + @JsonProperty("id") + UUID id, + + @JsonProperty("ip_address") + IpAddress ipAddress, + + @JsonProperty("queries_remaining") + Integer queriesRemaining, + + @JsonProperty("risk_score") + Double riskScore, + + @JsonProperty("risk_score_reasons") + List riskScoreReasons, + + @JsonProperty("shipping_address") + ShippingAddress shippingAddress, + + @JsonProperty("shipping_phone") + Phone shippingPhone, + + @JsonProperty("warnings") + List warnings +) implements JsonSerializable { + + /** + * Compact canonical constructor that sets defaults for null values. + */ + public FactorsResponse { + billingAddress = billingAddress != null ? billingAddress : new BillingAddress(); + billingPhone = billingPhone != null ? billingPhone : new Phone(); + creditCard = creditCard != null ? creditCard : new CreditCard(); + device = device != null ? device : new Device(); + disposition = disposition != null ? disposition : new Disposition(); + email = email != null ? email : new Email(); + ipAddress = ipAddress != null ? ipAddress : new IpAddress(); + riskScoreReasons = riskScoreReasons != null ? List.copyOf(riskScoreReasons) : List.of(); + shippingAddress = shippingAddress != null ? shippingAddress : new ShippingAddress(); + shippingPhone = shippingPhone != null ? shippingPhone : new Phone(); + warnings = warnings != null ? List.copyOf(warnings) : List.of(); + } + + /** + * Constructs an instance of {@code FactorsResponse} with no data. + */ + public FactorsResponse() { + this(null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null); + } + + /** + * @return The {@code BillingAddress} model object. + * @deprecated Use {@link #billingAddress()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("billing_address") + public BillingAddress getBillingAddress() { + return billingAddress(); + } + + /** + * @return The {@code Phone} model object for the billing phone number. + * @deprecated Use {@link #billingPhone()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("billing_phone") + public Phone getBillingPhone() { + return billingPhone(); + } + + /** + * @return The {@code CreditCard} model object. + * @deprecated Use {@link #creditCard()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("credit_card") + public CreditCard getCreditCard() { + return creditCard(); + } + + /** + * @return The {@code Device} model object. + * @deprecated Use {@link #device()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("device") + public Device getDevice() { + return device(); } + /** + * @return The disposition set by your custom rules. + * @deprecated Use {@link #disposition()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("disposition") + public Disposition getDisposition() { + return disposition(); + } + + /** + * @return The {@code Email} model object. + * @deprecated Use {@link #email()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("email") + public Email getEmail() { + return email(); + } + + /** + * @return The approximate US dollar value of the funds remaining on your MaxMind account. + * @deprecated Use {@link #fundsRemaining()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("funds_remaining") + public Double getFundsRemaining() { + return fundsRemaining(); + } + + /** + * @return This is a UUID that identifies the minFraud request. + * @deprecated Use {@link #id()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("id") + public UUID getId() { + return id(); + } + + /** + * @return The {@code IpAddress} model object. + * @deprecated Use {@link #ipAddress()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("ip_address") + public IpAddress getIpAddress() { + return ipAddress(); + } + + /** + * @return The approximate number of queries remaining for this service before your account runs + * out of funds. + * @deprecated Use {@link #queriesRemaining()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("queries_remaining") + public Integer getQueriesRemaining() { + return queriesRemaining(); + } + + /** + * @return This returns the risk score, from 0.01 to 99. A higher score indicates a higher risk + * of fraud. For example, a score of 20 indicates a 20% chance that a transaction is + * fraudulent. We never return a risk score of 0, since all transactions have the + * possibility of being fraudulent. Likewise, we never return a risk score of 100. + * @deprecated Use {@link #riskScore()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("risk_score") + public Double getRiskScore() { + return riskScore(); + } /** * @return A list containing objects that describe risk score reasons * for a given transaction that change the risk score significantly. + * @deprecated Use {@link #riskScoreReasons()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("risk_score_reasons") public List getRiskScoreReasons() { - return riskScoreReasons; + return riskScoreReasons(); } + /** + * @return The {@code ShippingAddress} model object. + * @deprecated Use {@link #shippingAddress()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("shipping_address") + public ShippingAddress getShippingAddress() { + return shippingAddress(); + } + + /** + * @return The {@code Phone} model object for the shipping phone number. + * @deprecated Use {@link #shippingPhone()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("shipping_phone") + public Phone getShippingPhone() { + return shippingPhone(); + } + + /** + * @return An unmodifiable list containing warning objects that detail issues with the request + * such as invalid or unknown inputs. It is highly recommended that you check this list for + * issues when integrating the web service. + * @deprecated Use {@link #warnings()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("warnings") + public List getWarnings() { + return warnings(); + } } diff --git a/src/main/java/com/maxmind/minfraud/response/GeoIp2Location.java b/src/main/java/com/maxmind/minfraud/response/GeoIp2Location.java index f0b79789..36043926 100644 --- a/src/main/java/com/maxmind/minfraud/response/GeoIp2Location.java +++ b/src/main/java/com/maxmind/minfraud/response/GeoIp2Location.java @@ -2,61 +2,146 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.geoip2.record.Location; +import com.maxmind.minfraud.JsonSerializable; import java.time.ZonedDateTime; /** * This class contains minFraud response data related to the GeoIP2 Insights location. + * + * @param accuracyRadius The approximate accuracy radius in kilometers around the latitude and + * longitude for the geographical entity (country, subdivision, city or + * postal code) associated with the IP address. + * @param averageIncome The average income in US dollars associated with the requested IP + * address. + * @param latitude The approximate latitude of the location associated with the IP + * address. + * @param localTime The date and time of the transaction in the time zone associated with + * the IP address. The value is formatted according to RFC 3339. For + * instance, the local time in Boston might be returned as + * "2015-04-27T19:17:24-04:00". + * @param longitude The approximate longitude of the location associated with the IP + * address. + * @param metroCode The metro code of the location if the location is in the US. + * @param populationDensity The estimated population per square kilometer associated with the IP + * address. + * @param timeZone The time zone associated with location, as specified by the IANA Time + * Zone Database. */ -public final class GeoIp2Location extends Location { - private final String localTime; +public record GeoIp2Location( + @JsonProperty("accuracy_radius") + Integer accuracyRadius, + + @JsonProperty("average_income") + Integer averageIncome, + + @JsonProperty("latitude") + Double latitude, + + @JsonProperty("local_time") + String localTime, + + @JsonProperty("longitude") + Double longitude, + + @JsonProperty("metro_code") + Integer metroCode, + + @JsonProperty("population_density") + Integer populationDensity, + + @JsonProperty("time_zone") + String timeZone +) implements JsonSerializable { + + /** + * Constructs an instance of {@code GeoIp2Location} with no data. + */ + public GeoIp2Location() { + this(null, null, null, null, null, null, null, null); + } /** - * Constructor for {@code EmailDomain}. - * - * @param accuracyRadius The approximate accuracy radius in kilometers. - * @param averageIncome The average income in US dollars associated with the IP address. - * @param latitude The approximate latitude of the location associated with the IP - * address. - * @param localTime The date and time of the transaction in the time zone associated - * with the IP address. - * @param longitude The approximate longitude of the location associated with the IP - * address. - * @param metroCode The metro code of the location if the location is in the US. - * @param populationDensity The estimated population per square kilometer associated with the IP - * address. - * @param timeZone The time zone associated with the location. + * @return The approximate accuracy radius in kilometers around the latitude and longitude + * for the geographical entity (country, subdivision, city or postal code) associated + * with the IP address. + * @deprecated Use {@link #accuracyRadius()} instead. This method will be removed in 5.0.0. */ - public GeoIp2Location( - @JsonProperty("accuracy_radius") Integer accuracyRadius, - @JsonProperty("average_income") Integer averageIncome, - @JsonProperty("latitude") Double latitude, - @JsonProperty("local_time") String localTime, - @JsonProperty("longitude") Double longitude, - @JsonProperty("metro_code") Integer metroCode, - @JsonProperty("population_density") Integer populationDensity, - @JsonProperty("time_zone") String timeZone - ) { - super(accuracyRadius, averageIncome, latitude, longitude, metroCode, populationDensity, - timeZone); - this.localTime = localTime; + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("accuracy_radius") + public Integer getAccuracyRadius() { + return accuracyRadius(); } /** - * Constructor for {@code GeoIp2Location} + * @return The average income in US dollars associated with the requested IP address. + * @deprecated Use {@link #averageIncome()} instead. This method will be removed in 5.0.0. */ - public GeoIp2Location() { - this(null, null, null, null, null, null, null, null); + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("average_income") + public Integer getAverageIncome() { + return averageIncome(); + } + + /** + * @return The approximate latitude of the location associated with the IP address. + * @deprecated Use {@link #latitude()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("latitude") + public Double getLatitude() { + return latitude(); + } + + /** + * @return The approximate longitude of the location associated with the IP address. + * @deprecated Use {@link #longitude()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("longitude") + public Double getLongitude() { + return longitude(); + } + + /** + * @return The metro code of the location if the location is in the US. + * @deprecated Use {@link #metroCode()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("metro_code") + public Integer getMetroCode() { + return metroCode(); + } + + /** + * @return The estimated population per square kilometer associated with the IP address. + * @deprecated Use {@link #populationDensity()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("population_density") + public Integer getPopulationDensity() { + return populationDensity(); + } + + /** + * @return The time zone associated with location, as specified by the IANA Time Zone Database. + * @deprecated Use {@link #timeZone()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("time_zone") + public String getTimeZone() { + return timeZone(); } /** * @return The date and time of the transaction in the time zone associated with the IP address. * The value is formatted according to RFC 3339. For instance, the local time in Boston * might be returned as "2015-04-27T19:17:24-04:00". + * @deprecated Use {@link #localTime()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("local_time") public String getLocalTime() { - return this.localTime; + return localTime(); } /** diff --git a/src/main/java/com/maxmind/minfraud/response/InsightsResponse.java b/src/main/java/com/maxmind/minfraud/response/InsightsResponse.java index 5c2cbfc1..8adde31b 100644 --- a/src/main/java/com/maxmind/minfraud/response/InsightsResponse.java +++ b/src/main/java/com/maxmind/minfraud/response/InsightsResponse.java @@ -1,127 +1,246 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; +import com.maxmind.minfraud.JsonSerializable; import java.util.List; import java.util.UUID; /** * This class provides a model for the minFraud Insights response. + * + * @param billingAddress The {@code BillingAddress} model object. + * @param billingPhone The {@code Phone} model object for the billing phone number. + * @param creditCard The {@code CreditCard} model object. + * @param device The {@code Device} model object. + * @param disposition The disposition set by your custom rules. + * @param email The {@code Email} model object. + * @param fundsRemaining The approximate US dollar value of the funds remaining on your MaxMind + * account. + * @param id This is a UUID that identifies the minFraud request. + * @param ipAddress The {@code IpAddress} model object. + * @param queriesRemaining The approximate number of queries remaining for this service before your + * account runs out of funds. + * @param riskScore This returns the risk score, from 0.01 to 99. A higher score indicates + * a higher risk of fraud. For example, a score of 20 indicates a 20% + * chance that a transaction is fraudulent. We never return a risk score of + * 0, since all transactions have the possibility of being fraudulent. + * Likewise, we never return a risk score of 100. + * @param shippingAddress The {@code ShippingAddress} model object. + * @param shippingPhone The {@code Phone} model object for the shipping phone number. + * @param warnings An unmodifiable list containing warning objects that detail issues with + * the request such as invalid or unknown inputs. It is highly recommended + * that you check this list for issues when integrating the web service. */ -public class InsightsResponse extends ScoreResponse { - private final IpAddress ipAddress; - private final CreditCard creditCard; - private final Device device; - private final Email email; - private final BillingAddress billingAddress; - private final Phone billingPhone; - private final ShippingAddress shippingAddress; - private final Phone shippingPhone; - - /** - * Constructor for {@code InsightsResponse}. - * - * @param billingAddress billing address - * @param billingPhone billing phone - * @param creditCard credit card - * @param device device - * @param disposition disposition - * @param email email - * @param fundsRemaining funds remaining - * @param id id - * @param ipAddress ip address - * @param queriesRemaining queries remaining - * @param riskScore risk score - * @param shippingAddress shipping address - * @param shippingPhone shipping phone - * @param warnings warnings - */ - public InsightsResponse( - @JsonProperty("billing_address") BillingAddress billingAddress, - @JsonProperty("billing_phone") Phone billingPhone, - @JsonProperty("credit_card") CreditCard creditCard, - @JsonProperty("device") Device device, - @JsonProperty("disposition") Disposition disposition, - @JsonProperty("email") Email email, - @JsonProperty("funds_remaining") Double fundsRemaining, - @JsonProperty("id") UUID id, - @JsonProperty("ip_address") IpAddress ipAddress, - @JsonProperty("queries_remaining") Integer queriesRemaining, - @JsonProperty("risk_score") Double riskScore, - @JsonProperty("shipping_address") ShippingAddress shippingAddress, - @JsonProperty("shipping_phone") Phone shippingPhone, - @JsonProperty("warnings") List warnings - ) { - super(disposition, fundsRemaining, id, null, queriesRemaining, riskScore, warnings); - this.billingAddress = billingAddress == null ? new BillingAddress() : billingAddress; - this.billingPhone = billingPhone == null ? new Phone() : billingPhone; - this.creditCard = creditCard == null ? new CreditCard() : creditCard; - this.device = device == null ? new Device() : device; - this.email = email == null ? new Email() : email; - this.ipAddress = ipAddress == null ? new IpAddress() : ipAddress; - this.shippingAddress = shippingAddress == null ? new ShippingAddress() : shippingAddress; - this.shippingPhone = shippingPhone == null ? new Phone() : shippingPhone; +public record InsightsResponse( + @JsonProperty("billing_address") + BillingAddress billingAddress, + + @JsonProperty("billing_phone") + Phone billingPhone, + + @JsonProperty("credit_card") + CreditCard creditCard, + + @JsonProperty("device") + Device device, + + @JsonProperty("disposition") + Disposition disposition, + + @JsonProperty("email") + Email email, + + @JsonProperty("funds_remaining") + Double fundsRemaining, + + @JsonProperty("id") + UUID id, + + @JsonProperty("ip_address") + IpAddress ipAddress, + + @JsonProperty("queries_remaining") + Integer queriesRemaining, + + @JsonProperty("risk_score") + Double riskScore, + + @JsonProperty("shipping_address") + ShippingAddress shippingAddress, + + @JsonProperty("shipping_phone") + Phone shippingPhone, + + @JsonProperty("warnings") + List warnings +) implements JsonSerializable { + + /** + * Compact canonical constructor that sets defaults for null values. + */ + public InsightsResponse { + billingAddress = billingAddress != null ? billingAddress : new BillingAddress(); + billingPhone = billingPhone != null ? billingPhone : new Phone(); + creditCard = creditCard != null ? creditCard : new CreditCard(); + device = device != null ? device : new Device(); + disposition = disposition != null ? disposition : new Disposition(); + email = email != null ? email : new Email(); + ipAddress = ipAddress != null ? ipAddress : new IpAddress(); + shippingAddress = shippingAddress != null ? shippingAddress : new ShippingAddress(); + shippingPhone = shippingPhone != null ? shippingPhone : new Phone(); + warnings = warnings != null ? List.copyOf(warnings) : List.of(); } + /** + * Constructs an instance of {@code InsightsResponse} with no data. + */ + public InsightsResponse() { + this(null, null, null, null, null, null, null, null, null, null, null, null, null, null); + } /** - * @return The {@code IpAddress} model object. + * @return The {@code BillingAddress} model object. + * @deprecated Use {@link #billingAddress()} instead. This method will be removed in 5.0.0. */ - @JsonProperty("ip_address") - public IpAddress getIpAddress() { - return ipAddress; + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("billing_address") + public BillingAddress getBillingAddress() { + return billingAddress(); + } + + /** + * @return The {@code Phone} model object for the billing phone number. + * @deprecated Use {@link #billingPhone()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("billing_phone") + public Phone getBillingPhone() { + return billingPhone(); } /** * @return The {@code CreditCard} model object. + * @deprecated Use {@link #creditCard()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("credit_card") public CreditCard getCreditCard() { - return creditCard; + return creditCard(); } /** * @return The {@code Device} model object. + * @deprecated Use {@link #device()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("device") public Device getDevice() { - return device; + return device(); + } + + /** + * @return The disposition set by your custom rules. + * @deprecated Use {@link #disposition()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("disposition") + public Disposition getDisposition() { + return disposition(); } /** * @return The {@code Email} model object. + * @deprecated Use {@link #email()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("email") public Email getEmail() { - return email; + return email(); + } + + /** + * @return The approximate US dollar value of the funds remaining on your MaxMind account. + * @deprecated Use {@link #fundsRemaining()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("funds_remaining") + public Double getFundsRemaining() { + return fundsRemaining(); + } + + /** + * @return This is a UUID that identifies the minFraud request. + * @deprecated Use {@link #id()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("id") + public UUID getId() { + return id(); + } + + /** + * @return The {@code IpAddress} model object. + * @deprecated Use {@link #ipAddress()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("ip_address") + public IpAddress getIpAddress() { + return ipAddress(); + } + + /** + * @return The approximate number of queries remaining for this service before your account runs + * out of funds. + * @deprecated Use {@link #queriesRemaining()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("queries_remaining") + public Integer getQueriesRemaining() { + return queriesRemaining(); + } + + /** + * @return This returns the risk score, from 0.01 to 99. A higher score indicates a higher risk + * of fraud. For example, a score of 20 indicates a 20% chance that a transaction is + * fraudulent. We never return a risk score of 0, since all transactions have the + * possibility of being fraudulent. Likewise, we never return a risk score of 100. + * @deprecated Use {@link #riskScore()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("risk_score") + public Double getRiskScore() { + return riskScore(); } /** * @return The {@code ShippingAddress} model object. + * @deprecated Use {@link #shippingAddress()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("shipping_address") public ShippingAddress getShippingAddress() { - return shippingAddress; + return shippingAddress(); } /** * @return The {@code Phone} model object for the shipping phone number. + * @deprecated Use {@link #shippingPhone()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("shipping_phone") public Phone getShippingPhone() { - return shippingPhone; - } - - /** - * @return The {@code BillingAddress} model object. - */ - @JsonProperty("billing_address") - public BillingAddress getBillingAddress() { - return billingAddress; + return shippingPhone(); } /** - * @return The {@code Phone} model object for the billing phone number. + * @return An unmodifiable list containing warning objects that detail issues with the request + * such as invalid or unknown inputs. It is highly recommended that you check this list for + * issues when integrating the web service. + * @deprecated Use {@link #warnings()} instead. This method will be removed in 5.0.0. */ - @JsonProperty("billing_phone") - public Phone getBillingPhone() { - return billingPhone; + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("warnings") + public List getWarnings() { + return warnings(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/IpAddress.java b/src/main/java/com/maxmind/minfraud/response/IpAddress.java index 93c4e83d..1644fe50 100644 --- a/src/main/java/com/maxmind/minfraud/response/IpAddress.java +++ b/src/main/java/com/maxmind/minfraud/response/IpAddress.java @@ -1,97 +1,194 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.geoip2.model.InsightsResponse; import com.maxmind.geoip2.record.City; import com.maxmind.geoip2.record.Continent; import com.maxmind.geoip2.record.Country; -import com.maxmind.geoip2.record.MaxMind; import com.maxmind.geoip2.record.Postal; import com.maxmind.geoip2.record.RepresentedCountry; import com.maxmind.geoip2.record.Subdivision; import com.maxmind.geoip2.record.Traits; -import java.util.Collections; +import com.maxmind.minfraud.JsonSerializable; import java.util.List; /** - * This class contains minFraud response data related to the IP location + * This class contains minFraud response data related to the IP location. + * + * @param city City record for the requested IP address. + * @param continent Continent record for the requested IP address. + * @param country Country record for the requested IP address. + * @param location Location record for the requested IP address. + * @param postal Postal record for the requested IP address. + * @param registeredCountry Registered country record for the requested IP address. + * @param representedCountry Represented country record for the requested IP address. + * @param risk The risk associated with the IP address. + * @param riskReasons An unmodifiable list containing risk reason objects that identify the + * reasons why the IP address received the associated risk. This will be + * an empty list if there are no reasons. + * @param subdivisions List of subdivision records for the requested IP address. + * @param traits Traits record for the requested IP address. */ -public final class IpAddress extends InsightsResponse implements IpAddressInterface { - private final GeoIp2Location location; - private final Double risk; - private final List riskReasons; +public record IpAddress( + @JsonProperty("city") + City city, + + @JsonProperty("continent") + Continent continent, + + @JsonProperty("country") + Country country, + + @JsonProperty("location") + GeoIp2Location location, + + @JsonProperty("postal") + Postal postal, + + @JsonProperty("registered_country") + Country registeredCountry, + + @JsonProperty("represented_country") + RepresentedCountry representedCountry, + + @JsonProperty("risk") + Double risk, + + @JsonProperty("risk_reasons") + List riskReasons, + + @JsonProperty("subdivisions") + List subdivisions, + + @JsonProperty("traits") + Traits traits +) implements IpAddressInterface, JsonSerializable { /** - * Constructor for {@code IpAddress} - * - * @param city The city information. - * @param continent The continent information. - * @param country The country information. - * @param location The location information. - * @param maxmind MaxMind-specific information. - * @param postal The postal information. - * @param registeredCountry The information about the country where the IP was registered. - * @param representedCountry The represented country, e.g., for military bases in other - * countries. - * @param risk The IP risk. - * @param riskReasons The reasons for the IP risk. - * @param subdivisions The list of subdivisions. - * @param traits Information about various other IP traits. + * Compact canonical constructor that sets defaults for null values. */ - public IpAddress( - @JsonProperty("city") City city, - @JsonProperty("continent") Continent continent, - @JsonProperty("country") Country country, - @JsonProperty("location") GeoIp2Location location, - @JsonProperty("maxmind") MaxMind maxmind, - @JsonProperty("postal") Postal postal, - @JsonProperty("registered_country") Country registeredCountry, - @JsonProperty("represented_country") RepresentedCountry representedCountry, - @JsonProperty("risk") Double risk, - @JsonProperty("risk_reasons") List riskReasons, - @JsonProperty("subdivisions") List subdivisions, - @JsonProperty("traits") Traits traits - ) { - super(city, continent, country, location, maxmind, postal, registeredCountry, - representedCountry, subdivisions, traits); - this.location = location == null ? new GeoIp2Location() : location; - this.risk = risk; - this.riskReasons = - Collections.unmodifiableList(riskReasons == null ? List.of() : riskReasons); + public IpAddress { + location = location != null ? location : new GeoIp2Location(); + riskReasons = riskReasons != null ? List.copyOf(riskReasons) : List.of(); + subdivisions = subdivisions != null ? List.copyOf(subdivisions) : List.of(); } /** - * Constructor for {@code IpAddress}. + * Constructs an instance of {@code IpAddress} with no data. */ public IpAddress() { this(null, null, null, null, null, null, - null, null, null, null, null, null); + null, null, null, null, null); } /** * @return Location record for the requested IP address. + * @deprecated Use {@link #location()} instead. This method will be removed in 5.0.0. */ - @Override + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("location") public GeoIp2Location getLocation() { - return location; + return location(); + } + + /** + * @return City record for the requested IP address. + * @deprecated Use {@link #city()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("city") + public City getCity() { + return city(); + } + + /** + * @return Continent record for the requested IP address. + * @deprecated Use {@link #continent()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("continent") + public Continent getContinent() { + return continent(); + } + + /** + * @return Country record for the requested IP address. + * @deprecated Use {@link #country()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("country") + public Country getCountry() { + return country(); + } + + /** + * @return Postal record for the requested IP address. + * @deprecated Use {@link #postal()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("postal") + public Postal getPostal() { + return postal(); } + /** + * @return Registered country record for the requested IP address. + * @deprecated Use {@link #registeredCountry()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("registered_country") + public Country getRegisteredCountry() { + return registeredCountry(); + } + + /** + * @return Represented country record for the requested IP address. + * @deprecated Use {@link #representedCountry()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("represented_country") + public RepresentedCountry getRepresentedCountry() { + return representedCountry(); + } + + /** + * @return List of subdivision records for the requested IP address. + * @deprecated Use {@link #subdivisions()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("subdivisions") + public List getSubdivisions() { + return subdivisions(); + } + + /** + * @return Traits record for the requested IP address. + * @deprecated Use {@link #traits()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("traits") + public Traits getTraits() { + return traits(); + } /** - * @return The risk associated with the IP address. The value ranges from 0.01 to 99. A higher - * score indicates a higher risk. + * @return The risk associated with the IP address. + * @deprecated Use {@link #risk()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("risk") public Double getRisk() { - return risk; + return risk(); } /** * @return An unmodifiable list containing risk reason objects that identify the reasons why the * IP address received the associated risk. This will be an empty list if there are no * reasons. + * @deprecated Use {@link #riskReasons()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("risk_reasons") public List getRiskReasons() { - return riskReasons; + return riskReasons(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/IpAddressInterface.java b/src/main/java/com/maxmind/minfraud/response/IpAddressInterface.java index 3afa99b0..c82f951b 100644 --- a/src/main/java/com/maxmind/minfraud/response/IpAddressInterface.java +++ b/src/main/java/com/maxmind/minfraud/response/IpAddressInterface.java @@ -7,5 +7,14 @@ public interface IpAddressInterface { /** * @return The risk associated with the IP address. */ - Double getRisk(); + Double risk(); + + /** + * @return The risk associated with the IP address. + * @deprecated Use {@link #risk()} instead. This method will be removed in 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + default Double getRisk() { + return risk(); + } } diff --git a/src/main/java/com/maxmind/minfraud/response/IpRiskReason.java b/src/main/java/com/maxmind/minfraud/response/IpRiskReason.java index 24686fa7..fd031ddd 100644 --- a/src/main/java/com/maxmind/minfraud/response/IpRiskReason.java +++ b/src/main/java/com/maxmind/minfraud/response/IpRiskReason.java @@ -1,28 +1,51 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class represents the reason for the IP risk. + * + * @param code This provides a machine-readable code identifying the reason. Although more codes + * may be added in the future, the current codes are: + *
+ *
ANONYMOUS_IP
+ *
The IP address belongs to an anonymous network. See the + * object at {@code .IPAddress.Traits} for more details.
+ * + *
BILLING_POSTAL_VELOCITY
+ *
Many different billing postal codes have been seen on + * this IP address.
+ * + *
EMAIL_VELOCITY
+ *
Many different email addresses have been seen on this + * IP address.
+ * + *
HIGH_RISK_DEVICE
+ *
A high risk device was seen on this IP address.
+ * + *
HIGH_RISK_EMAIL
+ *
A high risk email address was seen on this IP address in + * your past transactions.
+ * + *
ISSUER_ID_NUMBER_VELOCITY
+ *
Many different issuer ID numbers have been seen on this + * IP address.
+ * + *
MINFRAUD_NETWORK_ACTIVITY
+ *
Suspicious activity has been seen on this IP address + * across minFraud customers.
+ *
+ * @param reason This field provides a human-readable explanation of the reason. The description may + * change at any time and should not be matched against. */ -public final class IpRiskReason extends AbstractModel { - private final String code; - private final String reason; +public record IpRiskReason( + @JsonProperty("code") + String code, - /** - * Constructor for {@code IpRiskReason}. - * - * @param code The reason code. - * @param reason This field provides a human-readable explanation of the reason. - */ - public IpRiskReason( - @JsonProperty("code") String code, - @JsonProperty("reason") String reason - ) { - this.code = code; - this.reason = reason; - } + @JsonProperty("reason") + String reason +) implements JsonSerializable { /** * This provides a machine-readable code identifying the reason. Although more codes may be @@ -57,16 +80,22 @@ public IpRiskReason( * * * @return The reason code. + * @deprecated Use {@link #code()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("code") public String getCode() { - return this.code; + return code(); } /** * @return This field provides a human-readable explanation of the reason. The description may * change at any time and should not be matched against. + * @deprecated Use {@link #reason()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("reason") public String getReason() { - return this.reason; + return reason(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/Issuer.java b/src/main/java/com/maxmind/minfraud/response/Issuer.java index 709263c3..a0ee663b 100644 --- a/src/main/java/com/maxmind/minfraud/response/Issuer.java +++ b/src/main/java/com/maxmind/minfraud/response/Issuer.java @@ -1,39 +1,33 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains minFraud response data related to the credit card issuer. + * + * @param matchesProvidedName This is true if the name matches the name provided. + * @param matchesProvidedPhoneNumber This is true if the phone number matches the one provided. + * @param name The name of the bank which issued the credit card. + * @param phoneNumber The phone number of the bank which issued the credit card. In + * some cases the phone number we return may be out of date. */ -public final class Issuer extends AbstractModel { - private final String name; - private final Boolean matchesProvidedName; - private final String phoneNumber; - private final Boolean matchesProvidedPhoneNumber; +public record Issuer( + @JsonProperty("matches_provided_name") + Boolean matchesProvidedName, - /** - * Constructor for {@code Issuer}. - * - * @param matchesProvidedName This is true if the name matches the name provided. - * @param matchesProvidedPhoneNumber This is true if the phone number matches the one provided. - * @param name The name of the bank which issued the credit card. - * @param phoneNumber The phone number of the bank which issued the credit card. - */ - public Issuer( - @JsonProperty("matches_provided_name") Boolean matchesProvidedName, - @JsonProperty("matches_provided_phone_number") Boolean matchesProvidedPhoneNumber, - @JsonProperty("name") String name, - @JsonProperty("phone_number") String phoneNumber - ) { - this.matchesProvidedName = matchesProvidedName; - this.matchesProvidedPhoneNumber = matchesProvidedPhoneNumber; - this.name = name; - this.phoneNumber = phoneNumber; - } + @JsonProperty("matches_provided_phone_number") + Boolean matchesProvidedPhoneNumber, + + @JsonProperty("name") + String name, + + @JsonProperty("phone_number") + String phoneNumber +) implements JsonSerializable { /** - * Constructor for {@code Issuer}. + * Constructs an instance of {@code Issuer} with no data. */ public Issuer() { this(null, null, null, null); @@ -41,39 +35,22 @@ public Issuer() { /** * @return The name of the bank which issued the credit card. + * @deprecated Use {@link #name()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("name") public String getName() { - return name; - } - - /** - * @return This returns true if the name matches the name provided in the request for the card - * issuer. It returns false if the name does not match. It returns null if either no name or - * issuer ID number (IIN) was provided in the request or if MaxMind does not have a name - * associated with the IIN. - */ - @JsonProperty("matches_provided_name") - public Boolean matchesProvidedName() { - return matchesProvidedName; + return name(); } /** * @return The phone number of the bank which issued the credit card. In some cases the phone * number we return may be out of date. + * @deprecated Use {@link #phoneNumber()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("phone_number") public String getPhoneNumber() { - return phoneNumber; - } - - /** - * @return This returns true if the phone number matches the number provided in the request for - * the card issuer. It returns false if the number does not match. It returns null if either - * no phone number or issuer ID number (IIN) was provided in the request or if MaxMind does - * not have a phone number associated with the IIN. - */ - @JsonProperty("matches_provided_phone_number") - public Boolean matchesProvidedPhoneNumber() { - return matchesProvidedPhoneNumber; + return phoneNumber(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/Phone.java b/src/main/java/com/maxmind/minfraud/response/Phone.java index 41dcad14..391f68eb 100644 --- a/src/main/java/com/maxmind/minfraud/response/Phone.java +++ b/src/main/java/com/maxmind/minfraud/response/Phone.java @@ -1,92 +1,77 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains minFraud response data related to the phone number. + * + * @param country The two-character ISO 3166-1 country code for the country associated + * with the phone number. + * @param isVoip Whether the number is VoIP. + * @param matchesPostal Whether the phone number matches the postal code. + * @param networkOperator The name of the original network operator associated with the phone + * number. This field does not reflect phone numbers that have been ported + * from the original operator to another, nor does it identify mobile + * virtual network operators. + * @param numberType One of the following values: {@code fixed} or {@code mobile}. + * Additional values may be added in the future. */ -public final class Phone extends AbstractModel { - private final String country; - private final Boolean isVoip; - private final Boolean matchesPostal; - private final String networkOperator; - private final String numberType; +public record Phone( + @JsonProperty("country") + String country, - /** - * @param country The ISO 3166-2 country code for the phone number. - * @param isVoip Whether the number is VoIP. - * @param matchesPostal Whether the phone number matches the postal code. - * @param networkOperator The network operator associated with the phone number. - * @param numberType The type of the phone number. - */ - public Phone( - @JsonProperty("country") String country, - @JsonProperty("is_voip") Boolean isVoip, - @JsonProperty("matches_postal") Boolean matchesPostal, - @JsonProperty("network_operator") String networkOperator, - @JsonProperty("number_type") String numberType - ) { - this.country = country; - this.isVoip = isVoip; - this.matchesPostal = matchesPostal; - this.networkOperator = networkOperator; - this.numberType = numberType; - } + @JsonProperty("is_voip") + Boolean isVoip, + + @JsonProperty("matches_postal") + Boolean matchesPostal, + + @JsonProperty("network_operator") + String networkOperator, + + @JsonProperty("number_type") + String numberType +) implements JsonSerializable { /** - * Constructor for {@code Phone}. + * Constructs an instance of {@code Phone} with no data. */ public Phone() { this(null, null, null, null, null); } /** - * @return The two-character ISO 3166-1 country code for the country associated with the phone + * @return The two-character ISO 3166-1 country code for the country associated with the phone * number. + * @deprecated Use {@link #country()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("country") public String getCountry() { - return country; - } - - /** - * @return Whether the phone number is a Voice over Internet Protocol (VoIP) number allocated - * by a regulator. The value will be {@code null} if a valid phone number was not provided - * or if we do not have data for the phone number. - */ - @JsonProperty("is_voip") - public Boolean isVoip() { - return isVoip; - } - - /** - * @return This is {@code true} if the phone number's prefix is commonly associated with the - * postal code. It is {@code false} if the prefix is not associated with the postal code. - * It is non-{@code null} only when the phone number is in the US, the number prefix is - * in our database, and the postal code and country are provided in the request. - */ - @JsonProperty("matches_postal") - public Boolean matchesPostal() { - return matchesPostal; + return country(); } /** * @return The name of the original network operator associated with the phone number. This * field does not reflect phone numbers that have been ported from the original operator to * another, nor does it identify mobile virtual network operators. + * @deprecated Use {@link #networkOperator()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("network_operator") public String getNetworkOperator() { - return networkOperator; + return networkOperator(); } /** * @return One of the following values: {@code fixed} or {@code mobile}. Additional values may * be added in the future. + * @deprecated Use {@link #numberType()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("number_type") public String getNumberType() { - return numberType; + return numberType(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/Reason.java b/src/main/java/com/maxmind/minfraud/response/Reason.java index ffb1787a..9a1e7fb6 100644 --- a/src/main/java/com/maxmind/minfraud/response/Reason.java +++ b/src/main/java/com/maxmind/minfraud/response/Reason.java @@ -1,28 +1,85 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class represents a risk score reason for the multiplier. + * + * @param code This field provides a machine-readable code identifying the reason. + * Although more codes + * may be added in the future, the current codes are: + * + *
    + *
  • BROWSER_LANGUAGE - Riskiness of the browser user-agent + * and language associated with the request.
  • + *
  • BUSINESS_ACTIVITY - Riskiness of business activity associated with the + * request.
  • + *
  • COUNTRY - Riskiness of the country associated with the request.
  • + *
  • CUSTOMER_ID - Riskiness of a customer's activity.
  • + *
  • EMAIL_DOMAIN - Riskiness of email domain.
  • + *
  • EMAIL_DOMAIN_NEW - Riskiness of newly-sighted email domain.
  • + *
  • EMAIL_ADDRESS_NEW - Riskiness of newly-sighted email address.
  • + *
  • EMAIL_LOCAL_PART - Riskiness of the local part of the email address.
  • + *
  • EMAIL_VELOCITY - Velocity on email - many requests on same email + * over short period of time.
  • + *
  • ISSUER_ID_NUMBER_COUNTRY_MISMATCH - Riskiness of the country mismatch + * between IP, billing, shipping and IIN country.
  • + *
  • ISSUER_ID_NUMBER_ON_SHOP_ID - Risk of Issuer ID Number for the shop ID.
  • + *
  • ISSUER_ID_NUMBER_LAST_DIGITS_ACTIVITY - Riskiness of many recent + * requests and previous high-risk requests on the IIN and last digits of the + * credit card.
  • + *
  • ISSUER_ID_NUMBER_SHOP_ID_VELOCITY - Risk of recent Issuer ID Number activity + * for the shop ID.
  • + *
  • INTRACOUNTRY_DISTANCE - Risk of distance between IP, billing, + * and shipping location.
  • + *
  • ANONYMOUS_IP - Risk due to IP being an Anonymous IP.
  • + *
  • IP_BILLING_POSTAL_VELOCITY - Velocity of distinct billing postal code + * on IP address.
  • + *
  • IP_EMAIL_VELOCITY - Velocity of distinct email address on IP address.
  • + *
  • IP_HIGH_RISK_DEVICE - High-risk device sighted on IP address.
  • + *
  • IP_ISSUER_ID_NUMBER_VELOCITY - Velocity of distinct IIN on IP address.
  • + *
  • IP_ACTIVITY - Riskiness of IP based on minFraud network activity.
  • + *
  • LANGUAGE - Riskiness of browser language.
  • + *
  • MAX_RECENT_EMAIL - Riskiness of email address based on + * past minFraud risk scores on email.
  • + *
  • MAX_RECENT_PHONE - Riskiness of phone number based on + * past minFraud risk scores on phone.
  • + *
  • MAX_RECENT_SHIP - Riskiness of email address based on + * past minFraud risk scores on ship address.
  • + *
  • MULTIPLE_CUSTOMER_ID_ON_EMAIL - Riskiness of email address + * having many customer IDs.
  • + *
  • ORDER_AMOUNT - Riskiness of the order amount.
  • + *
  • ORG_DISTANCE_RISK - Risk of ISP and distance between billing address + * and IP location.
  • + *
  • PHONE - Riskiness of the phone number or related numbers.
  • + *
  • CART - Riskiness of shopping cart contents.
  • + *
  • TIME_OF_DAY - Risk due to local time of day.
  • + *
  • TRANSACTION_REPORT_EMAIL - Risk due to transaction reports on the email + * address.
  • + *
  • TRANSACTION_REPORT_IP - Risk due to transaction reports on the IP + * address.
  • + *
  • TRANSACTION_REPORT_PHONE - Risk due to transaction reports on the phone + * number.
  • + *
  • TRANSACTION_REPORT_SHIP - Risk due to transaction reports on the shipping + * address.
  • + *
  • EMAIL_ACTIVITY - Riskiness of the email address based on minFraud network + * activity.
  • + *
  • PHONE_ACTIVITY - Riskiness of the phone number based on minFraud network + * activity.
  • + *
  • SHIP_ACTIVITY - Riskiness of ship address based on minFraud network + * activity.
  • + *
+ * @param reason The human-readable explanation of the reason. The description may change at any + * time and should not be matched against. */ -public final class Reason extends AbstractModel { - private final String code; - private final String reason; +public record Reason( + @JsonProperty("code") + String code, - /** - * Constructor for {@code Reason}. - * - * @param code The code. - * @param reason The reason. - */ - public Reason( - @JsonProperty("code") String code, - @JsonProperty("reason") String reason - ) { - this.code = code; - this.reason = reason; - } + @JsonProperty("reason") + String reason +) implements JsonSerializable { /** * This field provides a machine-readable code identifying the reason. @@ -82,18 +139,22 @@ public Reason( * * * @return The code. + * @deprecated Use {@link #code()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("code") public String getCode() { - return this.code; + return code(); } /** * @return The human-readable explanation of the reason. The description may change at any time * and should not be matched against. + * @deprecated Use {@link #reason()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("reason") public String getReason() { - return this.reason; + return reason(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/RiskScoreReason.java b/src/main/java/com/maxmind/minfraud/response/RiskScoreReason.java index 2e25c2ce..0fd7ae78 100644 --- a/src/main/java/com/maxmind/minfraud/response/RiskScoreReason.java +++ b/src/main/java/com/maxmind/minfraud/response/RiskScoreReason.java @@ -1,30 +1,32 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; -import java.util.Collections; +import com.maxmind.minfraud.JsonSerializable; import java.util.List; /** * This class represents a risk score multiplier and reasons for that multiplier. + * + * @param multiplier The factor by which the risk score is increased (if the value is greater than + * 1) or decreased (if the value is less than 1) for given risk reason(s). + * Multipliers greater than 1.5 and less than 0.66 are considered significant and + * lead to risk reason(s) being present. + * @param reasons An unmodifiable list containing objects that describe one of the reasons for + * the multiplier. This will be an empty list if there are no reasons. */ -public final class RiskScoreReason extends AbstractModel { - private final Double multiplier; - private final List reasons; +public record RiskScoreReason( + @JsonProperty("multiplier") + Double multiplier, + + @JsonProperty("reasons") + List reasons +) implements JsonSerializable { /** - * Constructor for {@code RiskScoreReason}. - * - * @param multiplier The multiplier. - * @param reasons The reasons. + * Compact canonical constructor that ensures immutability. */ - public RiskScoreReason( - @JsonProperty("multiplier") Double multiplier, - @JsonProperty("reasons") List reasons - ) { - this.multiplier = multiplier; - this.reasons = - Collections.unmodifiableList(reasons == null ? List.of() : reasons); + public RiskScoreReason { + reasons = reasons != null ? List.copyOf(reasons) : List.of(); } /** @@ -32,18 +34,22 @@ public RiskScoreReason( * or decreased (if the value is less than 1) for given risk reason(s). * Multipliers greater than 1.5 and less than 0.66 are considered significant * and lead to risk reason(s) being present. + * @deprecated Use {@link #multiplier()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("multiplier") public Double getMultiplier() { - return multiplier; + return multiplier(); } /** * @return An unmodifiable list containing objects that describe one of the reasons for * the multiplier. This will be an empty list if there are no reasons. + * @deprecated Use {@link #reasons()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("reasons") public List getReasons() { - return reasons; + return reasons(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/ScoreIpAddress.java b/src/main/java/com/maxmind/minfraud/response/ScoreIpAddress.java index 847a5455..51e4942e 100644 --- a/src/main/java/com/maxmind/minfraud/response/ScoreIpAddress.java +++ b/src/main/java/com/maxmind/minfraud/response/ScoreIpAddress.java @@ -1,36 +1,32 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains the IP address risk. + * + * @param risk The risk associated with the IP address. */ -public final class ScoreIpAddress implements IpAddressInterface { - private final Double risk; +public record ScoreIpAddress( + @JsonProperty("risk") + Double risk +) implements IpAddressInterface, JsonSerializable { /** - * Constructor for {@code ScoreResponse}. - * - * @param risk The risk associated with the IP address. - */ - public ScoreIpAddress( - @JsonProperty("risk") Double risk - ) { - this.risk = risk; - } - - /** - * Constructor for {@code ScoreResponse}. + * Constructs an instance of {@code ScoreIpAddress} with no data. */ public ScoreIpAddress() { this(null); } /** - * @return The risk associated with the IP address. The value ranges from 0.01 to 99. A higher - * score indicates a higher risk. + * @return The risk associated with the IP address. + * @deprecated Use {@link #risk()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("risk") public Double getRisk() { - return risk; + return risk(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/ScoreResponse.java b/src/main/java/com/maxmind/minfraud/response/ScoreResponse.java index 22e4fa4c..11e2f23a 100644 --- a/src/main/java/com/maxmind/minfraud/response/ScoreResponse.java +++ b/src/main/java/com/maxmind/minfraud/response/ScoreResponse.java @@ -1,92 +1,117 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; -import java.util.Collections; +import com.maxmind.minfraud.JsonSerializable; import java.util.List; import java.util.UUID; /** * This class represents the minFraud Score response. + * + * @param disposition The disposition set by your custom rules. + * @param fundsRemaining The approximate US dollar value of the funds remaining on your MaxMind + * account. + * @param id This is a UUID that identifies the minFraud request. + * @param ipAddress The {@code IpAddress} model object. + * @param queriesRemaining The approximate number of queries remaining for this service before your + * account runs out of funds. + * @param riskScore This returns the risk score, from 0.01 to 99. A higher score indicates + * a higher risk of fraud. For example, a score of 20 indicates a 20% + * chance that a transaction is fraudulent. We never return a risk score of + * 0, since all transactions have the possibility of being fraudulent. + * Likewise, we never return a risk score of 100. + * @param warnings An unmodifiable list containing warning objects that detail issues with + * the request such as invalid or unknown inputs. It is highly recommended + * that you check this list for issues when integrating the web service. */ -public class ScoreResponse extends AbstractModel { - private final Disposition disposition; - private final Double fundsRemaining; - private final UUID id; - private final Integer queriesRemaining; - private final Double riskScore; - private final List warnings; - private final ScoreIpAddress ipAddress; +public record ScoreResponse( + @JsonProperty("disposition") + Disposition disposition, + + @JsonProperty("funds_remaining") + Double fundsRemaining, + + @JsonProperty("id") + UUID id, + + @JsonProperty("ip_address") + ScoreIpAddress ipAddress, + + @JsonProperty("queries_remaining") + Integer queriesRemaining, + + @JsonProperty("risk_score") + Double riskScore, + + @JsonProperty("warnings") + List warnings +) implements JsonSerializable { + + /** + * Compact canonical constructor that sets defaults for null values. + */ + public ScoreResponse { + disposition = disposition != null ? disposition : new Disposition(); + ipAddress = ipAddress != null ? ipAddress : new ScoreIpAddress(); + warnings = warnings != null ? List.copyOf(warnings) : List.of(); + } /** - * Constructor for {@code ScoreResponse}. - * - * @param disposition The disposition set by your custom rules. - * @param fundsRemaining The approximate US dollar value of the funds. - * @param id This is a UUID that identifies the minFraud request. - * @param ipAddress The {@code IpAddress} model object. - * @param queriesRemaining The number of queries remaining. - * @param riskScore The risk score. - * @param warnings A list containing warning objects. + * Constructs an instance of {@code ScoreResponse} with no data. */ - public ScoreResponse( - @JsonProperty("disposition") Disposition disposition, - @JsonProperty("funds_remaining") Double fundsRemaining, - @JsonProperty("id") UUID id, - @JsonProperty("ip_address") ScoreIpAddress ipAddress, - @JsonProperty("queries_remaining") Integer queriesRemaining, - @JsonProperty("risk_score") Double riskScore, - @JsonProperty("warnings") List warnings - ) { - this.disposition = disposition == null ? new Disposition() : disposition; - this.fundsRemaining = fundsRemaining; - this.id = id; - this.ipAddress = ipAddress == null ? new ScoreIpAddress() : ipAddress; - this.queriesRemaining = queriesRemaining; - this.riskScore = riskScore; - this.warnings = - Collections.unmodifiableList(warnings == null ? List.of() : warnings); + public ScoreResponse() { + this(null, null, null, null, null, null, null); } /** * @return The disposition set by your custom rules. + * @deprecated Use {@link #disposition()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("disposition") - public final Disposition getDisposition() { - return disposition; + public Disposition getDisposition() { + return disposition(); } - /** * @return The approximate US dollar value of the funds remaining on your MaxMind account. + * @deprecated Use {@link #fundsRemaining()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("funds_remaining") - public final Double getFundsRemaining() { - return fundsRemaining; + public Double getFundsRemaining() { + return fundsRemaining(); } /** * @return This is a UUID that identifies the minFraud request. + * @deprecated Use {@link #id()} instead. This method will be removed in 5.0.0. */ - public final UUID getId() { - return id; + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("id") + public UUID getId() { + return id(); } /** * @return The {@code IpAddress} model object. + * @deprecated Use {@link #ipAddress()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("ip_address") public IpAddressInterface getIpAddress() { - return ipAddress; + return ipAddress(); } /** * @return The approximate number of queries remaining for this service before your account runs * out of funds. + * @deprecated Use {@link #queriesRemaining()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("queries_remaining") - public final Integer getQueriesRemaining() { - return queriesRemaining; + public Integer getQueriesRemaining() { + return queriesRemaining(); } /** @@ -94,18 +119,23 @@ public final Integer getQueriesRemaining() { * of fraud. For example, a score of 20 indicates a 20% chance that a transaction is * fraudulent. We never return a risk score of 0, since all transactions have the * possibility of being fraudulent. Likewise, we never return a risk score of 100. + * @deprecated Use {@link #riskScore()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("risk_score") - public final Double getRiskScore() { - return riskScore; + public Double getRiskScore() { + return riskScore(); } /** * @return An unmodifiable list containing warning objects that detail issues with the request * such as invalid or unknown inputs. It is highly recommended that you check this list for * issues when integrating the web service. + * @deprecated Use {@link #warnings()} instead. This method will be removed in 5.0.0. */ - public final List getWarnings() { - return warnings; + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("warnings") + public List getWarnings() { + return warnings(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/ShippingAddress.java b/src/main/java/com/maxmind/minfraud/response/ShippingAddress.java index 7f3d9bfc..6f4bbcac 100644 --- a/src/main/java/com/maxmind/minfraud/response/ShippingAddress.java +++ b/src/main/java/com/maxmind/minfraud/response/ShippingAddress.java @@ -1,66 +1,99 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; +import com.maxmind.minfraud.JsonSerializable; /** * This class contains minFraud response data related to the shipping address. + * + * @param distanceToBillingAddress The distance in kilometers from the shipping address to billing + * address. + * @param distanceToIpLocation The distance in kilometers from the address to the IP location. + * This will be null if there is no value in the response. + * @param isHighRisk This returns true if the shipping address is an address + * associated with fraudulent transactions. It returns false when + * the address is not associated with increased risk. If the address + * could not be parsed or was not provided, null is returned. + * @param isInIpCountry This returns true if the address is in the IP country. It is + * false when the address is not in the IP country. If the address + * could not be parsed or was not provided or the IP address could + * not be geolocated, then null will be returned. + * @param isPostalInCity This will return true if the postal code provided with the + * address is in the city for the address. It will return false when + * the postal code is not in the city. If the address was not + * provided or could not be parsed, null will be returned. + * @param latitude The latitude associated with the address. This will be null if + * there is no value in the response. + * @param longitude The longitude associated with the address. This will be null if + * there is no value in the response. */ -public final class ShippingAddress extends AbstractAddress { - private final Boolean isHighRisk; - private final Integer distanceToBillingAddress; +public record ShippingAddress( + @JsonProperty("distance_to_billing_address") + Integer distanceToBillingAddress, + + @JsonProperty("distance_to_ip_location") + Integer distanceToIpLocation, + + @JsonProperty("is_high_risk") + Boolean isHighRisk, + + @JsonProperty("is_in_ip_country") + Boolean isInIpCountry, + + @JsonProperty("is_postal_in_city") + Boolean isPostalInCity, + + @JsonProperty("latitude") + Double latitude, + + @JsonProperty("longitude") + Double longitude +) implements JsonSerializable { /** - * Constructor for {@code ShippingAddress}. - * - * @param distanceToBillingAddress The distance in kilometers from the shipping address to the - * billing address. - * @param distanceToIpLocation The distance in kilometers from the shipping address to the - * IP location. - * @param isHighRisk This is true if the shipping address is associated with - * fraudulent transactions. - * @param isInIpCountry This is true if the shipping address is in the IP country. - * @param isPostalInCity This is true if the shipping postal code is in the city for - * the IP location. - * @param latitude The latitude associated with the IP address. - * @param longitude The longitude associated with the IP address. + * Constructs an instance of {@code ShippingAddress} with no data. */ - public ShippingAddress( - @JsonProperty("distance_to_billing_address") Integer distanceToBillingAddress, - @JsonProperty("distance_to_ip_location") Integer distanceToIpLocation, - @JsonProperty("is_high_risk") Boolean isHighRisk, - @JsonProperty("is_in_ip_country") Boolean isInIpCountry, - @JsonProperty("is_postal_in_city") Boolean isPostalInCity, - @JsonProperty("latitude") Double latitude, - @JsonProperty("longitude") Double longitude - ) { - super(distanceToIpLocation, isInIpCountry, isPostalInCity, latitude, longitude); - this.distanceToBillingAddress = distanceToBillingAddress; - this.isHighRisk = isHighRisk; + public ShippingAddress() { + this(null, null, null, null, null, null, null); } /** - * Constructor for {@code ShippingAddress}. + * @return The distance in kilometers from the shipping address to billing address. + * @deprecated Use {@link #distanceToBillingAddress()} instead. This method will be removed + * in 5.0.0. */ - public ShippingAddress() { - this(null, null, null, null, null, null, null); + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("distance_to_billing_address") + public Integer getDistanceToBillingAddress() { + return distanceToBillingAddress(); } /** - * @return This returns true if the shipping address is an address associated with fraudulent - * transactions. It returns false when the address is not associated with increased risk. If - * the address could not be parsed or was not provided, null is returned. + * @return The latitude associated with the address. + * @deprecated Use {@link #latitude()} instead. This method will be removed in 5.0.0. */ - @JsonProperty("is_high_risk") - public Boolean isHighRisk() { - return isHighRisk; + @Deprecated(since = "4.0.0", forRemoval = true) + public Double getLatitude() { + return latitude(); } /** - * @return The distance in kilometers from the shipping address to billing address. + * @return The longitude associated with the address. + * @deprecated Use {@link #longitude()} instead. This method will be removed in 5.0.0. */ - @JsonProperty("distance_to_billing_address") - public Integer getDistanceToBillingAddress() { - return distanceToBillingAddress; + @Deprecated(since = "4.0.0", forRemoval = true) + public Double getLongitude() { + return longitude(); + } + + /** + * @return The distance in kilometers from the address to the IP location. + * @deprecated Use {@link #distanceToIpLocation()} instead. This method will be removed in + * 5.0.0. + */ + @Deprecated(since = "4.0.0", forRemoval = true) + public Integer getDistanceToIpLocation() { + return distanceToIpLocation(); } } diff --git a/src/main/java/com/maxmind/minfraud/response/Warning.java b/src/main/java/com/maxmind/minfraud/response/Warning.java index 05d73404..4aaa0fb3 100644 --- a/src/main/java/com/maxmind/minfraud/response/Warning.java +++ b/src/main/java/com/maxmind/minfraud/response/Warning.java @@ -1,32 +1,53 @@ package com.maxmind.minfraud.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.maxmind.minfraud.AbstractModel; +import com.maxmind.minfraud.JsonSerializable; /** * This class represents a warning returned by the web service. + * + * @param code This provides a machine-readable code identifying the warning. Although more + * codes may be added in the future, the current codes are: + * + *
    + *
  • BILLING_CITY_NOT_FOUND – the billing city could not be found in + * our database.
  • + *
  • BILLING_COUNTRY_NOT_FOUND – the billing country could not be + * found in our database.
  • + *
  • BILLING_POSTAL_NOT_FOUND – the billing postal could not be found + * in our database.
  • + *
  • INPUT_INVALID – the value associated with the key does not meet + * the required constraints, e.g., "United States" in a field that + * requires a two-letter country code.
  • + *
  • INPUT_UNKNOWN – an unknown key was encountered in the request + * body.
  • + *
  • IP_ADDRESS_NOT_FOUND – the IP address could not be + * geolocated.
  • + *
  • SHIPPING_CITY_NOT_FOUND – the shipping city could not be found + * in our database.
  • + *
  • SHIPPING_COUNTRY_NOT_FOUND – the shipping country could not be + * found in our database.
  • + *
  • SHIPPING_POSTAL_NOT_FOUND – the shipping postal could not be + * found in our database.
  • + *
+ * @param warning This field provides a human-readable explanation of the warning. The + * description may change at any time and should not be matched against. + * @param inputPointer This is a JSON Pointer to the input that the warning is associated with. For + * instance, if the warning was about the billing city, the value would be + * "/billing/city". See + * RFC 6901 for the JSON + * Pointer spec. */ -public final class Warning extends AbstractModel { - private final String code; - private final String warning; - private final String inputPointer; +public record Warning( + @JsonProperty("code") + String code, - /** - * Constructor for {@code Warning}. - * - * @param code The warning code. - * @param warning The warning message. - * @param inputPointer The JSON Pointer to the input that the warning is associated with. - */ - public Warning( - @JsonProperty("code") String code, - @JsonProperty("warning") String warning, - @JsonProperty("input_pointer") String inputPointer - ) { - this.code = code; - this.warning = warning; - this.inputPointer = inputPointer; - } + @JsonProperty("warning") + String warning, + + @JsonProperty("input_pointer") + String inputPointer +) implements JsonSerializable { /** * This provides a machine-readable code identifying the warning. Although more codes may be @@ -55,17 +76,23 @@ public Warning( * * * @return The warning code. + * @deprecated Use {@link #code()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("code") public String getCode() { - return this.code; + return code(); } /** * @return This field provides a human-readable explanation of the warning. The description may * change at any time and should not be matched against. + * @deprecated Use {@link #warning()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) + @JsonProperty("warning") public String getWarning() { - return this.warning; + return warning(); } /** @@ -73,9 +100,11 @@ public String getWarning() { * instance, if the warning was about the billing city, the value would be "/billing/city". * See * RFC 6901 for the JSON Pointer spec. + * @deprecated Use {@link #inputPointer()} instead. This method will be removed in 5.0.0. */ + @Deprecated(since = "4.0.0", forRemoval = true) @JsonProperty("input_pointer") public String getInputPointer() { - return this.inputPointer; + return inputPointer(); } } diff --git a/src/test/java/com/maxmind/minfraud/WebServiceClientTest.java b/src/test/java/com/maxmind/minfraud/WebServiceClientTest.java index 7de5b025..920bc206 100644 --- a/src/test/java/com/maxmind/minfraud/WebServiceClientTest.java +++ b/src/test/java/com/maxmind/minfraud/WebServiceClientTest.java @@ -57,19 +57,19 @@ public class WebServiceClientTest { @Test public void testReportTransaction() throws Exception { - String responseContent = ""; - WebServiceClient client = createSuccessClient("transactions/report", 204, + var responseContent = ""; + var client = createSuccessClient("transactions/report", 204, responseContent); - TransactionReport request = fullTransactionReport(); + var request = fullTransactionReport(); client.reportTransaction(request); } @Test public void testFullScoreTransaction() throws Exception { - String responseContent = readJsonFile("score-response"); - WebServiceClient client = createSuccessClient("score", 200, responseContent); - Transaction request = fullTransaction(); - ScoreResponse response = client.score(request); + var responseContent = readJsonFile("score-response"); + var client = createSuccessClient("score", 200, responseContent); + var request = fullTransaction(); + var response = client.score(request); JSONAssert.assertEquals(responseContent, response.toJson(), true); verifyRequestFor(wireMock, "score", "full-request"); @@ -77,10 +77,10 @@ public void testFullScoreTransaction() throws Exception { @Test public void testFullScoreTransactionWithEmailMd5() throws Exception { - String responseContent = readJsonFile("score-response"); - WebServiceClient client = createSuccessClient("score", 200, responseContent); - Transaction request = fullTransactionEmailMd5(); - ScoreResponse response = client.score(request); + var responseContent = readJsonFile("score-response"); + var client = createSuccessClient("score", 200, responseContent); + var request = fullTransactionEmailMd5(); + var response = client.score(request); JSONAssert.assertEquals(responseContent, response.toJson(), true); verifyRequestFor(wireMock, "score", "full-request-email-md5"); @@ -88,10 +88,10 @@ public void testFullScoreTransactionWithEmailMd5() throws Exception { @Test public void testFullInsightsTransaction() throws Exception { - String responseContent = readJsonFile("insights-response"); - WebServiceClient client = createSuccessClient("insights", 200, responseContent); - Transaction request = fullTransaction(); - InsightsResponse response = client.insights(request); + var responseContent = readJsonFile("insights-response"); + var client = createSuccessClient("insights", 200, responseContent); + var request = fullTransaction(); + var response = client.insights(request); // We use non-strict checking as there is some extra stuff in the serialized // object, most notably the "name" field in the GeoIP2 InsightsResponse subobjects. @@ -99,41 +99,41 @@ public void testFullInsightsTransaction() throws Exception { JSONAssert.assertEquals(responseContent, response.toJson(), false); verifyRequestFor(wireMock, "insights", "full-request"); assertTrue( - response.getIpAddress().getCountry().isInEuropeanUnion(), - "response.getIpAddress().getCountry().isInEuropeanUnion() does not return true" + response.ipAddress().country().isInEuropeanUnion(), + "response.ipAddress().country().isInEuropeanUnion() does not return true" ); assertFalse( - response.getIpAddress().getRegisteredCountry().isInEuropeanUnion(), - "response.getIpAddress().getRegisteredCountry().isInEuropeanUnion() does not return false" + response.ipAddress().registeredCountry().isInEuropeanUnion(), + "response.ipAddress().registeredCountry().isInEuropeanUnion() does not return false" ); assertTrue( - response.getIpAddress().getRepresentedCountry().isInEuropeanUnion(), - "response.getIpAddress().getRepresentedCountry().isInEuropeanUnion() does not return true" + response.ipAddress().representedCountry().isInEuropeanUnion(), + "response.ipAddress().representedCountry().isInEuropeanUnion() does not return true" ); - assertEquals("2018-04-05T15:34:40-07:00", response.getDevice().getLocalTime()); + assertEquals("2018-04-05T15:34:40-07:00", response.device().localTime()); - assertEquals("152.216.7.110", response.getIpAddress().getTraits().getIpAddress()); + assertEquals("152.216.7.110", response.ipAddress().traits().ipAddress().getHostAddress()); assertEquals("81.2.69.0/24", - response.getIpAddress().getTraits().getNetwork().toString()); + response.ipAddress().traits().network().toString()); - assertTrue(response.getCreditCard().isVirtual()); + assertTrue(response.creditCard().isVirtual()); - List reasons = response.getIpAddress().getRiskReasons(); + var reasons = response.ipAddress().riskReasons(); assertEquals(2, reasons.size(), "two IP risk reasons"); assertEquals( "MINFRAUD_NETWORK_ACTIVITY", - reasons.get(1).getCode(), + reasons.get(1).code(), "second IP risk reason code" ); } @Test public void testFullFactorsTransaction() throws Exception { - String responseContent = readJsonFile("factors-response"); - WebServiceClient client = createSuccessClient("factors", 200, responseContent); - Transaction request = fullTransaction(); - FactorsResponse response = client.factors(request); + var responseContent = readJsonFile("factors-response"); + var client = createSuccessClient("factors", 200, responseContent); + var request = fullTransaction(); + var response = client.factors(request); // We use non-strict checking as there is some extra stuff in the serialized // object, most notably the "name" field in the GeoIP2 InsightsResponse subobjects. @@ -141,28 +141,28 @@ public void testFullFactorsTransaction() throws Exception { JSONAssert.assertEquals(responseContent, response.toJson(), false); verifyRequestFor(wireMock, "factors", "full-request"); assertTrue( - response.getIpAddress().getCountry().isInEuropeanUnion(), - "response.getIpAddress().getCountry().isInEuropeanUnion() does not return true" + response.ipAddress().country().isInEuropeanUnion(), + "response.ipAddress().country().isInEuropeanUnion() does not return true" ); assertTrue( - response.getIpAddress().getRegisteredCountry().isInEuropeanUnion(), - "response.getIpAddress().getRegisteredCountry().isInEuropeanUnion() does not return true" + response.ipAddress().registeredCountry().isInEuropeanUnion(), + "response.ipAddress().registeredCountry().isInEuropeanUnion() does not return true" ); assertFalse( - response.getIpAddress().getRepresentedCountry().isInEuropeanUnion(), - "response.getIpAddress().getRepresentedCountry().isInEuropeanUnion() does not return false" + response.ipAddress().representedCountry().isInEuropeanUnion(), + "response.ipAddress().representedCountry().isInEuropeanUnion() does not return false" ); - assertEquals("152.216.7.110", response.getIpAddress().getTraits().getIpAddress()); + assertEquals("152.216.7.110", response.ipAddress().traits().ipAddress().getHostAddress()); assertEquals("81.2.69.0/24", - response.getIpAddress().getTraits().getNetwork().toString()); + response.ipAddress().traits().network().toString()); } @Test public void testRequestEncoding() throws Exception { - WebServiceClient client = createSuccessClient("insights", 200, "{}"); - Transaction request = new Transaction.Builder( + var client = createSuccessClient("insights", 200, "{}"); + var request = new Transaction.Builder( new Device.Builder(InetAddress.getByName("1.1.1.1")).build() ).shipping( new Shipping.Builder() @@ -178,9 +178,9 @@ public void testRequestEncoding() throws Exception { @Test public void test200WithNoBody() throws Exception { - WebServiceClient client = createSuccessClient("insights", 200, ""); - Transaction request = fullTransaction(); - Exception ex = assertThrows(MinFraudException.class, () -> client.insights(request)); + var client = createSuccessClient("insights", 200, ""); + var request = fullTransaction(); + var ex = assertThrows(MinFraudException.class, () -> client.insights(request)); assertThat(ex.getMessage(), matchesPattern("Received a 200 response but could not decode it as JSON")); @@ -188,10 +188,10 @@ public void test200WithNoBody() throws Exception { @Test public void test200WithInvalidJson() throws Exception { - WebServiceClient client = createSuccessClient("insights", 200, "{"); - Transaction request = fullTransaction(); + var client = createSuccessClient("insights", 200, "{"); + var request = fullTransaction(); - Exception ex = assertThrows(MinFraudException.class, () -> client.insights(request)); + var ex = assertThrows(MinFraudException.class, () -> client.insights(request)); assertEquals("Received a 200 response but could not decode it as JSON", ex.getMessage()); @@ -199,7 +199,7 @@ public void test200WithInvalidJson() throws Exception { @Test public void testInsufficientCredit() { - Exception ex = assertThrows(InsufficientFundsException.class, () -> createInsightsError( + var ex = assertThrows(InsufficientFundsException.class, () -> createInsightsError( 402, "application/json", "{\"code\":\"INSUFFICIENT_FUNDS\",\"error\":\"out of credit\"}" @@ -214,7 +214,7 @@ public void testInsufficientCredit() { "LICENSE_KEY_REQUIRED", "USER_ID_REQUIRED"}) public void testInvalidAuth(String code) { - Exception ex = assertThrows(AuthenticationException.class, () -> + var ex = assertThrows(AuthenticationException.class, () -> createInsightsError( 401, "application/json", @@ -226,7 +226,7 @@ public void testInvalidAuth(String code) { @Test public void testPermissionRequired() { - Exception ex = assertThrows(PermissionRequiredException.class, () -> createInsightsError( + var ex = assertThrows(PermissionRequiredException.class, () -> createInsightsError( 403, "application/json", "{\"code\":\"PERMISSION_REQUIRED\",\"error\":\"Permission required\"}" @@ -236,7 +236,7 @@ public void testPermissionRequired() { @Test public void testInvalidRequest() { - Exception ex = assertThrows(InvalidRequestException.class, () -> + var ex = assertThrows(InvalidRequestException.class, () -> createInsightsError( 400, "application/json", @@ -248,7 +248,7 @@ public void testInvalidRequest() { @Test public void test400WithInvalidJson() { - Exception ex = assertThrows(HttpException.class, () -> + var ex = assertThrows(HttpException.class, () -> createInsightsError( 400, "application/json", @@ -261,7 +261,7 @@ public void test400WithInvalidJson() { @Test public void test400WithNoBody() { - Exception ex = assertThrows(HttpException.class, () -> + var ex = assertThrows(HttpException.class, () -> createInsightsError( 400, "application/json", @@ -274,7 +274,7 @@ public void test400WithNoBody() { @Test public void test400WithUnexpectedContentType() { - Exception ex = assertThrows(HttpException.class, () -> + var ex = assertThrows(HttpException.class, () -> createInsightsError( 400, "text/plain", @@ -288,7 +288,7 @@ public void test400WithUnexpectedContentType() { @Test public void test400WithUnexpectedJson() { - Exception ex = assertThrows(HttpException.class, () -> + var ex = assertThrows(HttpException.class, () -> createInsightsError( 400, "application/json", @@ -302,7 +302,7 @@ public void test400WithUnexpectedJson() { @Test public void test300() { - Exception ex = assertThrows(HttpException.class, () -> + var ex = assertThrows(HttpException.class, () -> createInsightsError( 300, "application/json", @@ -315,7 +315,7 @@ public void test300() { @Test public void test500() { - Exception ex = assertThrows(HttpException.class, () -> + var ex = assertThrows(HttpException.class, () -> createInsightsError( 500, "application/json", @@ -363,9 +363,9 @@ private WebServiceClient createClient(String service, int status, String content @Test public void testHttpClientWorks() { - HttpClient customClient = HttpClient.newBuilder().build(); + var customClient = HttpClient.newBuilder().build(); - WebServiceClient client = new WebServiceClient.Builder(6, "0123456789") + var client = new WebServiceClient.Builder(6, "0123456789") .httpClient(customClient) .build(); @@ -375,9 +375,9 @@ public void testHttpClientWorks() { @Test public void testHttpClientWithConnectTimeoutThrowsException() { - HttpClient customClient = HttpClient.newBuilder().build(); + var customClient = HttpClient.newBuilder().build(); - Exception ex = assertThrows(IllegalArgumentException.class, () -> + var ex = assertThrows(IllegalArgumentException.class, () -> new WebServiceClient.Builder(6, "0123456789") .httpClient(customClient) .connectTimeout(Duration.ofSeconds(5)) @@ -390,9 +390,9 @@ public void testHttpClientWithConnectTimeoutThrowsException() { @Test public void testHttpClientWithProxyThrowsException() { - HttpClient customClient = HttpClient.newBuilder().build(); + var customClient = HttpClient.newBuilder().build(); - Exception ex = assertThrows(IllegalArgumentException.class, () -> + var ex = assertThrows(IllegalArgumentException.class, () -> new WebServiceClient.Builder(6, "0123456789") .httpClient(customClient) .proxy(java.net.ProxySelector.of(null)) diff --git a/src/test/java/com/maxmind/minfraud/exception/HttpExceptionTest.java b/src/test/java/com/maxmind/minfraud/exception/HttpExceptionTest.java index 3a2879cc..aebd4d39 100644 --- a/src/test/java/com/maxmind/minfraud/exception/HttpExceptionTest.java +++ b/src/test/java/com/maxmind/minfraud/exception/HttpExceptionTest.java @@ -9,9 +9,9 @@ public class HttpExceptionTest { @Test public void testHttpException() throws Exception { - URI uri = new URI("https://www.maxmind.com/"); - HttpException e = new HttpException("message", 200, uri); - assertEquals(200, e.getHttpStatus(), "correct status"); - assertEquals(uri, e.getUri(), "correct URL"); + var uri = new URI("https://www.maxmind.com/"); + var e = new HttpException("message", 200, uri); + assertEquals(200, e.httpStatus(), "correct status"); + assertEquals(uri, e.uri(), "correct URL"); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/exception/InvalidRequestExceptionTest.java b/src/test/java/com/maxmind/minfraud/exception/InvalidRequestExceptionTest.java index c87dde6e..2f15d384 100644 --- a/src/test/java/com/maxmind/minfraud/exception/InvalidRequestExceptionTest.java +++ b/src/test/java/com/maxmind/minfraud/exception/InvalidRequestExceptionTest.java @@ -9,12 +9,12 @@ public class InvalidRequestExceptionTest { @Test public void testInvalidRequestException() throws Exception { - URI uri = new URI("https://www.maxmind.com/"); - String code = "INVALID_INPUT"; - int status = 400; - InvalidRequestException e = new InvalidRequestException("message", code, status, uri, null); - assertEquals(code, e.getCode(), "correct code"); - assertEquals(status, e.getHttpStatus(), "correct status"); - assertEquals(uri, e.getUri(), "correct URL"); + var uri = new URI("https://www.maxmind.com/"); + var code = "INVALID_INPUT"; + var status = 400; + var e = new InvalidRequestException("message", code, status, uri, null); + assertEquals(code, e.code(), "correct code"); + assertEquals(status, e.httpStatus(), "correct status"); + assertEquals(uri, e.uri(), "correct URL"); } } diff --git a/src/test/java/com/maxmind/minfraud/request/AbstractLocationTest.java b/src/test/java/com/maxmind/minfraud/request/AbstractLocationTest.java index bd21df21..b8f71ff4 100644 --- a/src/test/java/com/maxmind/minfraud/request/AbstractLocationTest.java +++ b/src/test/java/com/maxmind/minfraud/request/AbstractLocationTest.java @@ -13,49 +13,49 @@ public abstract class AbstractLocationTest { @Test public void testFirstName() { AbstractLocation loc = this.builder().firstName("frst").build(); - assertEquals("frst", loc.getFirstName()); + assertEquals("frst", loc.firstName()); } @Test public void testLastName() { AbstractLocation loc = this.builder().lastName("last").build(); - assertEquals("last", loc.getLastName()); + assertEquals("last", loc.lastName()); } @Test public void testCompany() { AbstractLocation loc = this.builder().company("company").build(); - assertEquals("company", loc.getCompany()); + assertEquals("company", loc.company()); } @Test public void testAddress() { AbstractLocation loc = this.builder().address("addr").build(); - assertEquals("addr", loc.getAddress()); + assertEquals("addr", loc.address()); } @Test public void testAddress2() { AbstractLocation loc = this.builder().address2("addr2").build(); - assertEquals("addr2", loc.getAddress2()); + assertEquals("addr2", loc.address2()); } @Test public void testCity() { AbstractLocation loc = this.builder().city("Pdx").build(); - assertEquals("Pdx", loc.getCity()); + assertEquals("Pdx", loc.city()); } @Test public void testRegion() { AbstractLocation loc = this.builder().region("MN").build(); - assertEquals("MN", loc.getRegion()); + assertEquals("MN", loc.region()); } @Test public void testCountry() { AbstractLocation loc = this.builder().country("US").build(); - assertEquals("US", loc.getCountry()); + assertEquals("US", loc.country()); } @Test @@ -85,19 +85,19 @@ public void testCountryInWrongCase() { @Test public void testPostal() { AbstractLocation loc = this.builder().postal("03231").build(); - assertEquals("03231", loc.getPostal()); + assertEquals("03231", loc.postal()); } @Test public void testPhoneNumber() { String phone = "321-321-3213"; AbstractLocation loc = this.builder().phoneNumber(phone).build(); - assertEquals(phone, loc.getPhoneNumber()); + assertEquals(phone, loc.phoneNumber()); } @Test public void testPhoneCountryCode() { AbstractLocation loc = this.builder().phoneCountryCode("1").build(); - assertEquals("1", loc.getPhoneCountryCode()); + assertEquals("1", loc.phoneCountryCode()); } } diff --git a/src/test/java/com/maxmind/minfraud/request/AccountTest.java b/src/test/java/com/maxmind/minfraud/request/AccountTest.java index 7809450a..8af097fb 100644 --- a/src/test/java/com/maxmind/minfraud/request/AccountTest.java +++ b/src/test/java/com/maxmind/minfraud/request/AccountTest.java @@ -9,13 +9,13 @@ public class AccountTest { @Test public void testUserId() { - Account account = new Builder().userId("usr").build(); - assertEquals("usr", account.getUserId()); + var account = new Builder().userId("usr").build(); + assertEquals("usr", account.userId()); } @Test public void testUsername() { - Account account = new Builder().username("username").build(); - assertEquals("14c4b06b824ec593239362517f538b29", account.getUsernameMd5()); + var account = new Builder().username("username").build(); + assertEquals("14c4b06b824ec593239362517f538b29", account.usernameMd5()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/request/CreditCardTest.java b/src/test/java/com/maxmind/minfraud/request/CreditCardTest.java index edd7def2..9c720289 100644 --- a/src/test/java/com/maxmind/minfraud/request/CreditCardTest.java +++ b/src/test/java/com/maxmind/minfraud/request/CreditCardTest.java @@ -13,11 +13,11 @@ public class CreditCardTest { @Test public void testIssuerIdNumber() { - CreditCard cc = new Builder().issuerIdNumber("123456").build(); - assertEquals("123456", cc.getIssuerIdNumber()); + var cc = new Builder().issuerIdNumber("123456").build(); + assertEquals("123456", cc.issuerIdNumber()); cc = new Builder().issuerIdNumber("12345678").build(); - assertEquals("12345678", cc.getIssuerIdNumber()); + assertEquals("12345678", cc.issuerIdNumber()); } @Test @@ -46,11 +46,11 @@ public void testIssuerIdNumberThatHasLetters() { @Test public void testLastDigits() { - CreditCard cc = new Builder().lastDigits("1234").build(); - assertEquals("1234", cc.getLastDigits()); + var cc = new Builder().lastDigits("1234").build(); + assertEquals("1234", cc.lastDigits()); cc = new Builder().lastDigits("12").build(); - assertEquals("12", cc.getLastDigits()); + assertEquals("12", cc.lastDigits()); } @Test @@ -80,28 +80,28 @@ public void testLastDigitsThatHasLetters() { @Test public void testBankName() { - CreditCard cc = new Builder().bankName("Bank").build(); - assertEquals("Bank", cc.getBankName()); + var cc = new Builder().bankName("Bank").build(); + assertEquals("Bank", cc.bankName()); } @Test public void testBankPhoneCountryCode() { - CreditCard cc = new Builder().bankPhoneCountryCode("1").build(); - assertEquals("1", cc.getBankPhoneCountryCode()); + var cc = new Builder().bankPhoneCountryCode("1").build(); + assertEquals("1", cc.bankPhoneCountryCode()); } @Test public void testBankPhoneNumber() { - String phone = "231-323-3123"; - CreditCard cc = new Builder().bankPhoneNumber(phone).build(); - assertEquals(phone, cc.getBankPhoneNumber()); + var phone = "231-323-3123"; + var cc = new Builder().bankPhoneNumber(phone).build(); + assertEquals(phone, cc.bankPhoneNumber()); } @Test public void testCountry() { - String country = "CA"; - CreditCard cc = new Builder().country(country).build(); - assertEquals(country, cc.getCountry()); + var country = "CA"; + var cc = new Builder().country(country).build(); + assertEquals(country, cc.country()); } @ParameterizedTest @@ -115,14 +115,14 @@ public void testInvalidCountry(String country) { @Test public void testAvsResult() { - CreditCard cc = new Builder().avsResult('Y').build(); - assertEquals(Character.valueOf('Y'), cc.getAvsResult()); + var cc = new Builder().avsResult('Y').build(); + assertEquals(Character.valueOf('Y'), cc.avsResult()); } @Test public void testCvvResult() { - CreditCard cc = new Builder().cvvResult('N').build(); - assertEquals(Character.valueOf('N'), cc.getCvvResult()); + var cc = new Builder().cvvResult('N').build(); + assertEquals(Character.valueOf('N'), cc.cvvResult()); } @ParameterizedTest @@ -145,13 +145,13 @@ public void testInvalidToken(String token) { "valid_token" }) public void testValidToken(String token) { - CreditCard cc = new Builder().token(token).build(); - assertEquals(token, cc.getToken()); + var cc = new Builder().token(token).build(); + assertEquals(token, cc.token()); } @Test public void testWas3dSecureSuccessful() { - CreditCard cc = new Builder().was3dSecureSuccessful(true).build(); - assertTrue(cc.getWas3dSecureSuccessful()); + var cc = new Builder().was3dSecureSuccessful(true).build(); + assertTrue(cc.was3dSecureSuccessful()); } } diff --git a/src/test/java/com/maxmind/minfraud/request/CustomInputsTest.java b/src/test/java/com/maxmind/minfraud/request/CustomInputsTest.java index 95dc00a6..9e8064fa 100644 --- a/src/test/java/com/maxmind/minfraud/request/CustomInputsTest.java +++ b/src/test/java/com/maxmind/minfraud/request/CustomInputsTest.java @@ -16,7 +16,7 @@ public void TestPuttingTypes() { .put("float_input", 3.2f) .put("double_input", 32.123d) .put("bool_input", true) - .build().getInputs(); + .build().inputs(); assertEquals("test string", inputs.get("string_input_1")); assertEquals(19, inputs.get("int_input")); diff --git a/src/test/java/com/maxmind/minfraud/request/DeviceTest.java b/src/test/java/com/maxmind/minfraud/request/DeviceTest.java index 3c2b1881..b3b49952 100644 --- a/src/test/java/com/maxmind/minfraud/request/DeviceTest.java +++ b/src/test/java/com/maxmind/minfraud/request/DeviceTest.java @@ -18,47 +18,47 @@ public DeviceTest() throws UnknownHostException { @Test public void testConstructorWithoutIP() { - Device device = new Builder().build(); - assertNull(device.getIpAddress()); + var device = new Builder().build(); + assertNull(device.ipAddress()); } @Test public void testIpAddressThroughConstructor() { - Device device = new Builder(ip).build(); - assertEquals(ip, device.getIpAddress()); + var device = new Builder(ip).build(); + assertEquals(ip, device.ipAddress()); } @Test public void testIpAddress() { - Device device = new Builder().ipAddress(ip).build(); - assertEquals(ip, device.getIpAddress()); + var device = new Builder().ipAddress(ip).build(); + assertEquals(ip, device.ipAddress()); } @Test public void testUserAgent() { - String ua = "Mozila 5"; - Device device = new Builder(ip).userAgent(ua).build(); - assertEquals(ua, device.getUserAgent()); + var ua = "Mozila 5"; + var device = new Builder(ip).userAgent(ua).build(); + assertEquals(ua, device.userAgent()); } @Test public void testAcceptLanguage() { - String al = "en-US"; - Device device = new Builder(ip).acceptLanguage(al).build(); - assertEquals(al, device.getAcceptLanguage()); + var al = "en-US"; + var device = new Builder(ip).acceptLanguage(al).build(); + assertEquals(al, device.acceptLanguage()); } @Test public void testSessionAge() { - Double hour = 3600d; - Device device = new Builder(ip).sessionAge(hour).build(); - assertEquals(hour, device.getSessionAge()); + var hour = 3600d; + var device = new Builder(ip).sessionAge(hour).build(); + assertEquals(hour, device.sessionAge()); } @Test public void testSessionId() { - String id = "foobar"; - Device device = new Builder(ip).sessionId(id).build(); - assertEquals(id, device.getSessionId()); + var id = "foobar"; + var device = new Builder(ip).sessionId(id).build(); + assertEquals(id, device.sessionId()); } } diff --git a/src/test/java/com/maxmind/minfraud/request/EmailTest.java b/src/test/java/com/maxmind/minfraud/request/EmailTest.java index 687c2519..3c4bab4b 100644 --- a/src/test/java/com/maxmind/minfraud/request/EmailTest.java +++ b/src/test/java/com/maxmind/minfraud/request/EmailTest.java @@ -20,21 +20,21 @@ public class EmailTest { @Test public void testAddress() { - Email email = new Builder().address("test@test.org").build(); - assertEquals("test@test.org", email.getAddress(), "raw email"); - assertEquals("test.org", email.getDomain(), "domain set from email"); + var email = new Builder().address("test@test.org").build(); + assertEquals("test@test.org", email.address(), "raw email"); + assertEquals("test.org", email.domain(), "domain set from email"); } @Test public void testMultipleAtAddress() { - Email email = new Builder().address("\"test@test\"@test.org").build(); - assertEquals("\"test@test\"@test.org", email.getAddress(), "raw email"); - assertEquals("test.org", email.getDomain(), "domain set from email"); + var email = new Builder().address("\"test@test\"@test.org").build(); + assertEquals("\"test@test\"@test.org", email.address(), "raw email"); + assertEquals("test.org", email.domain(), "domain set from email"); } @Test public void testAddressWithNoValidation() { - Map addresses = new HashMap<>() {{ + var addresses = new HashMap() {{ put("test", null); put("@test", "test"); put("test@", null); @@ -42,57 +42,57 @@ public void testAddressWithNoValidation() { }}; for (String address : addresses.keySet()) { - Email email = new Builder(false).address(address).build(); - assertEquals(address, email.getAddress(), "raw email"); - assertEquals(addresses.get(address), email.getDomain(), "domain set from email"); + var email = new Builder(false).address(address).build(); + assertEquals(address, email.address(), "raw email"); + assertEquals(addresses.get(address), email.domain(), "domain set from email"); } } @Test public void testAddressMd5() { - Email email = new Builder().address("test@test.org").hashAddress().build(); + var email = new Builder().address("test@test.org").hashAddress().build(); assertEquals( "476869598e748d958e819c180af31982", - email.getAddress(), + email.address(), "MD5 generated from email" ); - assertEquals("test.org", email.getDomain(), "domain set from email"); + assertEquals("test.org", email.domain(), "domain set from email"); } @Test public void testAddressMd5MultipleTimes() { - Email email = new Builder().address("test@test.org").hashAddress().hashAddress().build(); + var email = new Builder().address("test@test.org").hashAddress().hashAddress().build(); assertEquals( "476869598e748d958e819c180af31982", - email.getAddress(), + email.address(), "MD5 generated from email" ); - assertEquals("test.org", email.getDomain(), "domain set from email"); + assertEquals("test.org", email.domain(), "domain set from email"); } @Test public void testHashAddressWithoutAddress() { - Email email = new Builder().domain("test.org").hashAddress().build(); - assertEquals("test.org", email.getDomain(), "domain is set"); + var email = new Builder().domain("test.org").hashAddress().build(); + assertEquals("test.org", email.domain(), "domain is set"); } @Test public void testMd5GetsLowercased() { - Email email = new Builder().address("TEST@TEST.org").hashAddress().build(); + var email = new Builder().address("TEST@TEST.org").hashAddress().build(); assertEquals( "476869598e748d958e819c180af31982", - email.getAddress(), + email.address(), "MD5 generated from lowercased email" ); } @Test public void testGetAddressWithoutSettingIt() { - Email email = new Builder().domain("test.org").hashAddress().build(); - assertNull(email.getAddress(), "null address if none set"); + var email = new Builder().domain("test.org").hashAddress().build(); + assertNull(email.address(), "null address if none set"); - Email email2 = new Builder().domain("test.org").hashAddress().build(); - assertNull(email2.getAddress(), "null address if none set"); + var email2 = new Builder().domain("test.org").hashAddress().build(); + assertNull(email2.address(), "null address if none set"); } @Test @@ -100,148 +100,148 @@ public void testNormalizing() throws NoSuchAlgorithmException { Email e; e = new Builder().address("test@maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder().address("Test@maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder(false).address(" Test@maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder().address("Test+alias@maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder().address("Test+007+008@maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder().address("Test+@maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder(false).address("Test@maxmind.com.").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals("maxmind.com.", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals("maxmind.com.", e.domain(), "domain"); e = new Builder().address("+@maxmind.com").hashAddress().build(); - assertEquals("aa57884e48f0dda9fc6f4cb2bffb1dd2", e.getAddress(), "MD5"); - assertEquals("maxmind.com", e.getDomain(), "domain"); + assertEquals("aa57884e48f0dda9fc6f4cb2bffb1dd2", e.address(), "MD5"); + assertEquals("maxmind.com", e.domain(), "domain"); e = new Builder(false).address("Test@ maxmind.com").hashAddress().build(); - assertEquals("977577b140bfb7c516e4746204fbdb01", e.getAddress(), "MD5"); - assertEquals(" maxmind.com", e.getDomain(), "domain"); + assertEquals("977577b140bfb7c516e4746204fbdb01", e.address(), "MD5"); + assertEquals(" maxmind.com", e.domain(), "domain"); e = new Builder().address("Test+foo@yahoo.com").hashAddress().build(); - assertEquals("a5f830c699fd71ad653aa59fa688c6d9", e.getAddress(), "MD5"); - assertEquals("yahoo.com", e.getDomain(), "domain"); + assertEquals("a5f830c699fd71ad653aa59fa688c6d9", e.address(), "MD5"); + assertEquals("yahoo.com", e.domain(), "domain"); e = new Builder().address("Test-foo@yahoo.com").hashAddress().build(); - assertEquals("88e478531ab3bc303f1b5da82c2e9bbb", e.getAddress(), "MD5"); - assertEquals("yahoo.com", e.getDomain(), "domain"); + assertEquals("88e478531ab3bc303f1b5da82c2e9bbb", e.address(), "MD5"); + assertEquals("yahoo.com", e.domain(), "domain"); e = new Builder().address("Test-foo-foo2@yahoo.com").hashAddress().build(); - assertEquals("88e478531ab3bc303f1b5da82c2e9bbb", e.getAddress(), "MD5"); - assertEquals("yahoo.com", e.getDomain(), "domain"); + assertEquals("88e478531ab3bc303f1b5da82c2e9bbb", e.address(), "MD5"); + assertEquals("yahoo.com", e.domain(), "domain"); e = new Builder().address("Test-foo@gmail.com").hashAddress().build(); - assertEquals("6f3ff986fa5e830dbbf08a942777a17c", e.getAddress(), "MD5"); - assertEquals("gmail.com", e.getDomain(), "domain"); + assertEquals("6f3ff986fa5e830dbbf08a942777a17c", e.address(), "MD5"); + assertEquals("gmail.com", e.domain(), "domain"); e = new Builder().address("test@gmail.com").hashAddress().build(); - assertEquals("1aedb8d9dc4751e229a335e371db8058", e.getAddress(), "MD5"); - assertEquals("gmail.com", e.getDomain(), "domain"); + assertEquals("1aedb8d9dc4751e229a335e371db8058", e.address(), "MD5"); + assertEquals("gmail.com", e.domain(), "domain"); e = new Builder().address("test@gamil.com").hashAddress().build(); - assertEquals("1aedb8d9dc4751e229a335e371db8058", e.getAddress(), "MD5"); - assertEquals("gamil.com", e.getDomain(), "domain"); + assertEquals("1aedb8d9dc4751e229a335e371db8058", e.address(), "MD5"); + assertEquals("gamil.com", e.domain(), "domain"); e = new Builder().address("test@bücher.com").hashAddress().build(); - assertEquals("24948acabac551360cd510d5e5e2b464", e.getAddress(), "MD5"); - assertEquals("bücher.com", e.getDomain(), "domain"); + assertEquals("24948acabac551360cd510d5e5e2b464", e.address(), "MD5"); + assertEquals("bücher.com", e.domain(), "domain"); e = new Builder().address("Test+alias@Bücher.com").hashAddress().build(); - assertEquals("24948acabac551360cd510d5e5e2b464", e.getAddress(), "MD5"); - assertEquals("Bücher.com", e.getDomain(), "domain"); + assertEquals("24948acabac551360cd510d5e5e2b464", e.address(), "MD5"); + assertEquals("Bücher.com", e.domain(), "domain"); e = new Builder(false).address("test").hashAddress().build(); - assertEquals("098f6bcd4621d373cade4e832627b4f6", e.getAddress(), "MD5"); - assertNull(e.getDomain(), "domain"); + assertEquals("098f6bcd4621d373cade4e832627b4f6", e.address(), "MD5"); + assertNull(e.domain(), "domain"); e = new Builder(false).address("test@").hashAddress().build(); - assertEquals("246a848af2f8394e3adbc738dbe43720", e.getAddress(), "MD5"); - assertNull(e.getDomain(), "domain"); + assertEquals("246a848af2f8394e3adbc738dbe43720", e.address(), "MD5"); + assertNull(e.domain(), "domain"); e = new Builder(false).address("test@.").hashAddress().build(); - assertEquals("246a848af2f8394e3adbc738dbe43720", e.getAddress(), "MD5"); - assertEquals(".", e.getDomain(), "domain"); + assertEquals("246a848af2f8394e3adbc738dbe43720", e.address(), "MD5"); + assertEquals(".", e.domain(), "domain"); e = new Builder(false).address("foo@googlemail.com").hashAddress().build(); - assertEquals(toMD5("foo@gmail.com"), e.getAddress(), "MD5"); - assertEquals("googlemail.com", e.getDomain(), "domain"); + assertEquals(toMD5("foo@gmail.com"), e.address(), "MD5"); + assertEquals("googlemail.com", e.domain(), "domain"); e = new Builder(false).address("foo.bar@gmail.com").hashAddress().build(); - assertEquals(toMD5("foobar@gmail.com"), e.getAddress(), "MD5"); - assertEquals("gmail.com", e.getDomain(), "domain"); + assertEquals(toMD5("foobar@gmail.com"), e.address(), "MD5"); + assertEquals("gmail.com", e.domain(), "domain"); e = new Builder(false).address("alias@user.fastmail.com").hashAddress().build(); - assertEquals(toMD5("user@fastmail.com"), e.getAddress(), "MD5"); - assertEquals("user.fastmail.com", e.getDomain(), "domain"); + assertEquals(toMD5("user@fastmail.com"), e.address(), "MD5"); + assertEquals("user.fastmail.com", e.domain(), "domain"); e = new Builder(false).address("foo@bar.example.com").hashAddress().build(); - assertEquals(toMD5("foo@bar.example.com"), e.getAddress(), "MD5"); - assertEquals("bar.example.com", e.getDomain(), "domain"); + assertEquals(toMD5("foo@bar.example.com"), e.address(), "MD5"); + assertEquals("bar.example.com", e.domain(), "domain"); e = new Builder(false).address("foo-bar@ymail.com").hashAddress().build(); - assertEquals(toMD5("foo@ymail.com"), e.getAddress(), "MD5"); - assertEquals("ymail.com", e.getDomain(), "domain"); + assertEquals(toMD5("foo@ymail.com"), e.address(), "MD5"); + assertEquals("ymail.com", e.domain(), "domain"); e = new Builder(false).address("foo@example.com.com").hashAddress().build(); - assertEquals(toMD5("foo@example.com"), e.getAddress(), "MD5"); - assertEquals("example.com.com", e.getDomain(), "domain"); + assertEquals(toMD5("foo@example.com"), e.address(), "MD5"); + assertEquals("example.com.com", e.domain(), "domain"); e = new Builder(false).address("foo@example.comfoo").hashAddress().build(); - assertEquals(toMD5("foo@example.comfoo"), e.getAddress(), "MD5"); - assertEquals("example.comfoo", e.getDomain(), "domain"); + assertEquals(toMD5("foo@example.comfoo"), e.address(), "MD5"); + assertEquals("example.comfoo", e.domain(), "domain"); e = new Builder(false).address("foo@example.cam").hashAddress().build(); - assertEquals(toMD5("foo@example.cam"), e.getAddress(), "MD5"); - assertEquals("example.cam", e.getDomain(), "domain"); + assertEquals(toMD5("foo@example.cam"), e.address(), "MD5"); + assertEquals("example.cam", e.domain(), "domain"); e = new Builder(false).address("foo@10000gmail.com").hashAddress().build(); - assertEquals(toMD5("foo@gmail.com"), e.getAddress(), "MD5"); - assertEquals("10000gmail.com", e.getDomain(), "domain"); + assertEquals(toMD5("foo@gmail.com"), e.address(), "MD5"); + assertEquals("10000gmail.com", e.domain(), "domain"); e = new Builder(false).address("foo@example.comcom").hashAddress().build(); - assertEquals(toMD5("foo@example.com"), e.getAddress(), "MD5"); - assertEquals("example.comcom", e.getDomain(), "domain"); + assertEquals(toMD5("foo@example.com"), e.address(), "MD5"); + assertEquals("example.comcom", e.domain(), "domain"); e = new Builder(false).address("foo@example.com.").hashAddress().build(); - assertEquals(toMD5("foo@example.com"), e.getAddress(), "MD5"); - assertEquals("example.com.", e.getDomain(), "domain"); + assertEquals(toMD5("foo@example.com"), e.address(), "MD5"); + assertEquals("example.com.", e.domain(), "domain"); e = new Builder(false).address("foo@example.com...").hashAddress().build(); - assertEquals(toMD5("foo@example.com"), e.getAddress(), "MD5"); - assertEquals("example.com...", e.getDomain(), "domain"); + assertEquals(toMD5("foo@example.com"), e.address(), "MD5"); + assertEquals("example.com...", e.domain(), "domain"); e = new Builder().address("example@bu\u0308cher.com").hashAddress().build(); - assertEquals("2b21bc76dab3c8b1622837c1d698936c", e.getAddress(), "MD5"); + assertEquals("2b21bc76dab3c8b1622837c1d698936c", e.address(), "MD5"); e = new Builder().address("example@b\u00FCcher.com").hashAddress().build(); - assertEquals("2b21bc76dab3c8b1622837c1d698936c", e.getAddress(), "MD5"); + assertEquals("2b21bc76dab3c8b1622837c1d698936c", e.address(), "MD5"); e = new Builder().address("bu\u0308cher@example.com").hashAddress().build(); - assertEquals("53550c712b146287a2d0dd30e5ed6f4b", e.getAddress(), "MD5"); + assertEquals("53550c712b146287a2d0dd30e5ed6f4b", e.address(), "MD5"); e = new Builder().address("b\u00FCcher@example.com").hashAddress().build(); - assertEquals("53550c712b146287a2d0dd30e5ed6f4b", e.getAddress(), "MD5"); + assertEquals("53550c712b146287a2d0dd30e5ed6f4b", e.address(), "MD5"); } private String toMD5(String s) throws NoSuchAlgorithmException { - MessageDigest d = MessageDigest.getInstance("MD5"); + var d = MessageDigest.getInstance("MD5"); d.update(s.getBytes(StandardCharsets.UTF_8)); - BigInteger i = new BigInteger(1, d.digest()); + var i = new BigInteger(1, d.digest()); return String.format("%032x", i); } @@ -270,16 +270,16 @@ void testInvalidAddresses(String invalidAddress) { @Test public void testDomain() { - String domain = "domain.com"; - Email email = new Builder().domain(domain).build(); - assertEquals(domain, email.getDomain()); + var domain = "domain.com"; + var email = new Builder().domain(domain).build(); + assertEquals(domain, email.domain()); } @Test public void testDomainWithoutValidation() { - String domain = "bad domain @!"; - Email email = new Builder(false).domain(domain).build(); - assertEquals(domain, email.getDomain()); + var domain = "bad domain @!"; + var email = new Builder(false).domain(domain).build(); + assertEquals(domain, email.domain()); } @ParameterizedTest(name = "Run #{index}: domain = \"{0}\"") diff --git a/src/test/java/com/maxmind/minfraud/request/EventTest.java b/src/test/java/com/maxmind/minfraud/request/EventTest.java index bbcdf77b..da2211cf 100644 --- a/src/test/java/com/maxmind/minfraud/request/EventTest.java +++ b/src/test/java/com/maxmind/minfraud/request/EventTest.java @@ -13,51 +13,51 @@ public class EventTest { @Test public void testParty() { - Event event = new Builder().party(Party.AGENT).build(); - assertEquals(Party.AGENT, event.getParty()); + var event = new Builder().party(Party.AGENT).build(); + assertEquals(Party.AGENT, event.party()); event = new Builder().party(Party.CUSTOMER).build(); - assertEquals(Party.CUSTOMER, event.getParty()); + assertEquals(Party.CUSTOMER, event.party()); } @Test public void testTransactionId() { - Event event = new Builder().transactionId("t12").build(); - assertEquals("t12", event.getTransactionId()); + var event = new Builder().transactionId("t12").build(); + assertEquals("t12", event.transactionId()); } @Test public void testShopId() { - Event event = new Builder().shopId("s12").build(); - assertEquals("s12", event.getShopId()); + var event = new Builder().shopId("s12").build(); + assertEquals("s12", event.shopId()); } @Test public void testTimeWithDate() { - Date date = new Date(); - Event event = new Builder().time(date).build(); - assertEquals(date, event.getTime()); + var date = new Date(); + var event = new Builder().time(date).build(); + assertEquals(date, event.time()); } @Test public void testTimeWithZonedDateTime() { - ZonedDateTime date = ZonedDateTime.now(); - Event event = new Builder().time(date).build(); - assertEquals(date, event.getDateTime()); + var date = ZonedDateTime.now(); + var event = new Builder().time(date).build(); + assertEquals(date, event.dateTime()); } @Test public void testType() { - Event event = new Builder().type(Type.ACCOUNT_CREATION).build(); - assertEquals(Type.ACCOUNT_CREATION, event.getType()); + var event = new Builder().type(Type.ACCOUNT_CREATION).build(); + assertEquals(Type.ACCOUNT_CREATION, event.type()); event = new Builder().type(Type.PAYOUT_CHANGE).build(); - assertEquals(Type.PAYOUT_CHANGE, event.getType()); + assertEquals(Type.PAYOUT_CHANGE, event.type()); event = new Builder().type(Type.CREDIT_APPLICATION).build(); - assertEquals(Type.CREDIT_APPLICATION, event.getType()); + assertEquals(Type.CREDIT_APPLICATION, event.type()); event = new Builder().type(Type.FUND_TRANSFER).build(); - assertEquals(Type.FUND_TRANSFER, event.getType()); + assertEquals(Type.FUND_TRANSFER, event.type()); } } diff --git a/src/test/java/com/maxmind/minfraud/request/OrderTest.java b/src/test/java/com/maxmind/minfraud/request/OrderTest.java index 8c682895..3086558b 100644 --- a/src/test/java/com/maxmind/minfraud/request/OrderTest.java +++ b/src/test/java/com/maxmind/minfraud/request/OrderTest.java @@ -13,20 +13,20 @@ public class OrderTest { @Test public void testDoubleAmount() { - Order order = new Builder().amount(1.1).build(); - assertEquals(BigDecimal.valueOf(1.1), order.getAmount()); + var order = new Builder().amount(1.1).build(); + assertEquals(BigDecimal.valueOf(1.1), order.amount()); } @Test public void testAmount() { - Order order = new Builder().amount(BigDecimal.valueOf(1.1)).build(); - assertEquals(BigDecimal.valueOf(1.1), order.getAmount()); + var order = new Builder().amount(BigDecimal.valueOf(1.1)).build(); + assertEquals(BigDecimal.valueOf(1.1), order.amount()); } @Test public void testCurrency() { - Order order = new Builder().currency("USD").build(); - assertEquals("USD", order.getCurrency()); + var order = new Builder().currency("USD").build(); + assertEquals("USD", order.currency()); } @Test @@ -64,38 +64,38 @@ public void testCurrencyInWrongCase() { @Test public void testDiscountCode() { - Order order = new Builder().discountCode("dsc").build(); - assertEquals("dsc", order.getDiscountCode()); + var order = new Builder().discountCode("dsc").build(); + assertEquals("dsc", order.discountCode()); } @Test public void testAffiliateId() { - Order order = new Builder().affiliateId("af").build(); - assertEquals("af", order.getAffiliateId()); + var order = new Builder().affiliateId("af").build(); + assertEquals("af", order.affiliateId()); } @Test public void testSubaffiliateId() { - Order order = new Builder().subaffiliateId("saf").build(); - assertEquals("saf", order.getSubaffiliateId()); + var order = new Builder().subaffiliateId("saf").build(); + assertEquals("saf", order.subaffiliateId()); } @Test public void testReferrerUri() throws Exception { - URI uri = new URI("http://www.mm.com/"); - Order order = new Builder().referrerUri(uri).build(); - assertEquals(uri, order.getReferrerUri()); + var uri = new URI("http://www.mm.com/"); + var order = new Builder().referrerUri(uri).build(); + assertEquals(uri, order.referrerUri()); } @Test public void testIsGift() { - Order order = new Builder().isGift(true).build(); + var order = new Builder().isGift(true).build(); assertTrue(order.isGift()); } @Test public void testHasGiftMessage() { - Order order = new Builder().hasGiftMessage(true).build(); + var order = new Builder().hasGiftMessage(true).build(); assertTrue(order.hasGiftMessage()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/request/PaymentTest.java b/src/test/java/com/maxmind/minfraud/request/PaymentTest.java index d2367972..2263da86 100644 --- a/src/test/java/com/maxmind/minfraud/request/PaymentTest.java +++ b/src/test/java/com/maxmind/minfraud/request/PaymentTest.java @@ -12,31 +12,31 @@ public class PaymentTest { @Test public void testMethod() { - Payment payment = new Builder().method(Method.CARD).build(); - assertEquals(Method.CARD, payment.getMethod()); + var payment = new Builder().method(Method.CARD).build(); + assertEquals(Method.CARD, payment.method()); payment = new Builder().method(Method.DIGITAL_WALLET).build(); - assertEquals(Method.DIGITAL_WALLET, payment.getMethod()); + assertEquals(Method.DIGITAL_WALLET, payment.method()); payment = new Builder().method(Method.BUY_NOW_PAY_LATER).build(); - assertEquals(Method.BUY_NOW_PAY_LATER, payment.getMethod()); + assertEquals(Method.BUY_NOW_PAY_LATER, payment.method()); } @Test public void testProcessor() { - Payment payment = new Builder().processor(Processor.ADYEN).build(); - assertEquals(Processor.ADYEN, payment.getProcessor()); + var payment = new Builder().processor(Processor.ADYEN).build(); + assertEquals(Processor.ADYEN, payment.processor()); } @Test public void testWasAuthorized() { - Payment payment = new Builder().wasAuthorized(true).build(); + var payment = new Builder().wasAuthorized(true).build(); assertTrue(payment.wasAuthorized()); } @Test public void testDeclineCode() { - Payment payment = new Builder().declineCode("declined").build(); - assertEquals("declined", payment.getDeclineCode()); + var payment = new Builder().declineCode("declined").build(); + assertEquals("declined", payment.declineCode()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/request/RequestTestHelper.java b/src/test/java/com/maxmind/minfraud/request/RequestTestHelper.java index 6319ec8e..1ba4315a 100644 --- a/src/test/java/com/maxmind/minfraud/request/RequestTestHelper.java +++ b/src/test/java/com/maxmind/minfraud/request/RequestTestHelper.java @@ -157,14 +157,14 @@ private static Transaction makeTransaction(Email e) throws Exception { public static String readJsonFile(String name) throws IOException, URISyntaxException { - URL resource = RequestTestHelper.class + var resource = RequestTestHelper.class .getResource("/test-data/" + name + ".json"); return Files.readString(Paths.get(resource.toURI())); } public static void verifyRequestFor(WireMockExtension wireMock, String service, String jsonFile) throws IOException, URISyntaxException { - String requestBody = readJsonFile(jsonFile); + var requestBody = readJsonFile(jsonFile); wireMock.verify(postRequestedFor(urlMatching("/minfraud/v2.0/" + service)) .withRequestBody(equalToJson(requestBody)) diff --git a/src/test/java/com/maxmind/minfraud/request/ShippingTest.java b/src/test/java/com/maxmind/minfraud/request/ShippingTest.java index 3746d6d6..4107122d 100644 --- a/src/test/java/com/maxmind/minfraud/request/ShippingTest.java +++ b/src/test/java/com/maxmind/minfraud/request/ShippingTest.java @@ -14,7 +14,7 @@ Builder builder() { @Test public void testDeliverySpeed() { - Shipping loc = this.builder().deliverySpeed(DeliverySpeed.EXPEDITED).build(); - assertEquals(DeliverySpeed.EXPEDITED, loc.getDeliverySpeed()); + var loc = this.builder().deliverySpeed(DeliverySpeed.EXPEDITED).build(); + assertEquals(DeliverySpeed.EXPEDITED, loc.deliverySpeed()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/request/ShoppingCartTest.java b/src/test/java/com/maxmind/minfraud/request/ShoppingCartTest.java index 92c93125..336b6e54 100644 --- a/src/test/java/com/maxmind/minfraud/request/ShoppingCartTest.java +++ b/src/test/java/com/maxmind/minfraud/request/ShoppingCartTest.java @@ -10,31 +10,31 @@ public class ShoppingCartTest { @Test public void testCategory() { - ShoppingCartItem item = new Builder().category("cat1").build(); - assertEquals("cat1", item.getCategory()); + var item = new Builder().category("cat1").build(); + assertEquals("cat1", item.category()); } @Test public void testItemId() { - ShoppingCartItem item = new Builder().itemId("id5").build(); - assertEquals("id5", item.getItemId()); + var item = new Builder().itemId("id5").build(); + assertEquals("id5", item.itemId()); } @Test public void testQuantity() { - ShoppingCartItem item = new Builder().quantity(100).build(); - assertEquals(Integer.valueOf(100), item.getQuantity()); + var item = new Builder().quantity(100).build(); + assertEquals(Integer.valueOf(100), item.quantity()); } @Test public void testPrice() { - ShoppingCartItem item = new Builder().price(BigDecimal.TEN).build(); - assertEquals(BigDecimal.TEN, item.getPrice()); + var item = new Builder().price(BigDecimal.TEN).build(); + assertEquals(BigDecimal.TEN, item.price()); } @Test public void testDoublePrice() { - ShoppingCartItem item = new Builder().price(10.3).build(); - assertEquals(BigDecimal.valueOf(10.3), item.getPrice()); + var item = new Builder().price(10.3).build(); + assertEquals(BigDecimal.valueOf(10.3), item.price()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/request/TransactionReportTest.java b/src/test/java/com/maxmind/minfraud/request/TransactionReportTest.java index fb544e64..c07b3f48 100644 --- a/src/test/java/com/maxmind/minfraud/request/TransactionReportTest.java +++ b/src/test/java/com/maxmind/minfraud/request/TransactionReportTest.java @@ -39,40 +39,40 @@ public void testBuildInvalidIdentifier() { @Test public void testBuildValidIdentifier() { - final String maxmindId = "12345678"; - final UUID minfraudId = UUID.fromString( + final var maxmindId = "12345678"; + final var minfraudId = UUID.fromString( "58fa38d8-4b87-458b-a22b-f00eda1aa20d"); - final String transactionId = "abc123"; + final var transactionId = "abc123"; assertEquals(ip, new TransactionReport.Builder(tag) - .ipAddress(ip).build().getIpAddress()); + .ipAddress(ip).build().ipAddress()); assertEquals(maxmindId, new TransactionReport.Builder(tag) - .maxmindId(maxmindId).build().getMaxmindId()); + .maxmindId(maxmindId).build().maxmindId()); assertEquals(minfraudId, new TransactionReport.Builder(tag) - .minfraudId(minfraudId).build().getMinfraudId()); + .minfraudId(minfraudId).build().minfraudId()); assertEquals(transactionId, new TransactionReport.Builder(tag) - .transactionId(transactionId).build().getTransactionId()); + .transactionId(transactionId).build().transactionId()); } @Test public void testIpAddress() { - final TransactionReport report = new Builder(tag).ipAddress(ip).build(); - assertEquals(ip, report.getIpAddress()); + final var report = new Builder(tag).ipAddress(ip).build(); + assertEquals(ip, report.ipAddress()); } @Test public void testTag() { - final TransactionReport report = new Builder(tag).ipAddress(ip).build(); - assertEquals(Tag.NOT_FRAUD, report.getTag()); + final var report = new Builder(tag).ipAddress(ip).build(); + assertEquals(Tag.NOT_FRAUD, report.tag()); } @Test public void testChargebackCode() { - final String code = "foo"; - final TransactionReport report = + final var code = "foo"; + final var report = new Builder(tag).ipAddress(ip).chargebackCode(code).build(); - assertEquals(code, report.getChargebackCode()); + assertEquals(code, report.chargebackCode()); } @Test @@ -93,36 +93,36 @@ public void testTooShortMaxmindId() { @Test public void testValidMaxmindId() { - final String id = "12345678"; - final TransactionReport report = new Builder(tag).maxmindId(id).build(); - assertEquals(id, report.getMaxmindId()); + final var id = "12345678"; + final var report = new Builder(tag).maxmindId(id).build(); + assertEquals(id, report.maxmindId()); } @Test public void testMinfraudId() { - final UUID id = UUID.fromString("58fa38d8-4b87-458b-a22b-f00eda1aa20d"); - final TransactionReport report = new Builder(tag).minfraudId(id).build(); - assertEquals(id, report.getMinfraudId()); + final var id = UUID.fromString("58fa38d8-4b87-458b-a22b-f00eda1aa20d"); + final var report = new Builder(tag).minfraudId(id).build(); + assertEquals(id, report.minfraudId()); } @Test public void testNotes() { - final String notes = "foo"; - final TransactionReport report = new Builder(tag).ipAddress(ip).notes(notes).build(); - assertEquals(notes, report.getNotes()); + final var notes = "foo"; + final var report = new Builder(tag).ipAddress(ip).notes(notes).build(); + assertEquals(notes, report.notes()); } @Test public void testTransactionID() { - final String id = "foo"; - final TransactionReport report = new Builder(tag).transactionId(id).build(); - assertEquals(id, report.getTransactionId()); + final var id = "foo"; + final var report = new Builder(tag).transactionId(id).build(); + assertEquals(id, report.transactionId()); } // Test the example in the README @Test public void testAllFields() throws Exception { - final TransactionReport report = new TransactionReport.Builder(Tag.NOT_FRAUD) + final var report = new TransactionReport.Builder(Tag.NOT_FRAUD) .chargebackCode("mycode") .ipAddress(InetAddress.getByName("1.1.1.1")) .maxmindId("12345678") @@ -131,7 +131,7 @@ public void testAllFields() throws Exception { .transactionId("foo") .build(); - final String expectedJSON = "{" + + final var expectedJSON = "{" + "ip_address:'1.1.1.1'," + "tag:'not_fraud'," + "chargeback_code:'mycode'," + diff --git a/src/test/java/com/maxmind/minfraud/request/TransactionTest.java b/src/test/java/com/maxmind/minfraud/request/TransactionTest.java index 94a968e2..918b516a 100644 --- a/src/test/java/com/maxmind/minfraud/request/TransactionTest.java +++ b/src/test/java/com/maxmind/minfraud/request/TransactionTest.java @@ -15,96 +15,96 @@ private Transaction.Builder builder() throws UnknownHostException { @Test public void testConstructorWithoutDevice() { - Transaction request = new Transaction.Builder().build(); - assertNull(request.getDevice()); + var request = new Transaction.Builder().build(); + assertNull(request.device()); } @Test public void testAccount() throws Exception { - Transaction request = + var request = this.builder().account(new Account.Builder().userId("1").build()).build(); - assertEquals("1", request.getAccount().getUserId()); + assertEquals("1", request.account().userId()); } @Test public void testBilling() throws Exception { - Transaction request = + var request = this.builder().billing(new Billing.Builder().address("add").build()).build(); - assertEquals("add", request.getBilling().getAddress()); + assertEquals("add", request.billing().address()); } @Test public void testCreditCard() throws Exception { - Transaction request = + var request = this.builder().creditCard(new CreditCard.Builder().bankName("name").build()).build(); - assertEquals("name", request.getCreditCard().getBankName()); + assertEquals("name", request.creditCard().bankName()); } @Test public void testCustomInputs() throws Exception { - Transaction request = this.builder().customInputs( + var request = this.builder().customInputs( new CustomInputs.Builder().put("key", "value").build()).build(); - assertEquals("value", request.getCustomInputs().getInputs().get("key")); + assertEquals("value", request.customInputs().inputs().get("key")); } @Test public void testDevice() throws Exception { - Transaction request = this.builder().build(); - assertEquals(InetAddress.getByName("152.216.7.110"), request.getDevice().getIpAddress()); + var request = this.builder().build(); + assertEquals(InetAddress.getByName("152.216.7.110"), request.device().ipAddress()); } @Test public void testDeviceThroughMethod() throws Exception { - InetAddress ip = InetAddress.getByName("152.216.7.110"); + var ip = InetAddress.getByName("152.216.7.110"); - Device device = new Device.Builder().ipAddress(ip).build(); + var device = new Device.Builder().ipAddress(ip).build(); - Transaction request = new Transaction.Builder() + var request = new Transaction.Builder() .device(device) .build(); - assertEquals(ip, request.getDevice().getIpAddress()); + assertEquals(ip, request.device().ipAddress()); } @Test public void testEmail() throws Exception { - Transaction request = + var request = this.builder().email(new Email.Builder().domain("test.com").build()).build(); - assertEquals("test.com", request.getEmail().getDomain()); + assertEquals("test.com", request.email().domain()); } @Test public void testEvent() throws Exception { - Transaction request = this.builder().event(new Event.Builder().shopId("1").build()).build(); - assertEquals("1", request.getEvent().getShopId()); + var request = this.builder().event(new Event.Builder().shopId("1").build()).build(); + assertEquals("1", request.event().shopId()); } @Test public void testOrder() throws Exception { - Transaction request = + var request = this.builder().order(new Order.Builder().affiliateId("af1").build()).build(); - assertEquals("af1", request.getOrder().getAffiliateId()); + assertEquals("af1", request.order().affiliateId()); } @Test public void testPayment() throws Exception { - Transaction request = + var request = this.builder().payment(new Payment.Builder().declineCode("d").build()).build(); - assertEquals("d", request.getPayment().getDeclineCode()); + assertEquals("d", request.payment().declineCode()); } @Test public void testShipping() throws Exception { - Transaction request = + var request = this.builder().shipping(new Shipping.Builder().lastName("l").build()).build(); - assertEquals("l", request.getShipping().getLastName()); + assertEquals("l", request.shipping().lastName()); } @Test public void testShoppingCart() throws Exception { - Transaction request = + var request = this.builder().addShoppingCartItem(new ShoppingCartItem.Builder().itemId("1").build()) .build(); - assertEquals("1", request.getShoppingCart().get(0).getItemId()); + assertEquals("1", request.shoppingCart().get(0).itemId()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/AbstractAddressTest.java b/src/test/java/com/maxmind/minfraud/response/AbstractAddressTest.java deleted file mode 100644 index 8f870edc..00000000 --- a/src/test/java/com/maxmind/minfraud/response/AbstractAddressTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.maxmind.minfraud.response; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -abstract class AbstractAddressTest extends AbstractOutputTest { - private static final double DELTA = 1e-15; - - void testAddress(AbstractAddress address) { - assertTrue(address.isInIpCountry(), "correct isInIpCountry"); - assertTrue(address.isPostalInCity(), "correct isPostalInCity"); - assertEquals( - 100, - address.getDistanceToIpLocation().longValue(), - "correct getDistanceToIpLocation" - ); - assertEquals( - 32.1, - address.getLongitude(), - AbstractAddressTest.DELTA, - "correct longitude" - ); - assertEquals( - 43.1, - address.getLatitude(), - AbstractAddressTest.DELTA, - "correct latitude" - ); - } -} diff --git a/src/test/java/com/maxmind/minfraud/response/AbstractOutputTest.java b/src/test/java/com/maxmind/minfraud/response/AbstractOutputTest.java index 53d62fdc..1b424aca 100644 --- a/src/test/java/com/maxmind/minfraud/response/AbstractOutputTest.java +++ b/src/test/java/com/maxmind/minfraud/response/AbstractOutputTest.java @@ -11,12 +11,12 @@ import com.fasterxml.jackson.databind.util.StdDateFormat; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.io.IOException; -import java.util.Collections; +import java.util.List; public abstract class AbstractOutputTest { T deserialize(Class cls, String json) throws IOException { - ObjectMapper mapper = JsonMapper.builder() + var mapper = JsonMapper.builder() .addModule(new JavaTimeModule()) .defaultDateFormat(new StdDateFormat().withColonInTimeZone(true)) .enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING) @@ -26,8 +26,8 @@ T deserialize(Class cls, String json) throws IOException { .serializationInclusion(JsonInclude.Include.NON_NULL) .serializationInclusion(JsonInclude.Include.NON_EMPTY) .build(); - InjectableValues inject = new Std().addValue( - "locales", Collections.singletonList("en")); + var inject = new Std().addValue( + "locales", List.of("en")); return mapper.readerFor(cls).with(inject).readValue(json); } } diff --git a/src/test/java/com/maxmind/minfraud/response/BillingAddressTest.java b/src/test/java/com/maxmind/minfraud/response/BillingAddressTest.java index ecc1307e..dc147a9c 100644 --- a/src/test/java/com/maxmind/minfraud/response/BillingAddressTest.java +++ b/src/test/java/com/maxmind/minfraud/response/BillingAddressTest.java @@ -1,9 +1,13 @@ package com.maxmind.minfraud.response; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import com.fasterxml.jackson.jr.ob.JSON; import org.junit.jupiter.api.Test; -public class BillingAddressTest extends AbstractAddressTest { +public class BillingAddressTest extends AbstractOutputTest { + private static final double DELTA = 1e-15; @Test public void testBillingAddress() throws Exception { @@ -20,6 +24,24 @@ public void testBillingAddress() throws Exception { .finish() ); - this.testAddress(address); + assertTrue(address.isInIpCountry(), "correct isInIpCountry"); + assertTrue(address.isPostalInCity(), "correct isPostalInCity"); + assertEquals( + 100, + address.distanceToIpLocation().longValue(), + "correct distanceToIpLocation" + ); + assertEquals( + 32.1, + address.longitude(), + DELTA, + "correct longitude" + ); + assertEquals( + 43.1, + address.latitude(), + DELTA, + "correct latitude" + ); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/response/CreditCardTest.java b/src/test/java/com/maxmind/minfraud/response/CreditCardTest.java index 8f31c843..a55a73f4 100644 --- a/src/test/java/com/maxmind/minfraud/response/CreditCardTest.java +++ b/src/test/java/com/maxmind/minfraud/response/CreditCardTest.java @@ -29,10 +29,10 @@ public void testCreditCard() throws Exception { .finish() ); - assertEquals("Bank", cc.getIssuer().getName()); - assertEquals("US", cc.getCountry()); - assertEquals("Visa", cc.getBrand()); - assertEquals("credit", cc.getType()); + assertEquals("Bank", cc.issuer().name()); + assertEquals("US", cc.country()); + assertEquals("Visa", cc.brand()); + assertEquals("credit", cc.type()); assertTrue(cc.isBusiness()); assertTrue(cc.isPrepaid()); assertTrue(cc.isVirtual()); diff --git a/src/test/java/com/maxmind/minfraud/response/DeviceTest.java b/src/test/java/com/maxmind/minfraud/response/DeviceTest.java index 72dfd6f2..4d2338b9 100644 --- a/src/test/java/com/maxmind/minfraud/response/DeviceTest.java +++ b/src/test/java/com/maxmind/minfraud/response/DeviceTest.java @@ -23,11 +23,11 @@ public void testDevice() throws Exception { .finish() ); - assertEquals(99.0, device.getConfidence(), 1e-15); - assertEquals(UUID.fromString("C8D3BE1A-BE26-11E5-8C50-1B575C37265F"), device.getId()); - assertEquals("2016-06-08T14:16:38Z", device.getLastSeen()); + assertEquals(99.0, device.confidence(), 1e-15); + assertEquals(UUID.fromString("C8D3BE1A-BE26-11E5-8C50-1B575C37265F"), device.id()); + assertEquals("2016-06-08T14:16:38Z", device.lastSeen()); assertEquals("2016-06-08T14:16:38Z", device.getLastSeenDateTime().toString()); - assertEquals("2018-04-05T15:21:01-07:00", device.getLocalTime()); + assertEquals("2018-04-05T15:21:01-07:00", device.localTime()); assertEquals("2018-04-05T15:21:01-07:00", device.getLocalDateTime().toString()); } diff --git a/src/test/java/com/maxmind/minfraud/response/DispositionTest.java b/src/test/java/com/maxmind/minfraud/response/DispositionTest.java index 2e27121d..fc37295d 100644 --- a/src/test/java/com/maxmind/minfraud/response/DispositionTest.java +++ b/src/test/java/com/maxmind/minfraud/response/DispositionTest.java @@ -21,8 +21,8 @@ public void testDisposition() throws Exception { .finish() ); - assertEquals("accept", disposition.getAction()); - assertEquals("default", disposition.getReason()); - assertEquals("the label", disposition.getRuleLabel()); + assertEquals("accept", disposition.action()); + assertEquals("default", disposition.reason()); + assertEquals("the label", disposition.ruleLabel()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/EmailDomainTest.java b/src/test/java/com/maxmind/minfraud/response/EmailDomainTest.java index 27f09198..e57651a1 100644 --- a/src/test/java/com/maxmind/minfraud/response/EmailDomainTest.java +++ b/src/test/java/com/maxmind/minfraud/response/EmailDomainTest.java @@ -20,6 +20,6 @@ public void testEmailDomain() throws Exception { .finish() ); - assertEquals(LocalDate.parse("2014-02-03"), domain.getFirstSeen()); + assertEquals(LocalDate.parse("2014-02-03"), domain.firstSeen()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/EmailTest.java b/src/test/java/com/maxmind/minfraud/response/EmailTest.java index 5c71c468..3484390e 100644 --- a/src/test/java/com/maxmind/minfraud/response/EmailTest.java +++ b/src/test/java/com/maxmind/minfraud/response/EmailTest.java @@ -14,7 +14,7 @@ public class EmailTest extends AbstractOutputTest { @Test public void testEmail() throws Exception { - Email email = this.deserialize( + var email = this.deserialize( Email.class, JSON.std .composeString() @@ -30,17 +30,17 @@ public void testEmail() throws Exception { .finish() ); - assertEquals(LocalDate.parse("2014-02-03"), email.getDomain().getFirstSeen()); + assertEquals(LocalDate.parse("2014-02-03"), email.domain().firstSeen()); assertFalse(email.isDisposable()); assertFalse(email.isFree()); assertTrue(email.isHighRisk()); - assertEquals("2017-01-02", email.getFirstSeen()); + assertEquals("2017-01-02", email.firstSeen()); assertEquals(LocalDate.parse("2017-01-02"), email.getFirstSeenDate()); } @Test public void testEmailWithoutFirstSeen() throws Exception { - Email email = this.deserialize( + var email = this.deserialize( Email.class, JSON.std .composeString() @@ -51,11 +51,11 @@ public void testEmailWithoutFirstSeen() throws Exception { .finish() ); - assertNotNull(email.getDomain()); + assertNotNull(email.domain()); assertNull(email.isDisposable()); assertFalse(email.isFree()); assertTrue(email.isHighRisk()); - assertNull(email.getFirstSeen()); + assertNull(email.firstSeen()); assertNull(email.getFirstSeenDate()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/FactorsResponseTest.java b/src/test/java/com/maxmind/minfraud/response/FactorsResponseTest.java index 6f415863..fcc9fe02 100644 --- a/src/test/java/com/maxmind/minfraud/response/FactorsResponseTest.java +++ b/src/test/java/com/maxmind/minfraud/response/FactorsResponseTest.java @@ -45,42 +45,42 @@ public void testFactors() throws Exception { .finish() ); - assertTrue(factors.getShippingPhone().isVoip(), "correct shipping phone isVoip"); - assertFalse(factors.getShippingPhone().matchesPostal(), "correct shipping phone matchesPostal"); - assertFalse(factors.getBillingPhone().isVoip(), "correct billing phone isVoip"); - assertTrue(factors.getBillingPhone().matchesPostal(), "correct billing phone matchesPostal"); + assertTrue(factors.shippingPhone().isVoip(), "correct shipping phone isVoip"); + assertFalse(factors.shippingPhone().matchesPostal(), "correct shipping phone matchesPostal"); + assertFalse(factors.billingPhone().isVoip(), "correct billing phone isVoip"); + assertTrue(factors.billingPhone().matchesPostal(), "correct billing phone matchesPostal"); assertEquals( Double.valueOf(1.20), - factors.getFundsRemaining(), + factors.fundsRemaining(), "correct funnds remaining" ); - assertEquals(UUID.fromString(id), factors.getId(), "correct ID"); + assertEquals(UUID.fromString(id), factors.id(), "correct ID"); assertEquals( Integer.valueOf(123), - factors.getQueriesRemaining(), + factors.queriesRemaining(), "correct queries remaining" ); assertEquals( Double.valueOf(0.01), - factors.getRiskScore(), + factors.riskScore(), "correct risk score" ); - assertEquals(1, factors.getRiskScoreReasons().size()); + assertEquals(1, factors.riskScoreReasons().size()); assertEquals( Double.valueOf(45), - factors.getRiskScoreReasons().get(0).getMultiplier(), + factors.riskScoreReasons().get(0).multiplier(), "risk multiplier" ); - assertEquals(1, factors.getRiskScoreReasons().get(0).getReasons().size()); + assertEquals(1, factors.riskScoreReasons().get(0).reasons().size()); assertEquals( "ANONYMOUS_IP", - factors.getRiskScoreReasons().get(0).getReasons().get(0).getCode(), + factors.riskScoreReasons().get(0).reasons().get(0).code(), "risk reason code" ); assertEquals( "Risk due to IP being an Anonymous IP", - factors.getRiskScoreReasons().get(0).getReasons().get(0).getReason(), + factors.riskScoreReasons().get(0).reasons().get(0).reason(), "risk reason" ); } diff --git a/src/test/java/com/maxmind/minfraud/response/GeoIp2LocationTest.java b/src/test/java/com/maxmind/minfraud/response/GeoIp2LocationTest.java index 08dac1b9..64a0b59c 100644 --- a/src/test/java/com/maxmind/minfraud/response/GeoIp2LocationTest.java +++ b/src/test/java/com/maxmind/minfraud/response/GeoIp2LocationTest.java @@ -20,7 +20,7 @@ public void testGetLocalTime() throws Exception { .finish() ); - assertEquals(time, location.getLocalTime()); + assertEquals(time, location.localTime()); assertEquals(time, location.getLocalDateTime().toString()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java b/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java index 23b73e30..b9a36735 100644 --- a/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java +++ b/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java @@ -67,58 +67,58 @@ public void testInsights() throws Exception { .finish() ); - assertEquals("accept", insights.getDisposition().getAction(), "disposition"); + assertEquals("accept", insights.disposition().action(), "disposition"); assertEquals( LocalDate.parse("2014-02-03"), - insights.getEmail().getDomain().getFirstSeen(), + insights.email().domain().firstSeen(), "email domain first seen" ); assertEquals( "US", - insights.getIpAddress().getCountry().getIsoCode(), + insights.ipAddress().country().isoCode(), "correct country ISO" ); - assertTrue(insights.getCreditCard().isBusiness(), "correct credit card is business"); - assertTrue(insights.getCreditCard().isPrepaid(), "correct credit card prepaid"); + assertTrue(insights.creditCard().isBusiness(), "correct credit card is business"); + assertTrue(insights.creditCard().isPrepaid(), "correct credit card prepaid"); assertTrue( - insights.getShippingAddress().isInIpCountry(), + insights.shippingAddress().isInIpCountry(), "correct shipping address is in IP country" ); - assertTrue(insights.getShippingPhone().isVoip(), "correct shipping phone isVoip"); + assertTrue(insights.shippingPhone().isVoip(), "correct shipping phone isVoip"); assertFalse( - insights.getShippingPhone().matchesPostal(), + insights.shippingPhone().matchesPostal(), "correct shipping phone matchesPostal" ); assertTrue( - insights.getBillingAddress().isInIpCountry(), + insights.billingAddress().isInIpCountry(), "correct billing address is in IP country" ); - assertFalse(insights.getBillingPhone().isVoip(), "correct billing phone isVoip"); + assertFalse(insights.billingPhone().isVoip(), "correct billing phone isVoip"); assertTrue( - insights.getBillingPhone().matchesPostal(), + insights.billingPhone().matchesPostal(), "correct billing phone matchesPostal" ); assertEquals( Double.valueOf(1.20), - insights.getFundsRemaining(), + insights.fundsRemaining(), "correct funds remaining" ); - assertEquals(UUID.fromString(id), insights.getId(), "correct ID"); + assertEquals(UUID.fromString(id), insights.id(), "correct ID"); assertEquals( Integer.valueOf(123), - insights.getQueriesRemaining(), + insights.queriesRemaining(), "correct queries remaining" ); - assertEquals(Double.valueOf(0.01), insights.getRiskScore(), "correct risk score"); + assertEquals(Double.valueOf(0.01), insights.riskScore(), "correct risk score"); assertEquals( "INVALID_INPUT", - insights.getWarnings().get(0).getCode(), + insights.warnings().get(0).code(), "correct warning code" ); - assertEquals("152.216.7.110", insights.getIpAddress().getTraits().getIpAddress()); - assertEquals("81.2.69.0/24", insights.getIpAddress().getTraits().getNetwork().toString()); + assertEquals("152.216.7.110", insights.ipAddress().traits().ipAddress().getHostAddress()); + assertEquals("81.2.69.0/24", insights.ipAddress().traits().network().toString()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/IpAddressTest.java b/src/test/java/com/maxmind/minfraud/response/IpAddressTest.java index a48b4927..6cbdf0db 100644 --- a/src/test/java/com/maxmind/minfraud/response/IpAddressTest.java +++ b/src/test/java/com/maxmind/minfraud/response/IpAddressTest.java @@ -46,32 +46,32 @@ public void testIpAddress() throws Exception { .finish() ); - assertEquals(Double.valueOf(99), address.getRisk(), "IP risk"); - assertEquals(time, address.getLocation().getLocalTime(), "correct local time"); - assertEquals("1.2.0.0/16", address.getTraits().getNetwork().toString()); - assertTrue(address.getTraits().isAnonymous(), "isAnonymous"); - assertTrue(address.getTraits().isAnonymousVpn(), "isAnonymousVpn"); - assertTrue(address.getTraits().isHostingProvider(), "isHostingProvider"); - assertTrue(address.getTraits().isPublicProxy(), "isPublicProxy"); - assertTrue(address.getTraits().isTorExitNode(), "isTorExitNode"); + assertEquals(Double.valueOf(99), address.risk(), "IP risk"); + assertEquals(time, address.location().localTime(), "correct local time"); + assertEquals("1.2.0.0/16", address.traits().network().toString()); + assertTrue(address.traits().isAnonymous(), "isAnonymous"); + assertTrue(address.traits().isAnonymousVpn(), "isAnonymousVpn"); + assertTrue(address.traits().isHostingProvider(), "isHostingProvider"); + assertTrue(address.traits().isPublicProxy(), "isPublicProxy"); + assertTrue(address.traits().isTorExitNode(), "isTorExitNode"); assertEquals( "310", - address.getTraits().getMobileCountryCode(), + address.traits().mobileCountryCode(), "mobile country code" ); assertEquals( "004", - address.getTraits().getMobileNetworkCode(), + address.traits().mobileNetworkCode(), "mobile network code" ); assertEquals( "ANONYMOUS_IP", - address.getRiskReasons().get(0).getCode(), + address.riskReasons().get(0).code(), "IP risk reason code" ); assertEquals( "some reason", - address.getRiskReasons().get(0).getReason(), + address.riskReasons().get(0).reason(), "IP risk reason" ); } @@ -83,6 +83,6 @@ public void testEmptyObject() throws Exception { "{}" ); - assertNotNull(address.getRiskReasons()); + assertNotNull(address.riskReasons()); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/response/IssuerTest.java b/src/test/java/com/maxmind/minfraud/response/IssuerTest.java index e9c38d04..e9844d73 100644 --- a/src/test/java/com/maxmind/minfraud/response/IssuerTest.java +++ b/src/test/java/com/maxmind/minfraud/response/IssuerTest.java @@ -25,9 +25,9 @@ public void testIssuer() throws Exception { .finish() ); - assertEquals("Bank", issuer.getName(), "bank name"); + assertEquals("Bank", issuer.name(), "bank name"); assertTrue(issuer.matchesProvidedName(), "provided name matches"); - assertEquals(phone, issuer.getPhoneNumber(), "phone"); + assertEquals(phone, issuer.phoneNumber(), "phone"); assertTrue(issuer.matchesProvidedPhoneNumber(), "provided phone matches"); } } \ No newline at end of file diff --git a/src/test/java/com/maxmind/minfraud/response/PhoneTest.java b/src/test/java/com/maxmind/minfraud/response/PhoneTest.java index decc4193..b6e00a13 100644 --- a/src/test/java/com/maxmind/minfraud/response/PhoneTest.java +++ b/src/test/java/com/maxmind/minfraud/response/PhoneTest.java @@ -25,10 +25,10 @@ public void testPhone() throws Exception { .finish() ); - assertEquals("US", phone.getCountry()); + assertEquals("US", phone.country()); assertTrue(phone.isVoip()); assertFalse(phone.matchesPostal()); - assertEquals("Operator", phone.getNetworkOperator()); - assertEquals("fixed", phone.getNumberType()); + assertEquals("Operator", phone.networkOperator()); + assertEquals("fixed", phone.numberType()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/ReasonTest.java b/src/test/java/com/maxmind/minfraud/response/ReasonTest.java index 5a1b706c..9ea1db6c 100644 --- a/src/test/java/com/maxmind/minfraud/response/ReasonTest.java +++ b/src/test/java/com/maxmind/minfraud/response/ReasonTest.java @@ -23,8 +23,8 @@ public void testReason() throws Exception { .finish() ); - assertEquals(code, reason.getCode(), "code"); - assertEquals(msg, reason.getReason(), "reason"); + assertEquals(code, reason.code(), "code"); + assertEquals(msg, reason.reason(), "reason"); } } diff --git a/src/test/java/com/maxmind/minfraud/response/RiskScoreReasonTest.java b/src/test/java/com/maxmind/minfraud/response/RiskScoreReasonTest.java index 0911ae47..3eb0a269 100644 --- a/src/test/java/com/maxmind/minfraud/response/RiskScoreReasonTest.java +++ b/src/test/java/com/maxmind/minfraud/response/RiskScoreReasonTest.java @@ -26,16 +26,16 @@ public void testRiskScoreReason() throws Exception { .finish() ); - assertEquals(Double.valueOf(45), reason.getMultiplier(), "multiplier"); - assertEquals(1, reason.getReasons().size()); + assertEquals(Double.valueOf(45), reason.multiplier(), "multiplier"); + assertEquals(1, reason.reasons().size()); assertEquals( "ANONYMOUS_IP", - reason.getReasons().get(0).getCode(), + reason.reasons().get(0).code(), "risk reason code" ); assertEquals( "Risk due to IP being an Anonymous IP", - reason.getReasons().get(0).getReason(), + reason.reasons().get(0).reason(), "risk reason" ); } @@ -47,6 +47,6 @@ public void testEmptyObject() throws Exception { "{}" ); - assertNotNull(reason.getReasons()); + assertNotNull(reason.reasons()); } } diff --git a/src/test/java/com/maxmind/minfraud/response/ScoreResponseTest.java b/src/test/java/com/maxmind/minfraud/response/ScoreResponseTest.java index 1b9d255a..923a28e4 100644 --- a/src/test/java/com/maxmind/minfraud/response/ScoreResponseTest.java +++ b/src/test/java/com/maxmind/minfraud/response/ScoreResponseTest.java @@ -12,7 +12,7 @@ public class ScoreResponseTest extends AbstractOutputTest { public void testScore() throws Exception { String id = "b643d445-18b2-4b9d-bad4-c9c4366e402a"; ScoreResponse score = this.deserialize( - InsightsResponse.class, + ScoreResponse.class, JSON.std .composeString() .startObject() @@ -35,12 +35,12 @@ public void testScore() throws Exception { .finish() ); - assertEquals(UUID.fromString(id), score.getId(), "correct ID"); - assertEquals(Double.valueOf(1.20), score.getFundsRemaining(), "correct funds remaining"); - assertEquals(Integer.valueOf(123), score.getQueriesRemaining(), "queries remaining"); - assertEquals(Double.valueOf(0.01), score.getRiskScore(), "risk score"); - assertEquals("manual_review", score.getDisposition().getAction(), "disposition"); - assertEquals(Double.valueOf(0.02), score.getIpAddress().getRisk(), "IP risk"); - assertEquals("INVALID_INPUT", score.getWarnings().get(0).getCode(), "warning code"); + assertEquals(UUID.fromString(id), score.id(), "correct ID"); + assertEquals(Double.valueOf(1.20), score.fundsRemaining(), "correct funds remaining"); + assertEquals(Integer.valueOf(123), score.queriesRemaining(), "queries remaining"); + assertEquals(Double.valueOf(0.01), score.riskScore(), "risk score"); + assertEquals("manual_review", score.disposition().action(), "disposition"); + assertEquals(Double.valueOf(0.02), score.ipAddress().risk(), "IP risk"); + assertEquals("INVALID_INPUT", score.warnings().get(0).code(), "warning code"); } } diff --git a/src/test/java/com/maxmind/minfraud/response/ShippingAddressTest.java b/src/test/java/com/maxmind/minfraud/response/ShippingAddressTest.java index a3892959..1f0f66d7 100644 --- a/src/test/java/com/maxmind/minfraud/response/ShippingAddressTest.java +++ b/src/test/java/com/maxmind/minfraud/response/ShippingAddressTest.java @@ -2,11 +2,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.jr.ob.JSON; import org.junit.jupiter.api.Test; -public class ShippingAddressTest extends AbstractAddressTest { +public class ShippingAddressTest extends AbstractOutputTest { + private static final double DELTA = 1e-15; @Test public void testShippingAddress() throws Exception { @@ -26,12 +28,30 @@ public void testShippingAddress() throws Exception { .finish() ); - this.testAddress(address); + assertTrue(address.isInIpCountry(), "correct isInIpCountry"); + assertTrue(address.isPostalInCity(), "correct isPostalInCity"); + assertEquals( + 100, + address.distanceToIpLocation().longValue(), + "correct distanceToIpLocation" + ); + assertEquals( + 32.1, + address.longitude(), + DELTA, + "correct longitude" + ); + assertEquals( + 43.1, + address.latitude(), + DELTA, + "correct latitude" + ); assertFalse(address.isHighRisk(), "is high risk"); assertEquals( Integer.valueOf(200), - address.getDistanceToBillingAddress(), + address.distanceToBillingAddress(), "distance to billing address" ); } diff --git a/src/test/java/com/maxmind/minfraud/response/WarningTest.java b/src/test/java/com/maxmind/minfraud/response/WarningTest.java index b9122a44..03f7ff4a 100644 --- a/src/test/java/com/maxmind/minfraud/response/WarningTest.java +++ b/src/test/java/com/maxmind/minfraud/response/WarningTest.java @@ -25,9 +25,9 @@ public void testWarning() throws Exception { .finish() ); - assertEquals(code, warning.getCode(), "code"); - assertEquals(msg, warning.getWarning(), "warning message"); - assertEquals(pointer, warning.getInputPointer(), "input_pointer"); + assertEquals(code, warning.code(), "code"); + assertEquals(msg, warning.warning(), "warning message"); + assertEquals(pointer, warning.inputPointer(), "input_pointer"); } } diff --git a/src/test/resources/test-data/factors-response.json b/src/test/resources/test-data/factors-response.json index 7345b57a..c0fa536a 100644 --- a/src/test/resources/test-data/factors-response.json +++ b/src/test/resources/test-data/factors-response.json @@ -80,6 +80,22 @@ "zh-CN": "\u82f1\u56fd" } }, + "represented_country": { + "geoname_id": 6252001, + "is_in_european_union": false, + "iso_code": "US", + "names": { + "de": "Vereinigte Staaten", + "en": "United States", + "es": "Estados Unidos", + "fr": "\u00c9tats-Unis", + "ja": "\u30a2\u30e1\u30ea\u30ab\u5408\u8846\u56fd", + "pt-BR": "Estados Unidos", + "ru": "\u0421\u0428\u0410", + "zh-CN": "\u7f8e\u56fd" + }, + "type": "military" + }, "subdivisions": [ { "confidence": 42, @@ -101,7 +117,6 @@ "is_anonymous_vpn": true, "is_hosting_provider": true, "is_public_proxy": true, - "is_satellite_provider": true, "is_tor_exit_node": true, "isp": "Andrews & Arnold Ltd", "mobile_country_code": "310", diff --git a/src/test/resources/test-data/insights-response.json b/src/test/resources/test-data/insights-response.json index 0302c7bc..14de174a 100644 --- a/src/test/resources/test-data/insights-response.json +++ b/src/test/resources/test-data/insights-response.json @@ -115,7 +115,6 @@ "is_anonymous_vpn": true, "is_hosting_provider": true, "is_public_proxy": true, - "is_satellite_provider": true, "is_tor_exit_node": true, "isp": "Andrews & Arnold Ltd", "mobile_country_code": "310",