diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b841eda..d1640abd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## [5.47.0](https://github.com/plivo/plivo-java/tree/v5.47.0) (2026-04-08) +**Feature - PhoneNumber Compliance API support** +- Added `PhoneNumberComplianceRequirement` resource with `lister()` for discovering compliance requirements by country, number type, and user type +- Added `PhoneNumberCompliance` resource with `creator()`, `getter()`, `lister()`, `updater()`, `deleter()` for compliance applications +- Added `PhoneNumberComplianceLinkCreator` for bulk linking phone numbers to accepted compliance applications +- Added PATCH support via Retrofit `@HTTP` annotation for compliance application updates +- Added `compliances` field to `ListResponse` for non-standard list response key +- Create and update operations support multipart file uploads for compliance documents + ## [5.46.7](https://github.com/plivo/plivo-java/tree/v5.46.7) (2026-03-18) **Feature - Profile Update API additional fields support** - Added `ein`, `einIssuingCountry`, `altBusinessId`, `altBusinessIdType` parameters to Profile `update` method diff --git a/pom.xml b/pom.xml index 8bf119d6..787d4f56 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.plivo plivo-java - 5.46.7 + 5.47.0 plivo-java A Java SDK to make voice calls & send SMS using Plivo and to generate Plivo XML diff --git a/src/main/java/com/plivo/api/PlivoAPIService.java b/src/main/java/com/plivo/api/PlivoAPIService.java index 69fa15de..e1dce3be 100644 --- a/src/main/java/com/plivo/api/PlivoAPIService.java +++ b/src/main/java/com/plivo/api/PlivoAPIService.java @@ -27,6 +27,7 @@ import com.plivo.api.models.node.MultiPartyCall; import com.plivo.api.models.number.*; import com.plivo.api.models.number.Number; +import com.plivo.api.models.phonenumbercompliance.*; import com.plivo.api.models.phlo.Phlo; import com.plivo.api.models.phlo.PhloRunGetterResponse; import com.plivo.api.models.phlo.PhloUpdateResponse; @@ -827,4 +828,41 @@ Call> tollfreeVerificationList(@Path("authId" // Delete @DELETE("Account/{authId}/TollfreeVerification/{uuid}/") Call tollfreeVerificationDelete(@Path("authId") String authId, @Path("uuid") String uuid); + + // PhoneNumber Compliance Requirements + @GET("Account/{authId}/PhoneNumber/Compliance/Requirements/") + Call phoneNumberComplianceRequirementList(@Path("authId") String authId, + @QueryMap Map params); + + // PhoneNumber Compliance Create (multipart) + @POST("Account/{authId}/PhoneNumber/Compliance/") + Call phoneNumberComplianceCreate(@Path("authId") String authId, + @Body RequestBody body); + + // PhoneNumber Compliance List + @GET("Account/{authId}/PhoneNumber/Compliance/") + Call> phoneNumberComplianceList(@Path("authId") String authId, + @QueryMap Map params); + + // PhoneNumber Compliance Get + @GET("Account/{authId}/PhoneNumber/Compliance/{complianceId}/") + Call phoneNumberComplianceGet(@Path("authId") String authId, + @Path("complianceId") String complianceId, + @QueryMap Map params); + + // PhoneNumber Compliance Update (PATCH, multipart) + @HTTP(method = "PATCH", path = "Account/{authId}/PhoneNumber/Compliance/{complianceId}/", hasBody = true) + Call phoneNumberComplianceUpdate(@Path("authId") String authId, + @Path("complianceId") String complianceId, + @Body RequestBody body); + + // PhoneNumber Compliance Delete + @DELETE("Account/{authId}/PhoneNumber/Compliance/{complianceId}/") + Call phoneNumberComplianceDelete(@Path("authId") String authId, + @Path("complianceId") String complianceId); + + // PhoneNumber Compliance Link + @POST("Account/{authId}/PhoneNumber/Compliance/Link/") + Call phoneNumberComplianceLinkCreate(@Path("authId") String authId, + @Body PhoneNumberComplianceLinkCreator body); } diff --git a/src/main/java/com/plivo/api/models/base/ListResponse.java b/src/main/java/com/plivo/api/models/base/ListResponse.java index 3233c3c5..d068e6db 100644 --- a/src/main/java/com/plivo/api/models/base/ListResponse.java +++ b/src/main/java/com/plivo/api/models/base/ListResponse.java @@ -47,6 +47,13 @@ public List getCampaigns() { public List getSessions() { return sessions; } + + private List compliances; + + public List getCompliances() { + return compliances; + } + public Response getResponse() { return response; } diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberCompliance.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberCompliance.java new file mode 100644 index 00000000..c3df1e7e --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberCompliance.java @@ -0,0 +1,104 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.BaseResource; + +import java.util.List; + +public class PhoneNumberCompliance extends BaseResource { + + private String complianceId; + private String status; + private String alias; + private String countryIso; + private String numberType; + private String userType; + private String callbackUrl; + private String callbackMethod; + private String rejectionReason; + private String createdAt; + private String updatedAt; + private Object endUser; + private List documents; + private List linkedNumbers; + + public static PhoneNumberComplianceCreator creator(String dataJson) { + return new PhoneNumberComplianceCreator(dataJson); + } + + public static PhoneNumberComplianceGetter getter(String id) { + return new PhoneNumberComplianceGetter(id); + } + + public static PhoneNumberComplianceLister lister() { + return new PhoneNumberComplianceLister(); + } + + public static PhoneNumberComplianceUpdater updater(String id) { + return new PhoneNumberComplianceUpdater(id); + } + + public static PhoneNumberComplianceDeleter deleter(String id) { + return new PhoneNumberComplianceDeleter(id); + } + + @Override + public String getId() { + return complianceId; + } + + public String getComplianceId() { + return complianceId; + } + + public String getStatus() { + return status; + } + + public String getAlias() { + return alias; + } + + public String getCountryIso() { + return countryIso; + } + + public String getNumberType() { + return numberType; + } + + public String getUserType() { + return userType; + } + + public String getCallbackUrl() { + return callbackUrl; + } + + public String getCallbackMethod() { + return callbackMethod; + } + + public String getRejectionReason() { + return rejectionReason; + } + + public String getCreatedAt() { + return createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public Object getEndUser() { + return endUser; + } + + public List getDocuments() { + return documents; + } + + public List getLinkedNumbers() { + return linkedNumbers; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceCreateResponse.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceCreateResponse.java new file mode 100644 index 00000000..9cd5bc1e --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceCreateResponse.java @@ -0,0 +1,12 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.BaseResponse; + +public class PhoneNumberComplianceCreateResponse extends BaseResponse { + + private String complianceId; + + public String getComplianceId() { + return complianceId; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceCreator.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceCreator.java new file mode 100644 index 00000000..41228603 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceCreator.java @@ -0,0 +1,52 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.exceptions.ResourceNotFoundException; +import com.plivo.api.models.base.Creator; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import retrofit2.Call; + +import javax.activation.MimetypesFileTypeMap; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class PhoneNumberComplianceCreator extends Creator { + + private MultipartBody.Builder body; + + PhoneNumberComplianceCreator(String dataJson) { + this.body = new MultipartBody.Builder().setType(MultipartBody.FORM); + this.body.addFormDataPart("data", dataJson); + } + + public PhoneNumberComplianceCreator addDocument(int index, String filePath) throws ResourceNotFoundException { + File file = new File(filePath); + if (!file.exists()) { + throw new ResourceNotFoundException("File missing " + filePath); + } + try { + String contentType = ""; + if (Files.probeContentType(file.toPath()) != null) { + contentType = Files.probeContentType(file.toPath()); + } else { + Path source = Paths.get(filePath); + MimetypesFileTypeMap m = new MimetypesFileTypeMap(source.toString()); + contentType = m.getContentType(file); + } + this.body.addFormDataPart("documents[" + index + "].file", file.getName(), + RequestBody.create(MediaType.parse(contentType), file)); + } catch (IOException e) { + throw new ResourceNotFoundException("Unable to read file " + filePath); + } + return this; + } + + @Override + protected Call obtainCall() { + return client().getApiService().phoneNumberComplianceCreate(client().getAuthId(), this.body.build()); + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceDeleter.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceDeleter.java new file mode 100644 index 00000000..1459390c --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceDeleter.java @@ -0,0 +1,17 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.Deleter; +import okhttp3.ResponseBody; +import retrofit2.Call; + +public class PhoneNumberComplianceDeleter extends Deleter { + + public PhoneNumberComplianceDeleter(String id) { + super(id); + } + + @Override + protected Call obtainCall() { + return client().getApiService().phoneNumberComplianceDelete(client().getAuthId(), id); + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceGetResponse.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceGetResponse.java new file mode 100644 index 00000000..460f6522 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceGetResponse.java @@ -0,0 +1,17 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.BaseResource; + +public class PhoneNumberComplianceGetResponse extends BaseResource { + + private PhoneNumberCompliance compliance; + + public PhoneNumberCompliance getCompliance() { + return compliance; + } + + @Override + public String getId() { + return compliance != null ? compliance.getId() : null; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceGetter.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceGetter.java new file mode 100644 index 00000000..5c3ec262 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceGetter.java @@ -0,0 +1,27 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.Getter; +import retrofit2.Call; + +public class PhoneNumberComplianceGetter extends Getter { + + private String expand; + + public PhoneNumberComplianceGetter(String id) { + super(id); + } + + public String expand() { + return this.expand; + } + + public PhoneNumberComplianceGetter expand(String expand) { + this.expand = expand; + return this; + } + + @Override + protected Call obtainCall() { + return client().getApiService().phoneNumberComplianceGet(client().getAuthId(), id, toMap()); + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkCreator.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkCreator.java new file mode 100644 index 00000000..3cef796d --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkCreator.java @@ -0,0 +1,25 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.Creator; +import retrofit2.Call; + +import java.util.List; + +public class PhoneNumberComplianceLinkCreator extends Creator { + + private List numbers; + + public List getNumbers() { + return numbers; + } + + public PhoneNumberComplianceLinkCreator numbers(List numbers) { + this.numbers = numbers; + return this; + } + + @Override + protected Call obtainCall() { + return client().getApiService().phoneNumberComplianceLinkCreate(client().getAuthId(), this); + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkNumber.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkNumber.java new file mode 100644 index 00000000..a75bd8f2 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkNumber.java @@ -0,0 +1,23 @@ +package com.plivo.api.models.phonenumbercompliance; + +public class PhoneNumberComplianceLinkNumber { + + private String number; + private String complianceApplicationId; + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getComplianceApplicationId() { + return complianceApplicationId; + } + + public void setComplianceApplicationId(String complianceApplicationId) { + this.complianceApplicationId = complianceApplicationId; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkResponse.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkResponse.java new file mode 100644 index 00000000..dccc0171 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLinkResponse.java @@ -0,0 +1,24 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.BaseResponse; + +import java.util.List; + +public class PhoneNumberComplianceLinkResponse extends BaseResponse { + + private Integer totalCount; + private Integer updatedCount; + private List report; + + public Integer getTotalCount() { + return totalCount; + } + + public Integer getUpdatedCount() { + return updatedCount; + } + + public List getReport() { + return report; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLister.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLister.java new file mode 100644 index 00000000..b5466c38 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceLister.java @@ -0,0 +1,74 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.ListResponse; +import com.plivo.api.models.base.Lister; +import retrofit2.Call; + +public class PhoneNumberComplianceLister extends Lister { + + private String status; + private String countryIso; + private String numberType; + private String userType; + private String alias; + private String expand; + + public String status() { + return this.status; + } + + public PhoneNumberComplianceLister status(String status) { + this.status = status; + return this; + } + + public String countryIso() { + return this.countryIso; + } + + public PhoneNumberComplianceLister countryIso(String countryIso) { + this.countryIso = countryIso; + return this; + } + + public String numberType() { + return this.numberType; + } + + public PhoneNumberComplianceLister numberType(String numberType) { + this.numberType = numberType; + return this; + } + + public String userType() { + return this.userType; + } + + public PhoneNumberComplianceLister userType(String userType) { + this.userType = userType; + return this; + } + + public String alias() { + return this.alias; + } + + public PhoneNumberComplianceLister alias(String alias) { + this.alias = alias; + return this; + } + + public String expand() { + return this.expand; + } + + public PhoneNumberComplianceLister expand(String expand) { + this.expand = expand; + return this; + } + + @Override + protected Call> obtainCall() { + return client().getApiService().phoneNumberComplianceList(client().getAuthId(), toMap()); + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceRequirement.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceRequirement.java new file mode 100644 index 00000000..e4986089 --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceRequirement.java @@ -0,0 +1,43 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.BaseResource; + +import java.util.List; + +public class PhoneNumberComplianceRequirement extends BaseResource { + + private String requirementId; + private String countryIso; + private String numberType; + private String userType; + private List documentTypes; + + public static PhoneNumberComplianceRequirementLister lister() { + return new PhoneNumberComplianceRequirementLister(); + } + + @Override + public String getId() { + return requirementId; + } + + public String getRequirementId() { + return requirementId; + } + + public String getCountryIso() { + return countryIso; + } + + public String getNumberType() { + return numberType; + } + + public String getUserType() { + return userType; + } + + public List getDocumentTypes() { + return documentTypes; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceRequirementLister.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceRequirementLister.java new file mode 100644 index 00000000..f7026d6d --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceRequirementLister.java @@ -0,0 +1,55 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.PlivoClient; +import com.plivo.api.exceptions.PlivoRestException; +import com.plivo.api.exceptions.PlivoValidationException; +import com.plivo.api.models.base.BaseRequest; +import com.plivo.api.util.Utils; +import java.io.IOException; +import java.util.Map; +import retrofit2.Call; +import retrofit2.Response; + +public class PhoneNumberComplianceRequirementLister extends BaseRequest { + + private String countryIso; + private String numberType; + private String userType; + + public PhoneNumberComplianceRequirementLister countryIso(String countryIso) { + this.countryIso = countryIso; + return this; + } + + public PhoneNumberComplianceRequirementLister numberType(String numberType) { + this.numberType = numberType; + return this; + } + + public PhoneNumberComplianceRequirementLister userType(String userType) { + this.userType = userType; + return this; + } + + @Override + public PhoneNumberComplianceRequirementLister client(final PlivoClient plivoClient) { + this.plivoClient = plivoClient; + return this; + } + + private Map toMap() { + client(); + return Utils.objectToMap(PlivoClient.getObjectMapper(), this); + } + + protected Call obtainCall() { + return client().getApiService().phoneNumberComplianceRequirementList(client().getAuthId(), toMap()); + } + + public PhoneNumberComplianceRequirement list() throws IOException, PlivoRestException, PlivoValidationException { + validate(); + Response response = obtainCall().execute(); + handleResponse(response); + return response.body(); + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceUpdateResponse.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceUpdateResponse.java new file mode 100644 index 00000000..235e3d9c --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceUpdateResponse.java @@ -0,0 +1,12 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.models.base.BaseResponse; + +public class PhoneNumberComplianceUpdateResponse extends BaseResponse { + + private String complianceId; + + public String getComplianceId() { + return complianceId; + } +} diff --git a/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceUpdater.java b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceUpdater.java new file mode 100644 index 00000000..13b862fb --- /dev/null +++ b/src/main/java/com/plivo/api/models/phonenumbercompliance/PhoneNumberComplianceUpdater.java @@ -0,0 +1,57 @@ +package com.plivo.api.models.phonenumbercompliance; + +import com.plivo.api.exceptions.ResourceNotFoundException; +import com.plivo.api.models.base.Updater; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import retrofit2.Call; + +import javax.activation.MimetypesFileTypeMap; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class PhoneNumberComplianceUpdater extends Updater { + + private MultipartBody.Builder body; + + public PhoneNumberComplianceUpdater(String id) { + super(id); + this.body = new MultipartBody.Builder().setType(MultipartBody.FORM); + } + + public PhoneNumberComplianceUpdater setData(String dataJson) { + this.body.addFormDataPart("data", dataJson); + return this; + } + + public PhoneNumberComplianceUpdater addDocument(int index, String filePath) throws ResourceNotFoundException { + File file = new File(filePath); + if (!file.exists()) { + throw new ResourceNotFoundException("File missing " + filePath); + } + try { + String contentType = ""; + if (Files.probeContentType(file.toPath()) != null) { + contentType = Files.probeContentType(file.toPath()); + } else { + Path source = Paths.get(filePath); + MimetypesFileTypeMap m = new MimetypesFileTypeMap(source.toString()); + contentType = m.getContentType(file); + } + this.body.addFormDataPart("documents[" + index + "].file", file.getName(), + RequestBody.create(MediaType.parse(contentType), file)); + } catch (IOException e) { + throw new ResourceNotFoundException("Unable to read file " + filePath); + } + return this; + } + + @Override + protected Call obtainCall() { + return client().getApiService().phoneNumberComplianceUpdate(client().getAuthId(), id, this.body.build()); + } +} diff --git a/src/test/java/com/plivo/api/PhoneNumberComplianceTest.java b/src/test/java/com/plivo/api/PhoneNumberComplianceTest.java new file mode 100644 index 00000000..3c674afb --- /dev/null +++ b/src/test/java/com/plivo/api/PhoneNumberComplianceTest.java @@ -0,0 +1,537 @@ +package com.plivo.api; + +import static com.plivo.api.TestUtil.loadFixture; +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNotNull; +import static junit.framework.TestCase.assertNull; +import static junit.framework.TestCase.assertTrue; + +import com.plivo.api.exceptions.ResourceNotFoundException; +import com.plivo.api.models.base.ListResponse; +import com.plivo.api.models.phonenumbercompliance.*; +import com.squareup.okhttp.mockwebserver.MockResponse; +import com.squareup.okhttp.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class PhoneNumberComplianceTest extends BaseTest { + + private PlivoClient client; + + @Before + public void setUp() throws Exception { + super.setUp(); + client = new PlivoClient("MA123456789012345678", + "Zmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + } + + // ========================================================================= + // Test 1: RequirementLister - success, verify fields + // ========================================================================= + @Test + public void requirementListerShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceRequirementListResponse.json", 200); + + PhoneNumberComplianceRequirement req = PhoneNumberComplianceRequirement.lister() + .countryIso("IN") + .numberType("local") + .userType("business") + .list(); + + assertNotNull(req); + assertEquals("IN", req.getCountryIso()); + assertEquals("local", req.getNumberType()); + assertEquals("business", req.getUserType()); + assertNotNull(req.getDocumentTypes()); + assertEquals(2, req.getDocumentTypes().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertTrue(recordedRequest.getPath().contains("PhoneNumber/Compliance/Requirements/")); + } + + // ========================================================================= + // Test 2: RequirementLister - empty document_types + // ========================================================================= + @Test + public void requirementListerEmptyDocumentTypesShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceRequirementEmptyResponse.json", 200); + + PhoneNumberComplianceRequirement req = PhoneNumberComplianceRequirement.lister() + .countryIso("ZZ") + .numberType("local") + .userType("business") + .list(); + + assertNotNull(req); + assertEquals("ZZ", req.getCountryIso()); + assertNotNull(req.getDocumentTypes()); + assertEquals(0, req.getDocumentTypes().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + } + + // ========================================================================= + // Test 3: Creator - success with compliance_id + // ========================================================================= + @Test + public void createShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceCreateResponse.json", 201); + + String dataJson = "{\"country_iso\":\"IN\",\"number_type\":\"local\",\"user_type\":\"business\"}"; + PhoneNumberComplianceCreator creator = PhoneNumberCompliance.creator(dataJson); + PhoneNumberComplianceCreateResponse resp = creator.create(); + + assertNotNull(resp); + assertEquals("comp-uuid-12345678", resp.getComplianceId()); + assertEquals("Compliance application created successfully", resp.getMessage()); + assertNotNull(resp.getApiId()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + assertTrue(recordedRequest.getPath().contains("PhoneNumber/Compliance/")); + } + + // ========================================================================= + // Test 4: Creator - verify multipart body construction + // ========================================================================= + @Test + public void createShouldSendMultipartBody() throws Exception { + expectResponse("phoneNumberComplianceCreateResponse.json", 201); + + String dataJson = "{\"country_iso\":\"IN\",\"number_type\":\"local\"}"; + PhoneNumberComplianceCreator creator = PhoneNumberCompliance.creator(dataJson); + PhoneNumberComplianceCreateResponse resp = creator.create(); + + assertNotNull(resp); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + String contentType = recordedRequest.getHeader("Content-Type"); + assertNotNull(contentType); + assertTrue(contentType.contains("multipart/form-data")); + // Verify the body contains the data part + String body = recordedRequest.getBody().readUtf8(); + assertTrue(body.contains("data")); + assertTrue(body.contains("country_iso")); + } + + // ========================================================================= + // Test 5: Lister - success with compliances + // ========================================================================= + @Test + public void listShouldSucceed() throws Exception { + String fixtureName = "phoneNumberComplianceListResponse.json"; + + server.enqueue(new MockResponse() + .setResponseCode(200) + .setBody(loadFixture(fixtureName)) + ); + + ListResponse resp = PhoneNumberCompliance.lister().list(); + + assertNotNull(resp); + assertNotNull(resp.getCompliances()); + assertEquals(2, resp.getCompliances().size()); + assertNotNull(resp.getMeta()); + + PhoneNumberCompliance first = resp.getCompliances().get(0); + assertEquals("comp-uuid-11111111", first.getComplianceId()); + assertEquals("submitted", first.getStatus()); + assertEquals("IN", first.getCountryIso()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertEquals(String.format("/Account/%s/PhoneNumber/Compliance/", authId), + recordedRequest.getPath()); + } + + // ========================================================================= + // Test 6: Lister - with filters (status, countryIso, etc.) + // ========================================================================= + @Test + public void listWithFiltersShouldSucceed() throws Exception { + String fixtureName = "phoneNumberComplianceListResponse.json"; + + server.enqueue(new MockResponse() + .setResponseCode(200) + .setBody(loadFixture(fixtureName)) + ); + + ListResponse resp = PhoneNumberCompliance.lister() + .status("submitted") + .countryIso("IN") + .numberType("local") + .userType("business") + .list(); + + assertNotNull(resp); + assertNotNull(resp.getCompliances()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + String path = recordedRequest.getPath(); + assertTrue(path.contains("PhoneNumber/Compliance/")); + assertTrue(path.contains("status=submitted")); + assertTrue(path.contains("country_iso=IN")); + } + + // ========================================================================= + // Test 7: Lister - empty results + // ========================================================================= + @Test + public void listEmptyResultsShouldSucceed() throws Exception { + String fixtureName = "phoneNumberComplianceListEmptyResponse.json"; + + server.enqueue(new MockResponse() + .setResponseCode(200) + .setBody(loadFixture(fixtureName)) + ); + + ListResponse resp = PhoneNumberCompliance.lister().list(); + + assertNotNull(resp); + assertNotNull(resp.getCompliances()); + assertEquals(0, resp.getCompliances().size()); + assertNotNull(resp.getMeta()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + } + + // ========================================================================= + // Test 8: Getter - success with compliance wrapper + // ========================================================================= + @Test + public void getShouldSucceed() throws Exception { + String complianceId = "comp-uuid-12345678"; + expectResponse("phoneNumberComplianceGetResponse.json", 200); + + PhoneNumberComplianceGetResponse resp = PhoneNumberCompliance.getter(complianceId).get(); + + assertNotNull(resp); + assertNotNull(resp.getCompliance()); + assertEquals("comp-uuid-12345678", resp.getCompliance().getComplianceId()); + assertEquals("submitted", resp.getCompliance().getStatus()); + assertEquals("IN", resp.getCompliance().getCountryIso()); + assertEquals("test-compliance-app", resp.getCompliance().getAlias()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertTrue(recordedRequest.getPath().contains( + String.format("PhoneNumber/Compliance/%s/", complianceId))); + } + + // ========================================================================= + // Test 9: Getter - with expand + // ========================================================================= + @Test + public void getWithExpandShouldSucceed() throws Exception { + String complianceId = "comp-uuid-12345678"; + expectResponse("phoneNumberComplianceGetExpandedResponse.json", 200); + + PhoneNumberComplianceGetResponse resp = PhoneNumberCompliance.getter(complianceId) + .expand("end_user,documents") + .get(); + + assertNotNull(resp); + assertNotNull(resp.getCompliance()); + PhoneNumberCompliance compliance = resp.getCompliance(); + assertEquals("comp-uuid-12345678", compliance.getComplianceId()); + assertEquals("approved", compliance.getStatus()); + assertNotNull(compliance.getEndUser()); + assertNotNull(compliance.getDocuments()); + assertEquals(1, compliance.getDocuments().size()); + assertNotNull(compliance.getLinkedNumbers()); + assertEquals(1, compliance.getLinkedNumbers().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + String path = recordedRequest.getPath(); + assertTrue(path.contains("expand=end_user") || path.contains("expand=end_user%2Cdocuments")); + } + + // ========================================================================= + // Test 10: Getter - all optional fields (rejection_reason, end_user, documents, linked_numbers) + // ========================================================================= + @Test + public void getWithAllOptionalFieldsShouldSucceed() throws Exception { + String complianceId = "comp-uuid-99999999"; + expectResponse("phoneNumberComplianceGetAllFieldsResponse.json", 200); + + PhoneNumberComplianceGetResponse resp = PhoneNumberCompliance.getter(complianceId).get(); + + assertNotNull(resp); + assertNotNull(resp.getCompliance()); + PhoneNumberCompliance compliance = resp.getCompliance(); + assertEquals("comp-uuid-99999999", compliance.getComplianceId()); + assertEquals("rejected", compliance.getStatus()); + assertEquals("rejected-compliance-app", compliance.getAlias()); + assertEquals("DE", compliance.getCountryIso()); + assertEquals("local", compliance.getNumberType()); + assertEquals("individual", compliance.getUserType()); + assertEquals("Document is expired. Please provide a valid document.", compliance.getRejectionReason()); + assertNotNull(compliance.getEndUser()); + assertNotNull(compliance.getDocuments()); + assertEquals(2, compliance.getDocuments().size()); + assertNotNull(compliance.getLinkedNumbers()); + assertEquals(2, compliance.getLinkedNumbers().size()); + assertNotNull(compliance.getCreatedAt()); + assertNotNull(compliance.getUpdatedAt()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + } + + // ========================================================================= + // Test 11: Updater - success + // ========================================================================= + @Test + public void updateShouldSucceed() throws Exception { + String complianceId = "comp-uuid-12345678"; + expectResponse("phoneNumberComplianceUpdateResponse.json", 200); + + PhoneNumberComplianceUpdater updater = PhoneNumberCompliance.updater(complianceId); + updater.setData("{\"alias\":\"updated-alias\"}"); + PhoneNumberComplianceUpdateResponse resp = updater.update(); + + assertNotNull(resp); + assertEquals("comp-uuid-12345678", resp.getComplianceId()); + assertEquals("Compliance application updated successfully", resp.getMessage()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("PATCH", recordedRequest.getMethod()); + assertTrue(recordedRequest.getPath().contains( + String.format("PhoneNumber/Compliance/%s/", complianceId))); + } + + // ========================================================================= + // Test 12: Updater - verify PATCH method and multipart + // ========================================================================= + @Test + public void updateShouldUsePatchMethod() throws Exception { + String complianceId = "comp-uuid-12345678"; + expectResponse("phoneNumberComplianceUpdateResponse.json", 200); + + PhoneNumberComplianceUpdater updater = PhoneNumberCompliance.updater(complianceId); + updater.setData("{\"callback_url\":\"https://example.com/new-callback\"}"); + PhoneNumberComplianceUpdateResponse resp = updater.update(); + + assertNotNull(resp); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("PATCH", recordedRequest.getMethod()); + String contentType = recordedRequest.getHeader("Content-Type"); + assertNotNull(contentType); + assertTrue(contentType.contains("multipart/form-data")); + String body = recordedRequest.getBody().readUtf8(); + assertTrue(body.contains("data")); + assertTrue(body.contains("callback_url")); + } + + // ========================================================================= + // Test 13: Deleter - success + // ========================================================================= + @Test + public void deleteShouldSucceed() throws Exception { + String complianceId = "comp-uuid-12345678"; + + server.enqueue(new MockResponse() + .setResponseCode(204) + ); + + PhoneNumberCompliance.deleter(complianceId).delete(); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("DELETE", recordedRequest.getMethod()); + assertEquals(String.format("/Account/%s/PhoneNumber/Compliance/%s/", authId, complianceId), + recordedRequest.getPath()); + } + + // ========================================================================= + // Test 14: LinkCreator - success with report + // ========================================================================= + @Test + public void linkCreateShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceLinkResponse.json", 200); + + PhoneNumberComplianceLinkNumber linkNum1 = new PhoneNumberComplianceLinkNumber(); + linkNum1.setNumber("+911234567890"); + linkNum1.setComplianceApplicationId("comp-uuid-12345678"); + + PhoneNumberComplianceLinkNumber linkNum2 = new PhoneNumberComplianceLinkNumber(); + linkNum2.setNumber("+911234567891"); + linkNum2.setComplianceApplicationId("comp-uuid-12345678"); + + List numbers = new ArrayList<>(); + numbers.add(linkNum1); + numbers.add(linkNum2); + + PhoneNumberComplianceLinkCreator linkCreator = new PhoneNumberComplianceLinkCreator(); + linkCreator.numbers(numbers); + PhoneNumberComplianceLinkResponse resp = linkCreator.create(); + + assertNotNull(resp); + assertEquals(Integer.valueOf(2), resp.getTotalCount()); + assertEquals(Integer.valueOf(2), resp.getUpdatedCount()); + assertNotNull(resp.getReport()); + assertEquals(2, resp.getReport().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + assertTrue(recordedRequest.getPath().contains("PhoneNumber/Compliance/Link/")); + } + + // ========================================================================= + // Test 15: LinkCreator - empty report + // ========================================================================= + @Test + public void linkCreateEmptyReportShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceLinkEmptyResponse.json", 200); + + List numbers = new ArrayList<>(); + + PhoneNumberComplianceLinkCreator linkCreator = new PhoneNumberComplianceLinkCreator(); + linkCreator.numbers(numbers); + PhoneNumberComplianceLinkResponse resp = linkCreator.create(); + + assertNotNull(resp); + assertEquals(Integer.valueOf(0), resp.getTotalCount()); + assertEquals(Integer.valueOf(0), resp.getUpdatedCount()); + assertNotNull(resp.getReport()); + assertEquals(0, resp.getReport().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + } + + // ========================================================================= + // Test 16: Getter - 404 error + // ========================================================================= + @Test(expected = ResourceNotFoundException.class) + public void getNotFoundShouldThrowException() throws Exception { + String complianceId = "nonexistent-id"; + + server.enqueue(new MockResponse() + .setResponseCode(404) + .setBody(loadFixture("phoneNumberComplianceNotFoundResponse.json")) + ); + + PhoneNumberCompliance.getter(complianceId).get(); + } + + // ========================================================================= + // Test 17: List - pagination meta fields + // ========================================================================= + @Test + public void listPaginatedShouldReturnMetaFields() throws Exception { + String fixtureName = "phoneNumberComplianceListPaginatedResponse.json"; + + server.enqueue(new MockResponse() + .setResponseCode(200) + .setBody(loadFixture(fixtureName)) + ); + + ListResponse resp = PhoneNumberCompliance.lister() + .limit(2) + .list(); + + assertNotNull(resp); + assertNotNull(resp.getMeta()); + assertEquals(Long.valueOf(2), resp.getMeta().getLimit()); + assertEquals(Long.valueOf(0), resp.getMeta().getOffset()); + assertEquals(Long.valueOf(5), resp.getMeta().getTotalCount()); + assertNotNull(resp.getMeta().getNext()); + assertNull(resp.getMeta().getPrevious()); + assertNotNull(resp.getCompliances()); + assertEquals(2, resp.getCompliances().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + } + + // ========================================================================= + // Test 18: Requirements - different country (DE/local/individual) + // ========================================================================= + @Test + public void requirementListerDifferentCountryShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceRequirementDEResponse.json", 200); + + PhoneNumberComplianceRequirement req = PhoneNumberComplianceRequirement.lister() + .countryIso("DE") + .numberType("local") + .userType("individual") + .list(); + + assertNotNull(req); + assertEquals("DE", req.getCountryIso()); + assertEquals("local", req.getNumberType()); + assertEquals("individual", req.getUserType()); + assertNotNull(req.getDocumentTypes()); + assertEquals(1, req.getDocumentTypes().size()); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + String path = recordedRequest.getPath(); + assertTrue(path.contains("PhoneNumber/Compliance/Requirements/")); + } + + // ========================================================================= + // Test 19: Get - verify URL path construction + // ========================================================================= + @Test + public void getVerifyUrlPathShouldSucceed() throws Exception { + String complianceId = "comp-uuid-path-test"; + expectResponse("phoneNumberComplianceGetResponse.json", 200); + + PhoneNumberCompliance.getter(complianceId).get(); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertEquals( + String.format("/Account/%s/PhoneNumber/Compliance/%s/", authId, complianceId), + recordedRequest.getPath().split("\\?")[0] + ); + } + + // ========================================================================= + // Test 20: Link - verify request body structure + // ========================================================================= + @Test + public void linkCreateVerifyRequestBodyShouldSucceed() throws Exception { + expectResponse("phoneNumberComplianceLinkResponse.json", 200); + + PhoneNumberComplianceLinkNumber linkNum = new PhoneNumberComplianceLinkNumber(); + linkNum.setNumber("+911234567890"); + linkNum.setComplianceApplicationId("comp-uuid-12345678"); + + assertEquals("+911234567890", linkNum.getNumber()); + assertEquals("comp-uuid-12345678", linkNum.getComplianceApplicationId()); + + List numbers = new ArrayList<>(); + numbers.add(linkNum); + + PhoneNumberComplianceLinkCreator linkCreator = new PhoneNumberComplianceLinkCreator(); + linkCreator.numbers(numbers); + + assertEquals(1, linkCreator.getNumbers().size()); + assertEquals("+911234567890", linkCreator.getNumbers().get(0).getNumber()); + assertEquals("comp-uuid-12345678", linkCreator.getNumbers().get(0).getComplianceApplicationId()); + + PhoneNumberComplianceLinkResponse resp = linkCreator.create(); + assertNotNull(resp); + + RecordedRequest recordedRequest = server.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + assertEquals( + String.format("/Account/%s/PhoneNumber/Compliance/Link/", authId), + recordedRequest.getPath() + ); + } +} diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceCreateResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceCreateResponse.json new file mode 100644 index 00000000..5178f8dc --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceCreateResponse.json @@ -0,0 +1,5 @@ +{ + "api_id": "create-api-id-001", + "message": "Compliance application created successfully", + "compliance_id": "comp-uuid-12345678" +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceGetAllFieldsResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceGetAllFieldsResponse.json new file mode 100644 index 00000000..e9564873 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceGetAllFieldsResponse.json @@ -0,0 +1,42 @@ +{ + "api_id": "get-api-id-003", + "compliance": { + "compliance_id": "comp-uuid-99999999", + "status": "rejected", + "alias": "rejected-compliance-app", + "country_iso": "DE", + "number_type": "local", + "user_type": "individual", + "callback_url": "https://example.com/rejected-callback", + "callback_method": "POST", + "rejection_reason": "Document is expired. Please provide a valid document.", + "created_at": "2025-03-01T00:00:00Z", + "updated_at": "2025-03-15T00:00:00Z", + "end_user": { + "name": "John Doe", + "type": "individual" + }, + "documents": [ + { + "document_type_id": "doc-type-001", + "document_name": "Identity Proof", + "status": "rejected" + }, + { + "document_type_id": "doc-type-002", + "document_name": "Address Proof", + "status": "pending" + } + ], + "linked_numbers": [ + { + "number": "+491234567890", + "status": "active" + }, + { + "number": "+491234567891", + "status": "pending" + } + ] + } +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceGetExpandedResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceGetExpandedResponse.json new file mode 100644 index 00000000..e999d9b3 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceGetExpandedResponse.json @@ -0,0 +1,33 @@ +{ + "api_id": "get-api-id-002", + "compliance": { + "compliance_id": "comp-uuid-12345678", + "status": "approved", + "alias": "test-compliance-app", + "country_iso": "IN", + "number_type": "local", + "user_type": "business", + "callback_url": "https://example.com/callback", + "callback_method": "POST", + "rejection_reason": null, + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-02T00:00:00Z", + "end_user": { + "name": "Test Corp", + "type": "business" + }, + "documents": [ + { + "document_type_id": "525a6b3a-2050-4556-8e2c-367cf30cd6ca", + "document_name": "Business Registration", + "status": "approved" + } + ], + "linked_numbers": [ + { + "number": "+911234567890", + "status": "active" + } + ] + } +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceGetResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceGetResponse.json new file mode 100644 index 00000000..11b12eac --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceGetResponse.json @@ -0,0 +1,15 @@ +{ + "api_id": "get-api-id-001", + "compliance": { + "compliance_id": "comp-uuid-12345678", + "status": "submitted", + "alias": "test-compliance-app", + "country_iso": "IN", + "number_type": "local", + "user_type": "business", + "callback_url": "https://example.com/callback", + "callback_method": "POST", + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-02T00:00:00Z" + } +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceLinkEmptyResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceLinkEmptyResponse.json new file mode 100644 index 00000000..5d975410 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceLinkEmptyResponse.json @@ -0,0 +1,7 @@ +{ + "api_id": "link-api-id-002", + "message": "No numbers to link", + "total_count": 0, + "updated_count": 0, + "report": [] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceLinkResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceLinkResponse.json new file mode 100644 index 00000000..289b14bb --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceLinkResponse.json @@ -0,0 +1,18 @@ +{ + "api_id": "link-api-id-001", + "message": "Numbers linked successfully", + "total_count": 2, + "updated_count": 2, + "report": [ + { + "number": "+911234567890", + "compliance_application_id": "comp-uuid-12345678", + "status": "success" + }, + { + "number": "+911234567891", + "compliance_application_id": "comp-uuid-12345678", + "status": "success" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceListEmptyResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceListEmptyResponse.json new file mode 100644 index 00000000..86cec889 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceListEmptyResponse.json @@ -0,0 +1,11 @@ +{ + "api_id": "list-api-id-002", + "meta": { + "limit": 20, + "next": null, + "offset": 0, + "previous": null, + "total_count": 0 + }, + "compliances": [] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceListPaginatedResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceListPaginatedResponse.json new file mode 100644 index 00000000..07412189 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceListPaginatedResponse.json @@ -0,0 +1,32 @@ +{ + "api_id": "list-api-id-003", + "meta": { + "limit": 2, + "next": "/v1/Account/MA123456789012345678/PhoneNumber/Compliance/?limit=2&offset=2", + "offset": 0, + "previous": null, + "total_count": 5 + }, + "compliances": [ + { + "compliance_id": "comp-uuid-page1-001", + "status": "submitted", + "alias": "paginated-1", + "country_iso": "IN", + "number_type": "local", + "user_type": "business", + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-02T00:00:00Z" + }, + { + "compliance_id": "comp-uuid-page1-002", + "status": "approved", + "alias": "paginated-2", + "country_iso": "IN", + "number_type": "local", + "user_type": "business", + "created_at": "2025-02-01T00:00:00Z", + "updated_at": "2025-02-02T00:00:00Z" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceListResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceListResponse.json new file mode 100644 index 00000000..01480fb1 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceListResponse.json @@ -0,0 +1,36 @@ +{ + "api_id": "list-api-id-001", + "meta": { + "limit": 20, + "next": null, + "offset": 0, + "previous": null, + "total_count": 2 + }, + "compliances": [ + { + "compliance_id": "comp-uuid-11111111", + "status": "submitted", + "alias": "test-alias-1", + "country_iso": "IN", + "number_type": "local", + "user_type": "business", + "callback_url": "https://example.com/callback", + "callback_method": "POST", + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-02T00:00:00Z" + }, + { + "compliance_id": "comp-uuid-22222222", + "status": "approved", + "alias": "test-alias-2", + "country_iso": "DE", + "number_type": "local", + "user_type": "individual", + "callback_url": null, + "callback_method": null, + "created_at": "2025-02-01T00:00:00Z", + "updated_at": "2025-02-02T00:00:00Z" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceNotFoundResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceNotFoundResponse.json new file mode 100644 index 00000000..1a3459b8 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceNotFoundResponse.json @@ -0,0 +1,4 @@ +{ + "api_id": "error-api-id-001", + "error": "not found" +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementDEResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementDEResponse.json new file mode 100644 index 00000000..9d7d9ccb --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementDEResponse.json @@ -0,0 +1,26 @@ +{ + "api_id": "req-api-id-003", + "requirement_id": "req-67890", + "country_iso": "DE", + "number_type": "local", + "user_type": "individual", + "document_types": [ + { + "document_type_id": "de-doc-type-001", + "document_name": "Personal ID", + "description": "Valid government-issued photo ID", + "data_fields": [ + { + "field_name": "full_name", + "field_type": "string", + "required": true + }, + { + "field_name": "id_number", + "field_type": "string", + "required": true + } + ] + } + ] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementEmptyResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementEmptyResponse.json new file mode 100644 index 00000000..e3d63798 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementEmptyResponse.json @@ -0,0 +1,8 @@ +{ + "api_id": "req-api-id-002", + "requirement_id": "req-00000", + "country_iso": "ZZ", + "number_type": "local", + "user_type": "business", + "document_types": [] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementListResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementListResponse.json new file mode 100644 index 00000000..e03e3f4f --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceRequirementListResponse.json @@ -0,0 +1,27 @@ +{ + "api_id": "req-api-id-001", + "requirement_id": "req-12345", + "country_iso": "IN", + "number_type": "local", + "user_type": "business", + "document_types": [ + { + "document_type_id": "525a6b3a-2050-4556-8e2c-367cf30cd6ca", + "document_name": "Business Registration", + "description": "Business registration document", + "data_fields": [ + { + "field_name": "business_name", + "field_type": "string", + "required": true + } + ] + }, + { + "document_type_id": "8a048d56-d8cb-4148-a764-49f1326aa161", + "document_name": "Address Proof", + "description": "Proof of address document", + "data_fields": [] + } + ] +} \ No newline at end of file diff --git a/src/test/resources/com/plivo/api/phoneNumberComplianceUpdateResponse.json b/src/test/resources/com/plivo/api/phoneNumberComplianceUpdateResponse.json new file mode 100644 index 00000000..56ba86f8 --- /dev/null +++ b/src/test/resources/com/plivo/api/phoneNumberComplianceUpdateResponse.json @@ -0,0 +1,5 @@ +{ + "api_id": "update-api-id-001", + "message": "Compliance application updated successfully", + "compliance_id": "comp-uuid-12345678" +} \ No newline at end of file