From e9860c7db140172b8dfb12ab3fbc551029ac9461 Mon Sep 17 00:00:00 2001
From: Mirko Stojmenovic <mirko.stojmenovic@frejaeid.rs>
Date: Thu, 9 May 2024 11:15:55 +0200
Subject: [PATCH] RN Added support for CHILDREN_DOCUMENT_INFO_WITH_PDF
 attribute

---
 FrejaEidClient/pom.xml                        |   2 +-
 .../beans/general/RequestedAttributes.java    |  16 ++-
 .../client/client/impl/SignClient.java        |   2 -
 .../client/enums/AttributeToReturn.java       |  10 +-
 .../frejaeid/client/service/BasicService.java |   1 -
 ...iateAuthenticationRequestBuildersTest.java |   1 +
 .../init/InitiateSignRequestBuildersTest.java |   1 +
 .../AuthenticationClientGetResultTest.java    |  49 ++++----
 .../client/impl/SignClientGetResultTest.java  |  42 ++++---
 .../frejaeid/client/http/CommonHttpTest.java  | 108 +++++++++---------
 10 files changed, 133 insertions(+), 99 deletions(-)

diff --git a/FrejaEidClient/pom.xml b/FrejaEidClient/pom.xml
index d3e32e4..97d5957 100644
--- a/FrejaEidClient/pom.xml
+++ b/FrejaEidClient/pom.xml
@@ -3,7 +3,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.verisec.frejaeid</groupId>
     <artifactId>FrejaEidClient</artifactId>
-    <version>2.22.1-SNAPSHOT</version>
+    <version>2.23.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     
     <name>FrejaEidClient</name>
