diff --git a/README.md b/README.md index 2fdb485..08c8f8b 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ And then download the artifact incognia-api-client com.incognia incognia-api-client - 2.6.2 + 2.7.0 ``` @@ -39,7 +39,7 @@ repositories { And then add the dependency ```gradle dependencies { - implementation 'com.incognia:incognia-api-client:2.6.2' + implementation 'com.incognia:incognia-api-client:2.7.0' } ``` We support Java 8+. @@ -102,6 +102,22 @@ try { } ``` +It's also possible to register a signup without an address: + +```java +IncogniaAPI api = new IncogniaAPI("client-id", "client-secret"); +try { + RegisterSignupRequest signupRequest = RegisterSignupRequest.builder() + .installationId("installation id") + .build(); + SignupAssessment assessment = api.registerSignup(signupRequest); +} catch (IncogniaAPIException e) { + //Some api error happened (invalid data, invalid credentials) +} catch (IncogniaException e) { + //Something unexpected happened +} +``` + #### Getting a Signup This method allows you to query the latest assessment for a given signup event, returning a `SignupAssessment`, containing the risk assessment and supporting evidence: diff --git a/build.gradle b/build.gradle index 6fc5808..7e9d404 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ plugins { } group = "com.incognia" -version = "2.6.2" +version = "2.7.0" task createProjectVersionFile { def projectVersionDir = "$projectDir/src/main/java/com/incognia/api" diff --git a/src/main/java/com/incognia/api/IncogniaAPI.java b/src/main/java/com/incognia/api/IncogniaAPI.java index 6357cd6..731cd8c 100644 --- a/src/main/java/com/incognia/api/IncogniaAPI.java +++ b/src/main/java/com/incognia/api/IncogniaAPI.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; import okhttp3.OkHttpClient; @@ -106,13 +107,13 @@ public IncogniaAPI(String clientId, String clientSecret) { public SignupAssessment registerSignup(RegisterSignupRequest request) throws IncogniaException { Asserts.assertNotNull(request, "register signup request"); Asserts.assertNotEmpty(request.getInstallationId(), "installation id"); - Asserts.assertNotNull(request.getAddress(), "address"); + Optional
address = Optional.ofNullable(request.getAddress()); PostSignupRequestBody postSignupRequestBody = PostSignupRequestBody.builder() .installationId(request.getInstallationId()) - .addressLine(request.getAddress().getAddressLine()) - .structuredAddress(request.getAddress().getStructuredAddress()) - .addressCoordinates(request.getAddress().getCoordinates()) + .addressLine(address.map(Address::getAddressLine).orElse(null)) + .structuredAddress(address.map(Address::getStructuredAddress).orElse(null)) + .addressCoordinates(address.map(Address::getCoordinates).orElse(null)) .externalId(request.getExternalId()) .policyId(request.getPolicyId()) .accountId(request.getAccountId()) diff --git a/src/main/java/com/incognia/onboarding/RegisterSignupRequest.java b/src/main/java/com/incognia/onboarding/RegisterSignupRequest.java index f9b11f9..8ed2487 100644 --- a/src/main/java/com/incognia/onboarding/RegisterSignupRequest.java +++ b/src/main/java/com/incognia/onboarding/RegisterSignupRequest.java @@ -5,12 +5,13 @@ import java.util.List; import lombok.Builder; import lombok.Value; +import org.jetbrains.annotations.Nullable; @Value @Builder public class RegisterSignupRequest { String installationId; - Address address; + @Nullable Address address; String externalId; String policyId; String accountId; diff --git a/src/test/java/com/incognia/api/IncogniaAPITest.java b/src/test/java/com/incognia/api/IncogniaAPITest.java index ddab79e..029d6d8 100644 --- a/src/test/java/com/incognia/api/IncogniaAPITest.java +++ b/src/test/java/com/incognia/api/IncogniaAPITest.java @@ -127,6 +127,62 @@ void testRegisterSignup_whenDataIsValid() { assertThat(signupAssessment.getReasons()).containsExactly(expectedReason); } + @Test + @DisplayName("should return the expected signup response when the address is empty") + @SneakyThrows + void testRegisterSignup_withEmptyAddress() { + String token = TokenCreationFixture.createToken(); + String installationId = "installation-id"; + String accountId = "my-account"; + String policyId = UUID.randomUUID().toString(); + String externalId = "external-id"; + + TokenAwareDispatcher dispatcher = new TokenAwareDispatcher(token, CLIENT_ID, CLIENT_SECRET); + dispatcher.setExpectedAddressLine(null); + dispatcher.setExpectedInstallationId(installationId); + dispatcher.setExpectedExternalId(externalId); + dispatcher.setExpectedPolicyId(policyId); + dispatcher.setExpectedAccountId(accountId); + mockServer.setDispatcher(dispatcher); + RegisterSignupRequest registerSignupRequest = + RegisterSignupRequest.builder() + .installationId(installationId) + .accountId(accountId) + .policyId(policyId) + .externalId(externalId) + .build(); + SignupAssessment signupAssessment = client.registerSignup(registerSignupRequest); + assertThat(signupAssessment) + .extracting("id", "requestId", "riskAssessment", "deviceId") + .containsExactly( + UUID.fromString("5e76a7ca-577c-4f47-a752-9e1e0cee9e49"), + UUID.fromString("8afc84a7-f1d4-488d-bd69-36d9a37168b7"), + Assessment.HIGH_RISK, + "1df6d999-556d-42c3-8c63-357e5d08d95b"); + Map locationServices = new HashMap<>(); + locationServices.put("location_permission_enabled", true); + locationServices.put("location_sensors_enabled", true); + Map deviceIntegrity = new HashMap<>(); + deviceIntegrity.put("probable_root", true); + deviceIntegrity.put("emulator", false); + deviceIntegrity.put("gps_spoofing", false); + deviceIntegrity.put("from_official_store", true); + + Map expectedEvidence = new HashMap<>(); + expectedEvidence.put("device_model", "Moto Z2 Play"); + expectedEvidence.put("location_services", locationServices); + expectedEvidence.put("device_integrity", deviceIntegrity); + + assertThat(signupAssessment.getEvidence()).containsExactlyInAnyOrderEntriesOf(expectedEvidence); + + Reason expectedReason = + Reason.builder() + .code(ReasonCode.DEVICE_INTEGRITY.getCode()) + .source(ReasonSource.LOCAL.getSource()) + .build(); + assertThat(signupAssessment.getReasons()).containsExactly(expectedReason); + } + @Test @DisplayName("should return the expected web signup response") @SneakyThrows diff --git a/src/test/java/com/incognia/api/clients/TokenAwareDispatcher.java b/src/test/java/com/incognia/api/clients/TokenAwareDispatcher.java index 0b0a5bd..d87359b 100644 --- a/src/test/java/com/incognia/api/clients/TokenAwareDispatcher.java +++ b/src/test/java/com/incognia/api/clients/TokenAwareDispatcher.java @@ -149,7 +149,12 @@ private MockResponse handlePostSignup(@NotNull RecordedRequest request) assertThat(postSignupRequestBody.getExternalId()).isEqualTo(expectedExternalId); assertThat(postSignupRequestBody.getPolicyId()).isEqualTo(expectedPolicyId); assertThat(postSignupRequestBody.getAddressLine()).isEqualTo(expectedAddressLine); - String response = ResourceUtils.getResourceFileAsString("post_onboarding_response.json"); + String response = + ResourceUtils.getResourceFileAsString( + postSignupRequestBody.getAddressLine() != null + || postSignupRequestBody.getSessionToken() != null + ? "post_onboarding_response.json" + : "post_onboarding_response_no_address.json"); return new MockResponse().setResponseCode(200).setBody(response); } diff --git a/src/test/resources/post_onboarding_response_no_address.json b/src/test/resources/post_onboarding_response_no_address.json new file mode 100644 index 0000000..1d11e47 --- /dev/null +++ b/src/test/resources/post_onboarding_response_no_address.json @@ -0,0 +1,25 @@ +{ + "id": "5e76a7ca-577c-4f47-a752-9e1e0cee9e49", + "request_id": "8afc84a7-f1d4-488d-bd69-36d9a37168b7", + "risk_assessment": "high_risk", + "device_id": "1df6d999-556d-42c3-8c63-357e5d08d95b", + "reasons": [ + { + "code": "device_integrity", + "source": "local" + } + ], + "evidence": { + "device_model": "Moto Z2 Play", + "location_services": { + "location_permission_enabled": true, + "location_sensors_enabled": true + }, + "device_integrity": { + "probable_root": true, + "emulator": false, + "gps_spoofing": false, + "from_official_store": true + } + } +} \ No newline at end of file