public async Task<SignatureRequest> SendWithTemplateAsync(SignatureRequestFromTemplateRequest request)
        {
            SignatureRequestWrapper signatureRequestWrapper = await helloSignService.MakeRequestAsync<SignatureRequestWrapper>(
                settings.HelloSignSettings.Endpoints.SignatureRequest.SendWithTemplate,
                request);

            return signatureRequestWrapper.SignatureRequest;
        }
        public async Task SendWithFullTemplateTest()
        {
            if (string.IsNullOrEmpty(Config.FullOrderedTemplateId))
            {
                Assert.Inconclusive("Config.FullTemplateId needs to be set before running this test");
                return;
            }

            var fullTemplate = await client.Template.GetAsync(Config.FullOrderedTemplateId);

            Assert.IsNotNull(fullTemplate);

            Assert.IsTrue(fullTemplate.SignerRoles.Count > 1, "FullTemplate should have multiple signatures");

            var signers = new Dictionary<string, SignatureRequestSignerRoleRequest>();

            for (var i = 0; i < fullTemplate.SignerRoles.Count; i++)
            {
                var role = fullTemplate.SignerRoles[i];
                signers.Add(role.Name, new SignatureRequestSignerRoleRequest() { Name = string.Format("TestName{0}", i), EmailAddress = string.Format("test{0}@test.com", i) });
            }

            var customFields = new Dictionary<string, object>();
            var iField = 0;

            var sourceFields = fullTemplate.Documents.SelectMany(d => d.CustomFields);

            if (!sourceFields.Any(f => f.Type == FieldTypes.Checkbox) || !sourceFields.Any(f => f.Type == FieldTypes.Text))
            {
                Assert.Inconclusive("FullTemplate should have at least one text and one checkbox field for conclusive test");
            }

            foreach (var field in fullTemplate.Documents.SelectMany(d => d.CustomFields))
            {
                iField++;

                if (field.Type == FieldTypes.Checkbox)
                    customFields.Add(field.Name, true);
                else
                    customFields.Add(field.Name, string.Format("TestFieldValue{0}", iField));
            }

            var ccs = new Dictionary<string, string>();

            var iCC = 0;
            foreach (var roles in fullTemplate.CcRoles)
            {
                ccs.Add(roles.Name, string.Format("testcc{0}@test.com", iCC++));
            }

            if (ccs.Count < 2)
            {
                Assert.Inconclusive("FullTemplate should have at least two cc fields for conclusive test");
            }

            var sendRequest = new SignatureRequestFromTemplateRequest
            {
                TestMode = 1,
                TemplateIds = new List<string> { Config.FullOrderedTemplateId },
                Title = "Test Custom Title",
                Subject = "Test Custom Subject",
                Message = "Test Custom Message",
                Signers = signers,
                CustomFields = customFields,
                Ccs = ccs,
                //ClientId = "",
                Metadata = new Dictionary<string, string>
                {
                    { "isHelloSignApiTest", "true" },
                    { "testkey1", "testdata1" },
                    { "testkey2", "testdata2" }
                },
                SigningRedirectUrl = "http://test.com/redirect"
            };

            var signatureRequest = await client.SignatureRequest.SendWithTemplateAsync(sendRequest);

            Assert.IsNotNull(signatureRequest);
            Assert.IsNotNull(signatureRequest.SignatureRequestId);

            try
            {
                Assert.AreNotEqual(string.Empty, signatureRequest.SignatureRequestId);
                Assert.AreEqual("Test Custom Title", signatureRequest.Title);
                Assert.AreEqual("Test Custom Subject", signatureRequest.Subject);
                Assert.AreEqual("Test Custom Message", signatureRequest.Message);
                Assert.AreEqual(Config.Username, signatureRequest.RequesterEmailAddress);
                Assert.AreEqual("http://test.com/redirect", signatureRequest.SigningRedirectUrl);
                Assert.AreEqual(true, signatureRequest.TestMode);
                Assert.IsNotNull(signatureRequest.DetailsUrl);
                Assert.AreNotEqual(string.Empty, signatureRequest.DetailsUrl);
                Assert.IsNotNull(signatureRequest.FilesUrl);
                Assert.AreNotEqual(string.Empty, signatureRequest.FilesUrl);
                Assert.AreEqual(false, signatureRequest.HasError);
                Assert.AreEqual(false, signatureRequest.IsComplete);
                Assert.IsNotNull(signatureRequest.SigningUrl);
                Assert.AreNotEqual(string.Empty, signatureRequest.SigningUrl);


                Assert.IsNotNull(signatureRequest.ResponseData);
                Assert.AreEqual(0, signatureRequest.ResponseData.Count);
                Assert.IsNotNull(signatureRequest.Metadata);
                Assert.AreEqual(3, signatureRequest.Metadata.Count);
                Assert.AreEqual("true", signatureRequest.Metadata?["isHelloSignApiTest"]);
                Assert.AreEqual("testdata1", signatureRequest.Metadata?["testkey1"]);
                Assert.AreEqual("testdata2", signatureRequest.Metadata?["testkey2"]);


                Assert.AreEqual(signers.Count, signatureRequest.Signatures.Count);

                // Not Ideal, but since we can't really control the template, check based on template
                // versus literal values
                foreach (var signature in signatureRequest.Signatures)
                {
                    var signerEntry = signers.FirstOrDefault(s => s.Value.EmailAddress == signature.SignerEmailAddress);

                    Assert.IsNotNull(signerEntry);
                    Assert.AreEqual(!string.IsNullOrEmpty(signerEntry.Value.Pin), signature.HasPin);
                    Assert.IsNull(signature.LastRemindedAt);
                    Assert.IsNull(signature.LastViewedAt);

                    var role = fullTemplate.SignerRoles.FirstOrDefault(r => r.Name == signerEntry.Key);
                    Assert.AreEqual(role.Order, signature.Order);

                    Assert.IsNotNull(signature.SignatureId);
                    Assert.IsNull(signature.SignedAt);
                    Assert.AreEqual(signerEntry.Value.EmailAddress, signature.SignerEmailAddress);
                    Assert.AreEqual(signerEntry.Value.Name, signature.SignerName);
                    Assert.AreEqual(SignatureStatusCodes.AwaitingSignature, signature.StatusCode);
                }

                Assert.IsNotNull(signatureRequest.CustomFields);
                Assert.AreEqual(sourceFields.Count(), signatureRequest.CustomFields.Count);

                foreach (var field in signatureRequest.CustomFields)
                {
                    var source = sourceFields.FirstOrDefault(sf => sf.Name == field.Name);
                    var sentField = customFields.FirstOrDefault(cf => cf.Key == field.Name);

                    Assert.IsNotNull(source);
                    Assert.IsNotNull(sentField);
                    Assert.AreEqual(source.Name, field.Name);
                    Assert.AreEqual(source.Type, field.Type);
                    Assert.AreEqual(sentField.Value, field.Value);
                }

                Assert.IsNotNull(signatureRequest.CcEmailAddresses);
                Assert.AreEqual(ccs.Count(), signatureRequest.CcEmailAddresses.Count);

                foreach (var cc in signatureRequest.CcEmailAddresses)
                {
                    var sourceCC = ccs.FirstOrDefault(c => c.Value == cc);

                    Assert.IsNotNull(sourceCC);
                    Assert.AreEqual(sourceCC.Value, cc);
                }
            }
            finally
            {
                var result = await client.SignatureRequest.CancelAsync(signatureRequest.SignatureRequestId);
                Assert.IsTrue(result);
            }
        }
        public async Task SendWithSimpleTemplateTest()
        {
            if (string.IsNullOrEmpty(Config.SimpleUnorderedTemplateId))
            {
                Assert.Inconclusive("Config.SimpleTemplateId needs to be set before running this test");
                return;
            }

            var template = await client.Template.GetAsync(Config.SimpleUnorderedTemplateId);

            Assert.IsNotNull(template);

            if (template.SignerRoles.Count != 1)
            {
                Assert.Inconclusive("Template specified by Config.SimpleTemplateId must have only one SignerRole defined");
                return;
            }

            var sendRequest = new SignatureRequestFromTemplateRequest
            {
                TestMode = 1,
                TemplateIds = new List<string> { Config.SimpleUnorderedTemplateId },
                Signers = new Dictionary<string, SignatureRequestSignerRoleRequest>()
                {
                    { template.SignerRoles[0].Name, new SignatureRequestSignerRoleRequest { Name = "TestName1", EmailAddress = "*****@*****.**" } },
                }
            };

            var signatureRequest = await client.SignatureRequest.SendWithTemplateAsync(sendRequest);

            Assert.IsNotNull(signatureRequest);
            Assert.IsNotNull(signatureRequest.SignatureRequestId);

            try
            {
                Assert.AreEqual(template.Title, signatureRequest.Title);
                Assert.AreEqual(template.Message, signatureRequest.Message);
                Assert.AreEqual(1, signatureRequest.Signatures.Count);
                Assert.IsNull(signatureRequest.Signatures[0].Order);
                Assert.AreEqual("*****@*****.**", signatureRequest.Signatures[0].SignerEmailAddress);
                Assert.AreEqual("TestName1", signatureRequest.Signatures[0].SignerName);
                Assert.AreEqual(false, signatureRequest.Signatures[0].HasPin);
                Assert.AreEqual(SignatureStatusCodes.AwaitingSignature, signatureRequest.Signatures[0].StatusCode);
                Assert.IsNotNull(signatureRequest.CustomFields);
                Assert.AreEqual(template.Documents.Sum(d => d.CustomFields.Count), signatureRequest.CustomFields.Count);
                Assert.IsNotNull(signatureRequest.CcEmailAddresses);
                Assert.AreEqual(template.CcRoles.Count, signatureRequest.CcEmailAddresses.Count);
            }
            finally
            {

                var result = await client.SignatureRequest.CancelAsync(signatureRequest.SignatureRequestId);
                Assert.IsTrue(result);
            }
        }