diff --git a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/beans/general/RequestedAttributes.java b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/beans/general/RequestedAttributes.java
index 2c3d957..950f52d 100644
--- a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/beans/general/RequestedAttributes.java
+++ b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/beans/general/RequestedAttributes.java
@@ -34,6 +34,7 @@ public class RequestedAttributes {
     private final String documentPhoto;
     private final CovidCertificates covidCertificates;
     private final DocumentInfoWithPdf documentInfoWithPdf;
+    private final List<DocumentInfoWithPdf> childrenDocumentInfoWithPdf;
 
     @JsonCreator
     public RequestedAttributes(@JsonProperty(value = "basicUserInfo") BasicUserInfo basicUserInfo,
@@ -54,7 +55,8 @@ public RequestedAttributes(@JsonProperty(value = "basicUserInfo") BasicUserInfo
                                @JsonProperty(value = "documentPhoto") String documentPhoto,
                                @JsonProperty(value = "covidCertificates") CovidCertificates covidCertificates,
                                @JsonProperty(value = "organisationId") OrganisationIdInfo organisationId,
-                               @JsonProperty(value = "documentInfoWithPdf") DocumentInfoWithPdf documentInfoWithPdf) {
+                               @JsonProperty(value = "documentInfoWithPdf") DocumentInfoWithPdf documentInfoWithPdf,
+                               @JsonProperty(value = "childrenDocumentInfoWithPdf") List<DocumentInfoWithPdf> childrenDocumentInfoWithPdf) {
         this.basicUserInfo = basicUserInfo;
         this.customIdentifier = customIdentifier;
         this.ssn = ssn;
@@ -74,6 +76,7 @@ public RequestedAttributes(@JsonProperty(value = "basicUserInfo") BasicUserInfo
         this.documentPhoto = documentPhoto;
         this.covidCertificates = covidCertificates;
         this.documentInfoWithPdf = documentInfoWithPdf;
+        this.childrenDocumentInfoWithPdf = childrenDocumentInfoWithPdf;
     }
 
     public BasicUserInfo getBasicUserInfo() {
@@ -152,12 +155,17 @@ public DocumentInfoWithPdf getDocumentInfoWithPdf() {
         return documentInfoWithPdf;
     }
 
+    public List<DocumentInfoWithPdf> getChildrenDocumentInfoWithPdf() {
+        return childrenDocumentInfoWithPdf;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(basicUserInfo, customIdentifier, ssn, integratorSpecificUserId,
                             dateOfBirth, relyingPartyUserId, emailAddress, organisationIdIdentifier,
                             organisationId, addresses, allEmailAddresses, allPhoneNumbers, registrationLevel, age,
-                            photo, document, documentPhoto, covidCertificates, documentInfoWithPdf);
+                            photo, document, documentPhoto, covidCertificates, documentInfoWithPdf, 
+                            childrenDocumentInfoWithPdf);
     }
 
     @Override
@@ -229,6 +237,9 @@ public boolean equals(Object obj) {
         if (!Objects.equals(this.documentInfoWithPdf, other.documentInfoWithPdf)) {
             return false;
         }
+        if (!Objects.equals(this.childrenDocumentInfoWithPdf, other.childrenDocumentInfoWithPdf)) {
+            return false;
+        }
         return true;
     }
 
@@ -254,6 +265,7 @@ public java.lang.String toString() {
                 ", documentPhoto=" + documentPhoto +
                 ", covidCertificates=" + covidCertificates +
                 ", documentInfoWithPdf=" + documentInfoWithPdf +
+                ", childrenDocumentInfoWithPdf=" + childrenDocumentInfoWithPdf +
                 '}';
     }
 }
diff --git a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/client/impl/SignClient.java b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/client/impl/SignClient.java
index 6b495ec..a52d0f2 100644
--- a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/client/impl/SignClient.java
+++ b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/client/impl/SignClient.java
@@ -1,7 +1,5 @@
 package com.verisec.frejaeid.client.client.impl;
 
-import com.verisec.frejaeid.client.beans.authentication.get.AuthenticationResult;
-import com.verisec.frejaeid.client.beans.authentication.get.AuthenticationResultRequest;
 import com.verisec.frejaeid.client.beans.general.SslSettings;
 import com.verisec.frejaeid.client.beans.sign.cancel.CancelSignRequest;
 import com.verisec.frejaeid.client.beans.sign.get.SignResultRequest;
diff --git a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/enums/AttributeToReturn.java b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/enums/AttributeToReturn.java
index bfaf6a5..1bbd78f 100644
--- a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/enums/AttributeToReturn.java
+++ b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/enums/AttributeToReturn.java
@@ -32,6 +32,7 @@
  * <br> - {@link #DOCUMENT_PHOTO}
  * <br> - {@link #COVID_CERTIFICATES}
  * <br> - {@link #DOCUMENT_INFO_WITH_PDF}
+ * <br> - {@link #CHILDREN_DOCUMENT_INFO_WITH_PDF}
  */
 public enum AttributeToReturn {
 
@@ -151,7 +152,14 @@ public enum AttributeToReturn {
      * {@linkplain MinRegistrationLevel#EXTENDED} and
      * {@linkplain MinRegistrationLevel#PLUS}.
      */
-    DOCUMENT_INFO_WITH_PDF("DOCUMENT_INFO_WITH_PDF");
+    DOCUMENT_INFO_WITH_PDF("DOCUMENT_INFO_WITH_PDF"),
+    /**
+     * Data about the user's children's documents and accompanying PDF files as a Base64-encoded String.
+     * Children documents with PDF can be requested only for
+     * {@linkplain MinRegistrationLevel#EXTENDED} and
+     * {@linkplain MinRegistrationLevel#PLUS}.
+     */
+    CHILDREN_DOCUMENT_INFO_WITH_PDF("CHILDREN_DOCUMENT_INFO_WITH_PDF");
 
     private final String name;
 
diff --git a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/service/BasicService.java b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/service/BasicService.java
index 8d9dd01..842fd58 100644
--- a/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/service/BasicService.java
+++ b/FrejaEidClient/src/main/java/com/verisec/frejaeid/client/service/BasicService.java
@@ -10,7 +10,6 @@
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 public class BasicService {
diff --git a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/authentication/init/InitiateAuthenticationRequestBuildersTest.java b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/authentication/init/InitiateAuthenticationRequestBuildersTest.java
index cabcd2a..30719fa 100644
--- a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/authentication/init/InitiateAuthenticationRequestBuildersTest.java
+++ b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/authentication/init/InitiateAuthenticationRequestBuildersTest.java
@@ -45,6 +45,7 @@ public static void createRequestedAttributes() {
         REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.DOCUMENT_PHOTO));
         REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.COVID_CERTIFICATES));
         REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.DOCUMENT_INFO_WITH_PDF));
+        REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.CHILDREN_DOCUMENT_INFO_WITH_PDF));
     }
 
     private static AttributeToReturnInfo attributeOf(AttributeToReturn attributeToReturn){
diff --git a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/sign/init/InitiateSignRequestBuildersTest.java b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/sign/init/InitiateSignRequestBuildersTest.java
index 6bc6fa9..f4e9d4d 100644
--- a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/sign/init/InitiateSignRequestBuildersTest.java
+++ b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/beans/sign/init/InitiateSignRequestBuildersTest.java
@@ -48,6 +48,7 @@ public static void createRequestedAttributes() {
         REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.DOCUMENT_PHOTO));
         REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.COVID_CERTIFICATES));
         REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.DOCUMENT_INFO_WITH_PDF));
