From 9d3590aca971742063fb6dd9596e3cb06bb6a6d1 Mon Sep 17 00:00:00 2001 From: Ted Pricer Date: Thu, 5 Aug 2021 14:31:27 -0400 Subject: [PATCH] Added support for additional files to TemplateSignatureRequests The HelloSign REST API has support for TemplateSignatureRequests with additional files appended to the end, as documented here: https://app.hellosign.com/api/reference#send_with_template https://app.hellosign.com/api/reference#send_embedded_signature_request_with_template These can be added either as files or file urls. This change allows the Java SDK to send the file or file_urls with the TemplateSignatureRequests. Per the API documentation, only one type (file vs. file url) can be specified. This change does not address enforcing that, as it is not enforced in the SignatureRequest class that this is modeled on. Note that this fixes https://github.com/hellosign/hellosign-java-sdk/issues/81 --- .../resource/TemplateSignatureRequest.java | 18 ++++++ .../hellosign/sdk/HelloSignClientTest.java | 10 +--- .../com/hellosign/sdk/PostFieldsTest.java | 54 ++++++++++++++++-- .../java/com/hellosign/sdk/TestUtils.java | 15 +++++ .../PostFieldsTest/Fixtures/Sample1.pdf | Bin 0 -> 10797 bytes .../PostFieldsTest/Fixtures/Sample2.pdf | Bin 0 -> 10797 bytes 6 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 src/test/java/com/hellosign/sdk/TestUtils.java create mode 100644 src/test/resources/PostFieldsTest/Fixtures/Sample1.pdf create mode 100644 src/test/resources/PostFieldsTest/Fixtures/Sample2.pdf diff --git a/src/main/java/com/hellosign/sdk/resource/TemplateSignatureRequest.java b/src/main/java/com/hellosign/sdk/resource/TemplateSignatureRequest.java index ee5a9008..e8983320 100644 --- a/src/main/java/com/hellosign/sdk/resource/TemplateSignatureRequest.java +++ b/src/main/java/com/hellosign/sdk/resource/TemplateSignatureRequest.java @@ -1,7 +1,11 @@ package com.hellosign.sdk.resource; import com.hellosign.sdk.HelloSignException; +import com.hellosign.sdk.resource.support.Document; +import com.hellosign.sdk.resource.support.FormField; import com.hellosign.sdk.resource.support.Signer; +import org.json.JSONArray; + import java.io.Serializable; import java.util.HashMap; import java.util.List; @@ -23,6 +27,9 @@ public class TemplateSignatureRequest extends AbstractRequest { private static final String TEMPLATE_SIGNERS_NAME = "name"; private static final String TEMPLATE_CCS = "ccs"; private static final String TEMPLATE_CCS_EMAIL = "email_address"; + private static final String TEMPLATE_APPENDED_FILE = "file"; + private static final String TEMPLATE_APPENDED_FILE_URL = "file_url"; + // Signers, CC email addresses and custom fields are required // to have an associated role. We'll manage these in a Map, @@ -255,6 +262,17 @@ public Map getPostFields() throws HelloSignException { if (hasMessage()) { fields.put(REQUEST_MESSAGE, getMessage()); } + + List docs = getDocuments(); + for (int i = 0; i < docs.size(); i++) { + Document d = docs.get(i); + fields.put(TEMPLATE_APPENDED_FILE + "[" + i + "]", d.getFile()); + } + List fileUrls = getFileUrls(); + for (int i = 0; i < fileUrls.size(); i++) { + fields.put(TEMPLATE_APPENDED_FILE_URL + "[" + i + "]", fileUrls.get(i)); + } + if (hasRedirectUrl()) { fields.put(REQUEST_REDIRECT_URL, getRedirectUrl()); } diff --git a/src/test/java/com/hellosign/sdk/HelloSignClientTest.java b/src/test/java/com/hellosign/sdk/HelloSignClientTest.java index 84b5bd5f..d628562b 100644 --- a/src/test/java/com/hellosign/sdk/HelloSignClientTest.java +++ b/src/test/java/com/hellosign/sdk/HelloSignClientTest.java @@ -102,14 +102,6 @@ protected String getTestFileAsString(String name) throws FileNotFoundException { return result; } - protected File getTestFixture(String name) { - String path = System.getProperty("file.separator") + this.getClass().getSimpleName() - + System.getProperty("file.separator") + "Fixtures" + System - .getProperty("file.separator") + name; - URL resource = this.getClass().getResource(path); - return new File(resource.getFile()); - } - protected void mockResponseCode(int code) { doReturn(code).when(spy).getLastResponseCode(); } @@ -997,7 +989,7 @@ public void testSignatureRequestWithFormFields() Document nda = new Document(); - File file = this.getTestFixture("W9.pdf"); + File file = TestUtils.getTestFixture(getClass(), "W9.pdf"); nda.setFile(file); FormField text = new FormField(); diff --git a/src/test/java/com/hellosign/sdk/PostFieldsTest.java b/src/test/java/com/hellosign/sdk/PostFieldsTest.java index d64486d2..6ebc72cc 100644 --- a/src/test/java/com/hellosign/sdk/PostFieldsTest.java +++ b/src/test/java/com/hellosign/sdk/PostFieldsTest.java @@ -1,12 +1,11 @@ package com.hellosign.sdk; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static com.hellosign.sdk.TestUtils.getTestFixture; +import static org.junit.Assert.*; -import com.hellosign.sdk.resource.EmbeddedRequest; -import com.hellosign.sdk.resource.SignatureRequest; -import com.hellosign.sdk.resource.TemplateDraft; -import com.hellosign.sdk.resource.UnclaimedDraft; +import com.hellosign.sdk.resource.*; + +import java.io.File; import java.io.Serializable; import java.util.HashMap; import java.util.Map; @@ -63,6 +62,49 @@ public void testEmbeddedSignatureRequest() throws Exception { assertEquals("http://www.orimi.com/pdf-test.pdf", postFields.get("file_url[0]")); } + @Test + public void testEmbeddedTemplateSignatureRequestWithFiles() throws Exception { + TemplateSignatureRequest req = new TemplateSignatureRequest(); + req.addFile(getTestFixture(getClass(), "Sample1.pdf")); + req.addFile(getTestFixture(getClass(), "Sample2.pdf")); + req.setSigner("Role A", "ted@example.com", "Ted Example"); + req.setTestMode(true); + req.addMetadata("test_key", "test_value"); + + EmbeddedRequest embeddedReq = new EmbeddedRequest("034fb51064187cf28e4aad1c2533ad8f", req); + + Map postFields = embeddedReq.getPostFields(); + assertEquals("ted@example.com", postFields.get("signers[Role A][email_address]")); + assertEquals("Ted Example", postFields.get("signers[Role A][name]")); + assertEquals("test_value", postFields.get("metadata[test_key]")); + assertEquals(true, postFields.get("test_mode")); + assertEquals("034fb51064187cf28e4aad1c2533ad8f", postFields.get("client_id")); + assertTrue(((File) postFields.get("file[0]")).getName().contentEquals("Sample1.pdf")); + assertTrue(((File) postFields.get("file[1]")).getName().contentEquals("Sample2.pdf")); + } + + + @Test + public void testEmbeddedTemplateSignatureRequestWithFileUrls() throws Exception { + TemplateSignatureRequest req = new TemplateSignatureRequest(); + req.addFileUrl("http://www.orimi.com/pdf-test.pdf"); + req.addFileUrl("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"); + req.setSigner("Role A", "ted@example.com", "Ted Example"); + req.setTestMode(true); + req.addMetadata("test_key", "test_value"); + + EmbeddedRequest embeddedReq = new EmbeddedRequest("034fb51064187cf28e4aad1c2533ad8f", req); + + Map postFields = embeddedReq.getPostFields(); + assertEquals("ted@example.com", postFields.get("signers[Role A][email_address]")); + assertEquals("Ted Example", postFields.get("signers[Role A][name]")); + assertEquals("test_value", postFields.get("metadata[test_key]")); + assertEquals(true, postFields.get("test_mode")); + assertEquals("034fb51064187cf28e4aad1c2533ad8f", postFields.get("client_id")); + assertEquals(postFields.get("file_url[0]"), "http://www.orimi.com/pdf-test.pdf"); + assertEquals(postFields.get("file_url[1]"), "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"); + } + @Test public void testCustomFieldsOnEmbeddedRequest() throws Exception { SignatureRequest req = new SignatureRequest(); diff --git a/src/test/java/com/hellosign/sdk/TestUtils.java b/src/test/java/com/hellosign/sdk/TestUtils.java new file mode 100644 index 00000000..4ede01fb --- /dev/null +++ b/src/test/java/com/hellosign/sdk/TestUtils.java @@ -0,0 +1,15 @@ +package com.hellosign.sdk; + +import java.io.File; +import java.net.URL; + +public class TestUtils { + + public static File getTestFixture(Class testClass, String name) { + String path = System.getProperty("file.separator") + testClass.getSimpleName() + + System.getProperty("file.separator") + "Fixtures" + System + .getProperty("file.separator") + name; + URL resource = testClass.getResource(path); + return new File(resource.getFile()); + } +} diff --git a/src/test/resources/PostFieldsTest/Fixtures/Sample1.pdf b/src/test/resources/PostFieldsTest/Fixtures/Sample1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c29046843b97affc3ea6c3286d3108c95ed8124d GIT binary patch literal 10797 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 ai|#qQz?@tzb`=B!gMhd!EHY}cxc?94LnZ3~ literal 0 HcmV?d00001 diff --git a/src/test/resources/PostFieldsTest/Fixtures/Sample2.pdf b/src/test/resources/PostFieldsTest/Fixtures/Sample2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c29046843b97affc3ea6c3286d3108c95ed8124d GIT binary patch literal 10797 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 ai|#qQz?@tzb`=B!gMhd!EHY}cxc?94LnZ3~ literal 0 HcmV?d00001