+        REQUESTED_ATTRIBUTES.add(attributeOf(AttributeToReturn.CHILDREN_DOCUMENT_INFO_WITH_PDF));
     }
 
     private static AttributeToReturnInfo attributeOf(AttributeToReturn attributeToReturn){
diff --git a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/AuthenticationClientGetResultTest.java b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/AuthenticationClientGetResultTest.java
index f4a5655..cc42d95 100644
--- a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/AuthenticationClientGetResultTest.java
+++ b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/AuthenticationClientGetResultTest.java
@@ -22,6 +22,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -58,11 +59,13 @@ public class AuthenticationClientGetResultTest {
     private static final List<Email> ALL_EMAIL_ADDRESSES = Arrays.asList(new Email(EMAIL_ADDRESS));
     private static final List<PhoneNumberInfo> ALL_PHONE_NUMBERS = Arrays.asList(new PhoneNumberInfo(PHONE_NUMBER));
     private static final Integer AGE = 35;
-        private static final String PHOTO = "https://image-hashId/test";
+    private static final String PHOTO = "https://image-hashId/test";
     private static final DocumentInfo DOCUMENT_INFO =
             new DocumentInfo(DocumentType.PASSPORT, "123456789", Country.SWEDEN, "2050-01-01");
     private static final DocumentInfoWithPdf DOCUMENT_WITH_PDF =
             new DocumentInfoWithPdf(DocumentType.PASSPORT, "123456789", Country.SWEDEN, "2050-01-01", "Base64Pdf");
+    private static final DocumentInfoWithPdf CHILDREN_DOCUMENT_WITH_PDF =
+            new DocumentInfoWithPdf(DocumentType.PASSPORT, "987654321", Country.SWEDEN, "20240-01-01", "Base64Pdf");
     private static final String DOCUMENT_PHOTO = "Base64EncodedDocPhoto";
     private static final CovidCertificates COVID_CERTIFICATES =
             new CovidCertificates(new Vaccines("covidCertificate"), null, null, true);
@@ -71,7 +74,7 @@ public class AuthenticationClientGetResultTest {
 
     @BeforeClass
     public static void initTestData() {
-        HashMap<String,String> organisationIdIssuerNames = new HashMap<>();
+        Map<String, String> organisationIdIssuerNames = new HashMap<>();
         organisationIdIssuerNames.put("EN", "Org ID issuer");
         organisationIdIssuerNames.put("SV", "Org ID issuer Swedish");
         ORGANISATION_ID_INFO =
@@ -87,7 +90,7 @@ public static void initTestData() {
                                         ALL_EMAIL_ADDRESSES, ALL_PHONE_NUMBERS, RegistrationLevel.EXTENDED,
                                         AGE, PHOTO, DOCUMENT_INFO, DOCUMENT_PHOTO,
                                         COVID_CERTIFICATES, ORGANISATION_ID_INFO,
-                                        DOCUMENT_WITH_PDF);
+                                        DOCUMENT_WITH_PDF, Arrays.asList(CHILDREN_DOCUMENT_WITH_PDF));
     }
 
     @Before
@@ -102,14 +105,14 @@ public void getAuthenticationResult_relyingPartyIdNull_success()
             throws FrejaEidClientInternalException, FrejaEidException {
         AuthenticationResultRequest authenticationResultRequest = AuthenticationResultRequest.create(REFERENCE);
         when(httpServiceMock.send(anyString(), any(RequestTemplate.class),
-                                          any(RelyingPartyRequest.class),
-                                          Mockito.eq(AuthenticationResult.class), (String) Mockito.isNull()))
+                                  any(RelyingPartyRequest.class),
+                                  Mockito.eq(AuthenticationResult.class), (String) Mockito.isNull()))
                 .thenReturn(new AuthenticationResult(REFERENCE, TransactionStatus.STARTED, DETAILS,
                                                      REQUESTED_ATTRIBUTES));
         AuthenticationResult response = authenticationClient.getResult(authenticationResultRequest);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.AUTHENTICATION_GET_RESULT,
-                                             RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
-                                             authenticationResultRequest, AuthenticationResult.class, null);
+                                     RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
+                                     authenticationResultRequest, AuthenticationResult.class, null);
         assertEquals(REFERENCE, response.getAuthRef());
         assertEquals(TransactionStatus.STARTED, response.getStatus());
         assertEquals(DETAILS, response.getDetails());
@@ -127,8 +130,8 @@ public void getAuthenticationResultPersonal_success() throws FrejaEidClientInter
                                                      REQUESTED_ATTRIBUTES));
         AuthenticationResult response = authenticationClient.getResult(authenticationResultRequest);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.AUTHENTICATION_GET_RESULT,
-                                             RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
-                                             authenticationResultRequest, AuthenticationResult.class, RELYING_PARTY_ID);
+                                     RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
+                                     authenticationResultRequest, AuthenticationResult.class, RELYING_PARTY_ID);
         assertEquals(REFERENCE, response.getAuthRef());
         assertEquals(TransactionStatus.STARTED, response.getStatus());
         assertEquals(DETAILS, response.getDetails());
@@ -170,7 +173,8 @@ public void getAuthenticationResultOrganisational_withAdditionalAttributes_succe
                                         ALL_EMAIL_ADDRESSES, ALL_PHONE_NUMBERS,
                                         RegistrationLevel.EXTENDED, AGE, PHOTO,
                                         DOCUMENT_INFO, DOCUMENT_PHOTO, COVID_CERTIFICATES,
-                                        ORGANISATION_ID_INFO_WITH_ADDITIONAL_ATTRIBUTES, DOCUMENT_WITH_PDF);
+                                        ORGANISATION_ID_INFO_WITH_ADDITIONAL_ATTRIBUTES, DOCUMENT_WITH_PDF,
+                                        Arrays.asList(CHILDREN_DOCUMENT_WITH_PDF));
         AuthenticationClientApi authenticationClient =
                 AuthenticationClient.create(TestUtil.getDefaultSslSettings(), FrejaEnvironment.TEST)
                         .setHttpService(httpServiceMock)
@@ -208,9 +212,9 @@ public void getAuthenticationResult_invalidReference_expectInvalidReferenceError
             Assert.fail("Test should throw exception!");
         } catch (FrejaEidException rpEx) {
             verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.AUTHENTICATION_GET_RESULT,
-                                                 RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
-                                                 getOneAuthenticationResultRequest, AuthenticationResult.class,
-                                                 RELYING_PARTY_ID);
+                                         RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
+                                         getOneAuthenticationResultRequest, AuthenticationResult.class,
+                                         RELYING_PARTY_ID);
             assertEquals(1100, rpEx.getErrorCode());
             assertEquals("Invalid reference (for example, nonexistent or expired).", rpEx.getLocalizedMessage());
         }
@@ -228,8 +232,8 @@ public void pollForResult_relyingPartyIdNull_finalResponseRejected_success()
                 .thenReturn(expectedResponse);
         AuthenticationResult response = authenticationClient.pollForResult(authenticationResultRequest, 10000);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.AUTHENTICATION_GET_RESULT,
-                                             RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
-                                             authenticationResultRequest, AuthenticationResult.class, null);
+                                     RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
+                                     authenticationResultRequest, AuthenticationResult.class, null);
         assertEquals(TransactionStatus.REJECTED, response.getStatus());
     }
 
@@ -247,8 +251,8 @@ public void pollForResult_relyingPartyIdNotNull_finalResponseRejected_success()
         AuthenticationResult response = authenticationClient
                 .pollForResult(AuthenticationResultRequest.create(REFERENCE, RELYING_PARTY_ID), 10000);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.AUTHENTICATION_GET_RESULT,
-                                             RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
-                                             authenticationResultRequest, AuthenticationResult.class, RELYING_PARTY_ID);
+                                     RequestTemplate.AUTHENTICATION_RESULT_TEMPLATE,
+                                     authenticationResultRequest, AuthenticationResult.class, RELYING_PARTY_ID);
         assertEquals(TransactionStatus.REJECTED, response.getStatus());
     }
 
@@ -293,9 +297,9 @@ private void getAuthenticationResults_success(AuthenticationResultsRequest getAu
             throws FrejaEidClientInternalException, FrejaEidException {
         List<AuthenticationResult> response = authenticationClient.getResults(getAuthenticationResultsRequest);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.AUTHENTICATION_GET_RESULTS,
-                                             RequestTemplate.AUTHENTICATION_RESULTS_TEMPLATE,
-                                             getAuthenticationResultsRequest, AuthenticationResults.class,
-                                             getAuthenticationResultsRequest.getRelyingPartyId());
+                                     RequestTemplate.AUTHENTICATION_RESULTS_TEMPLATE,
+                                     getAuthenticationResultsRequest, AuthenticationResults.class,
+                                     getAuthenticationResultsRequest.getRelyingPartyId());
         AuthenticationResult first = response.get(0);
         assertEquals(REFERENCE, first.getAuthRef());
         assertEquals(TransactionStatus.STARTED, first.getStatus());
@@ -315,12 +319,13 @@ private AuthenticationResults prepareResponse() {
                                         RELYING_PARTY_USER_ID, EMAIL_ADDRESS, ORGANISATION_ID, ADDRESSES,
                                         ALL_EMAIL_ADDRESSES, ALL_PHONE_NUMBERS, RegistrationLevel.EXTENDED, AGE,
                                         PHOTO, DOCUMENT_INFO, DOCUMENT_PHOTO, COVID_CERTIFICATES,
-                                        ORGANISATION_ID_INFO, DOCUMENT_WITH_PDF);
+                                        ORGANISATION_ID_INFO, DOCUMENT_WITH_PDF,
+                                        Arrays.asList(CHILDREN_DOCUMENT_WITH_PDF));
         AuthenticationResult firstResponse =
                 new AuthenticationResult(REFERENCE, TransactionStatus.STARTED, DETAILS, attributes1);
         RequestedAttributes attributes2 =
                 new RequestedAttributes(null, "test", null, null, null, null, null, null, null, null,
-                                        null, null, null, null, null, null, null, null, null);
+                                        null, null, null, null, null, null, null, null, null, null);
         AuthenticationResult secondResponse =
                 new AuthenticationResult(REFERENCE, TransactionStatus.DELIVERED_TO_MOBILE, "test", attributes2);
         List<AuthenticationResult> responses = new ArrayList<>();
diff --git a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/SignClientGetResultTest.java b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/SignClientGetResultTest.java
index 9a7c80d..04bf659 100644
--- a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/SignClientGetResultTest.java
+++ b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/client/impl/SignClientGetResultTest.java
@@ -22,6 +22,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -58,6 +59,8 @@ public class SignClientGetResultTest {
             new DocumentInfo(DocumentType.PASSPORT, "123456789", Country.SWEDEN, "2050-01-01");
     private static final DocumentInfoWithPdf DOCUMENT_WITH_PDF =
             new DocumentInfoWithPdf(DocumentType.PASSPORT, "123456789", Country.SWEDEN, "2050-01-01", "Base64Pdf");
+    private static final DocumentInfoWithPdf CHILDREN_DOCUMENT_WITH_PDF =
+            new DocumentInfoWithPdf(DocumentType.PASSPORT, "987654321", Country.SWEDEN, "20240-01-01", "Base64Pdf");
     private static final String DOCUMENT_PHOTO = "Base64EncodedDocPhoto";
     protected static final CovidCertificates COVID_CERTIFICATES =
             new CovidCertificates(new Vaccines("covidCertificate"), null, null, true);
@@ -66,7 +69,7 @@ public class SignClientGetResultTest {
 
     @BeforeClass
     public static void initTestData() {
-        HashMap<String,String> organisationIdIssuerNames = new HashMap<>();
+        Map<String, String> organisationIdIssuerNames = new HashMap<>();
         organisationIdIssuerNames.put("EN", "Org ID issuer");
         organisationIdIssuerNames.put("SV", "Org ID issuer Swedish");
         ORGANISATION_ID_INFO =
@@ -82,7 +85,8 @@ public static void initTestData() {
                                         RELYING_PARTY_USER_ID, EMAIL_ADDRESS, ORGANISATION_ID, ADDRESSES,
                                         ALL_EMAIL_ADDRESSES, ALL_PHONE_NUMBERS, RegistrationLevel.EXTENDED,
                                         AGE, PHOTO, DOCUMENT_INFO, DOCUMENT_PHOTO,
-                                        COVID_CERTIFICATES, ORGANISATION_ID_INFO, DOCUMENT_WITH_PDF);
+                                        COVID_CERTIFICATES, ORGANISATION_ID_INFO, DOCUMENT_WITH_PDF,
+                                        Arrays.asList(CHILDREN_DOCUMENT_WITH_PDF));
     }
 
     @Before
@@ -99,12 +103,12 @@ public void getSignResult_relyingPartyIdNull_expectSuccess()
         SignResult expectedResponse = new SignResult(SIGN_REFERENCE, TransactionStatus.STARTED, SIGN_DETAILS,
                                                      REQUESTED_ATTRIBUTES);
         when(httpServiceMock.send(anyString(), any(RequestTemplate.class),
-                                          any(RelyingPartyRequest.class), Mockito.eq(SignResult.class),
-                                          (String) Mockito.isNull())).thenReturn(expectedResponse);
+                                  any(RelyingPartyRequest.class), Mockito.eq(SignResult.class),
+                                  (String) Mockito.isNull())).thenReturn(expectedResponse);
         SignResult response = signClient.getResult(signResultsRequest);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.SIGN_GET_RESULT,
-                                             RequestTemplate.SIGN_RESULT_TEMPLATE, signResultsRequest,
-                                             SignResult.class, null);
+                                     RequestTemplate.SIGN_RESULT_TEMPLATE, signResultsRequest,
+                                     SignResult.class, null);
         assertEquals(SIGN_REFERENCE, response.getSignRef());
         assertEquals(TransactionStatus.STARTED, response.getStatus());
         assertEquals(SIGN_DETAILS, response.getDetails());
@@ -121,8 +125,8 @@ public void getSignResultPersonal_expectSuccess() throws FrejaEidClientInternalE
                                   anyString())).thenReturn(expectedResponse);
         SignResult response = signClient.getResult(signResultRequest);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.SIGN_GET_RESULT,
-                                             RequestTemplate.SIGN_RESULT_TEMPLATE, signResultRequest,
-                                             SignResult.class, RELYING_PARTY_ID);
+                                     RequestTemplate.SIGN_RESULT_TEMPLATE, signResultRequest,
+                                     SignResult.class, RELYING_PARTY_ID);
         assertEquals(SIGN_REFERENCE, response.getSignRef());
         assertEquals(TransactionStatus.STARTED, response.getStatus());
         assertEquals(SIGN_DETAILS, response.getDetails());
@@ -151,7 +155,8 @@ public void getSignResultOrganisational_expectSuccess() throws FrejaEidClientInt
     }
 
     @Test
-    public void getSignResultOrganisational_withAdditionalAttributes_expectSuccess() throws FrejaEidClientInternalException, FrejaEidException {
+    public void getSignResultOrganisational_withAdditionalAttributes_expectSuccess() throws
+            FrejaEidClientInternalException, FrejaEidException {
         RequestedAttributes requestedAttributes =
                 new RequestedAttributes(new BasicUserInfo("name", "surname"), "customIdentifier",
                                         SsnUserInfo.create(Country.SWEDEN, "ssn"), null,
@@ -160,7 +165,8 @@ public void getSignResultOrganisational_withAdditionalAttributes_expectSuccess()
                                         ALL_EMAIL_ADDRESSES, ALL_PHONE_NUMBERS,
                                         RegistrationLevel.EXTENDED, AGE, PHOTO,
                                         DOCUMENT_INFO, DOCUMENT_PHOTO, COVID_CERTIFICATES,
-                                        ORGANISATION_ID_INFO_WITH_ADDITIONAL_ATTRIBUTES, DOCUMENT_WITH_PDF);
+                                        ORGANISATION_ID_INFO_WITH_ADDITIONAL_ATTRIBUTES, DOCUMENT_WITH_PDF,
+                                        Arrays.asList(CHILDREN_DOCUMENT_WITH_PDF));
         SignResultRequest signResultRequest = SignResultRequest.create(SIGN_REFERENCE, RELYING_PARTY_ID);
         SignResult expectedResponse =
                 new SignResult(SIGN_REFERENCE, TransactionStatus.APPROVED, SIGN_DETAILS, requestedAttributes);
@@ -194,8 +200,8 @@ public void getSignResult_invalidReference_expectInvalidReferenceError()
             Assert.fail("Test should throw exception!");
         } catch (FrejaEidException rpEx) {
             verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.SIGN_GET_RESULT,
-                                                 RequestTemplate.SIGN_RESULT_TEMPLATE, signResultRequest,
-                                                 SignResult.class, RELYING_PARTY_ID);
+                                         RequestTemplate.SIGN_RESULT_TEMPLATE, signResultRequest,
+                                         SignResult.class, RELYING_PARTY_ID);
             assertEquals(1100, rpEx.getErrorCode());
             assertEquals("Invalid reference (for example, nonexistent or expired).", rpEx.getLocalizedMessage());
         }
@@ -211,8 +217,8 @@ public void pollForResult_finalResponseRejected_success()
         SignResultRequest signResultRequest = SignResultRequest.create(SIGN_REFERENCE);
         SignResult response = signClient.pollForResult(signResultRequest, 10000);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.SIGN_GET_RESULT,
-                                             RequestTemplate.SIGN_RESULT_TEMPLATE, signResultRequest,
-                                             SignResult.class, null);
+                                     RequestTemplate.SIGN_RESULT_TEMPLATE, signResultRequest,
+                                     SignResult.class, null);
         assertEquals(TransactionStatus.REJECTED, response.getStatus());
     }
 
@@ -264,8 +270,8 @@ public void getSignResults_expectError() throws FrejaEidClientInternalException,
             Assert.fail("Test should throw exception!");
         } catch (FrejaEidException rpEx) {
             verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.SIGN_GET_RESULTS,
-                                                 RequestTemplate.SIGN_RESULTS_TEMPLATE, signResultsRequest,
-                                                 SignResults.class, RELYING_PARTY_ID);
+                                         RequestTemplate.SIGN_RESULTS_TEMPLATE, signResultsRequest,
+                                         SignResults.class, RELYING_PARTY_ID);
             assertEquals(1008, rpEx.getErrorCode());
             assertEquals("Unknown Relying party.", rpEx.getLocalizedMessage());
         }
@@ -276,8 +282,8 @@ private void getSignResults_success(SignResultsRequest signResultsRequest)
             throws FrejaEidClientInternalException, FrejaEidException {
         List<SignResult> response = signClient.getResults(signResultsRequest);
         verify(httpServiceMock).send(FrejaEnvironment.TEST.getServiceUrl() + MethodUrl.SIGN_GET_RESULTS,
-                                             RequestTemplate.SIGN_RESULTS_TEMPLATE, signResultsRequest,
-                                             SignResults.class, signResultsRequest.getRelyingPartyId());
+                                     RequestTemplate.SIGN_RESULTS_TEMPLATE, signResultsRequest,
+                                     SignResults.class, signResultsRequest.getRelyingPartyId());
 
         SignResult firstResponse = response.get(0);
         assertEquals(SIGN_REFERENCE, firstResponse.getSignRef());
diff --git a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/http/CommonHttpTest.java b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/http/CommonHttpTest.java
index a511b40..f6d1ea7 100644
--- a/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/http/CommonHttpTest.java
+++ b/FrejaEidClient/src/test/java/com/verisec/frejaeid/client/http/CommonHttpTest.java
@@ -20,6 +20,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.codec.binary.Base64;
 import org.junit.After;
@@ -56,6 +57,8 @@ public abstract class CommonHttpTest {
             new DocumentInfo(DocumentType.PASSPORT, "123456789", Country.SWEDEN, "2050-01-01");
     private static final DocumentInfoWithPdf DOCUMENT_WITH_PDF =
             new DocumentInfoWithPdf(DocumentType.PASSPORT, "123456789", Country.SWEDEN, "2050-01-01", "Base64Pdf");
+    private static final DocumentInfoWithPdf CHILDREN_DOCUMENT_WITH_PDF =
+            new DocumentInfoWithPdf(DocumentType.PASSPORT, "987654321", Country.SWEDEN, "20240-01-01", "Base64Pdf");
     private static final CovidCertificates COVID_CERTIFICATES =
             new CovidCertificates(new Vaccines("covidCertificate"), null, null, true);
     private static final String DOCUMENT_PHOTO = "Base64EncodedDocPhoto";
@@ -64,7 +67,8 @@ public abstract class CommonHttpTest {
                                     RELYING_PARTY_USER_ID, EMAIL_ADDRESS, ORGANISATION_ID, ADDRESSES,
                                     ALL_EMAIL_ADDRESSES, ALL_PHONE_NUMBERS, RegistrationLevel.EXTENDED, AGE,
                                     PHOTO, DOCUMENT_INFO, DOCUMENT_PHOTO,
-                                    COVID_CERTIFICATES, ORGANISATION_ID_INFO, DOCUMENT_WITH_PDF);
+                                    COVID_CERTIFICATES, ORGANISATION_ID_INFO, DOCUMENT_WITH_PDF,
+                                    Arrays.asList(CHILDREN_DOCUMENT_WITH_PDF));
     protected static final String POST_PARAMS_DELIMITER = "&";
     protected static final String KEY_VALUE_DELIMITER = "=";
     protected static final int MOCK_SERVICE_PORT = 30665;
@@ -73,7 +77,7 @@ public abstract class CommonHttpTest {
 
     @BeforeClass
     public static void initTestData() {
-        HashMap<String,String> organisationIdIssuerNames = new HashMap<>();
+        Map<String, String> organisationIdIssuerNames = new HashMap<>();
         organisationIdIssuerNames.put("EN", "Org ID issuer");
         organisationIdIssuerNames.put("SV", "Org ID issuer Swedish");
         ORGANISATION_ID_INFO =
@@ -86,56 +90,56 @@ protected void startMockServer(final RelyingPartyRequest expectedRequest,
             throws IOException {
         server = HttpServer.create(new InetSocketAddress(MOCK_SERVICE_PORT), 0);
         server.createContext("/", new HttpHandler() {
-            @Override
-            public void handle(HttpExchange t) throws IOException {
-                String requestData;
-                try (InputStreamReader isr = new InputStreamReader(t.getRequestBody())) {
-                    BufferedReader reader = new BufferedReader(isr);
-                    requestData = reader.readLine();
-
-                    if (requestData != null) {
-                        String[] postParams = requestData.split(POST_PARAMS_DELIMITER);
-                        if (postParams.length == 2) {
-                            String relyingPartyIdParam = postParams[1].split(KEY_VALUE_DELIMITER, 2)[1];
-                            assertEquals(RELYING_PARTY_ID, relyingPartyIdParam);
-
-                            String requestParam = postParams[0].split(KEY_VALUE_DELIMITER, 2)[1];
-                            String jsonReceivedRequest = new String(Base64.decodeBase64(requestParam),
-                                                                    StandardCharsets.UTF_8);
-                            String jsonExpectedRequest = jsonService.serializeToJson(expectedRequest);
-                            assertEquals(jsonExpectedRequest, jsonReceivedRequest);
-
-                            RelyingPartyRequest receivedRequest =
-                                    jsonService.deserializeFromJson(Base64.decodeBase64(requestParam),
-                                                                    expectedRequest.getClass());
-                            assertEquals(expectedRequest, receivedRequest);
-                        } else if (containsKeyValueDelimiter(postParams)) {
-                            String relyingPartyIdParam = postParams[0].split(KEY_VALUE_DELIMITER, 2)[1];
-                            assertEquals(RELYING_PARTY_ID, relyingPartyIdParam);
-                        } else {
-                            String requestParam = postParams[0].split(KEY_VALUE_DELIMITER, 2)[1];
-                            String jsonReceivedRequest = new String(Base64.decodeBase64(requestParam),
-                                                                    StandardCharsets.UTF_8);
-                            String jsonExpectedRequest = jsonService.serializeToJson(expectedRequest);
-                            assertEquals(jsonExpectedRequest, jsonReceivedRequest);
-
-                            RelyingPartyRequest receivedRequest =
-                                    jsonService.deserializeFromJson(Base64.decodeBase64(requestParam),
-                                                                    expectedRequest.getClass());
-                            assertEquals(expectedRequest, receivedRequest);
-                        }
-
-                    }
-                } catch (Exception ex) {
-                    Assert.fail(ex.getMessage());
-                }
-
-                t.sendResponseHeaders(statusCodeToReturn, responseToReturn.length());
-                try (OutputStream os = t.getResponseBody()) {
-                    os.write(responseToReturn.getBytes());
-                }
-            }
-        });
+                         @Override
+                         public void handle(HttpExchange t) throws IOException {
+                             String requestData;
+                             try (InputStreamReader isr = new InputStreamReader(t.getRequestBody())) {
+                                 BufferedReader reader = new BufferedReader(isr);
+                                 requestData = reader.readLine();
+
+                                 if (requestData != null) {
+                                     String[] postParams = requestData.split(POST_PARAMS_DELIMITER);
+                                     if (postParams.length == 2) {
+                                         String relyingPartyIdParam = postParams[1].split(KEY_VALUE_DELIMITER, 2)[1];
+                                         assertEquals(RELYING_PARTY_ID, relyingPartyIdParam);
+
+                                         String requestParam = postParams[0].split(KEY_VALUE_DELIMITER, 2)[1];
+                                         String jsonReceivedRequest = new String(Base64.decodeBase64(requestParam),
+                                                                                 StandardCharsets.UTF_8);
+                                         String jsonExpectedRequest = jsonService.serializeToJson(expectedRequest);
+                                         assertEquals(jsonExpectedRequest, jsonReceivedRequest);
+
+                                         RelyingPartyRequest receivedRequest =
+                                                 jsonService.deserializeFromJson(Base64.decodeBase64(requestParam),
+                                                                                 expectedRequest.getClass());
+                                         assertEquals(expectedRequest, receivedRequest);
+                                     } else if (containsKeyValueDelimiter(postParams)) {
+                                         String relyingPartyIdParam = postParams[0].split(KEY_VALUE_DELIMITER, 2)[1];
+                                         assertEquals(RELYING_PARTY_ID, relyingPartyIdParam);
+                                     } else {
+                                         String requestParam = postParams[0].split(KEY_VALUE_DELIMITER, 2)[1];
+                                         String jsonReceivedRequest = new String(Base64.decodeBase64(requestParam),
+                                                                                 StandardCharsets.UTF_8);
+                                         String jsonExpectedRequest = jsonService.serializeToJson(expectedRequest);
+                                         assertEquals(jsonExpectedRequest, jsonReceivedRequest);
+
+                                         RelyingPartyRequest receivedRequest =
+                                                 jsonService.deserializeFromJson(Base64.decodeBase64(requestParam),
+                                                                                 expectedRequest.getClass());
+                                         assertEquals(expectedRequest, receivedRequest);
+                                     }
+
+                                 }
+                             } catch (Exception ex) {
+                                 Assert.fail(ex.getMessage());
+                             }
+
+                             t.sendResponseHeaders(statusCodeToReturn, responseToReturn.length());
+                             try (OutputStream os = t.getResponseBody()) {
+                                 os.write(responseToReturn.getBytes());
+                             }
+                         }
+                     });
         server.setExecutor(null); // creates a default executor
         server.start();
     }