UNPKG

boldsign

Version:

NodeJS client for boldsign

1,113 lines (1,109 loc) 74 kB
import { DocumentApi } from '../../api/documentApi'; import { BrandingApi } from '../../api/brandingApi'; import { AccessCodeDetail, AccessCodeDetails, AuthenticationSettings, DocumentCC, DocumentSigner, DocumentTags, EmbeddedDocumentRequest, ExtendExpiry, FormField, Rectangle, ReminderMessage, ReminderSettings, RemoveAuthentication, RevokeDocument, SendForSign } from '../../model'; import * as fs from 'fs'; import config from '../config'; function imageToBase64(imagePath) { const imageBuffer = fs.readFileSync(imagePath); const imageType = imagePath.substring(imagePath.lastIndexOf('.') + 1); return `data:image/${imageType};base64,${imageBuffer.toString('base64')}`; } describe('Document API Test Suite', () => { let brandingApi:BrandingApi; let documentApi:DocumentApi; let brandId; let createdDocumentId; let sendDocumentOnBehalfId:any let senderEmail; const generateRandomEmail = () => { const randomNum = Math.floor(1000 + Math.random() * 9000); return `sdktesting${randomNum}@syncfusion.com`; }; beforeAll(() => { createdDocumentId = null; sendDocumentOnBehalfId = null; senderEmail = null; const apiKey = config.apiKey; const baseUrl = config.baseUrl; if (!apiKey || !baseUrl) { throw new Error("Environment variables 'API_KEY' or 'HOST_URL' are not set."); } documentApi = new DocumentApi(baseUrl); documentApi.setApiKey(apiKey); brandingApi = new BrandingApi(baseUrl); brandingApi.setApiKey(apiKey); }); test('Test1: should fetch sender email details', async () => { try { const page = 1; const pageSize = 10; const listDocumentsResponse = await documentApi.listDocuments( page, undefined, undefined, undefined,undefined, pageSize, undefined, undefined, undefined, undefined, undefined, undefined, undefined ); senderEmail = listDocumentsResponse?.result?.[0]?.senderDetail?.emailAddress; console.log("Sender email fetched:", senderEmail ?? 'Not available'); expect(listDocumentsResponse.result).toBeDefined(); } catch (error:any) { console.error("Error occurred while fetching sender details:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test2: should create a brand successfully with audit trail', async () => { const brandName = "NodeSDK"; const brandLogo = fs.createReadStream("tests/documents/logo.jpg"); const backgroundColor = "Blue"; const buttonColor = "Black"; const buttonTextColor = "White"; const emailDisplayName = "{SenderName} from Syncfusion"; const auditTrail = "true"; const disclaimerTitle = "Important Disclaimer"; try { const createBrandApiResponse = await brandingApi.createBrand( brandName, brandLogo, backgroundColor, buttonColor, buttonTextColor, emailDisplayName, auditTrail, disclaimerTitle ); console.log("Brand created successfully:", createBrandApiResponse.brandId); brandId = createBrandApiResponse.brandId; expect(createBrandApiResponse).toBeDefined(); } catch (error) { console.log("Error occurred while creating the brand:", error); expect(error).toBeUndefined(); } }, 20000); test('Test3: should send a document for signing successfully with existing brand ID and one signer', async () => { try { const signer1 = new DocumentSigner(); signer1.name = 'Test Signer'; signer1.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer1.signerOrder = 1; signer1.signerType = DocumentSigner.SignerTypeEnum.Signer; signer1.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer1.authenticationCode = '123456'; signer1.authenticationSettings = { authenticationFrequency: AuthenticationSettings.AuthenticationFrequencyEnum.EveryAccess }; const formField1 = new FormField(); formField1.name = 'Sign'; formField1.fieldType = FormField.FieldTypeEnum.Signature; formField1.font = FormField.FontEnum.Helvetica; formField1.pageNumber = 1; formField1.isRequired = true; formField1.bounds = new Rectangle(); signer1.formFields = [formField1]; signer1.privateMessage = 'This is a private message for signer'; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.files = [fs.createReadStream('tests/documents/agreement.pdf')]; sendDocumentRequest.enablePrintAndSign = true; sendDocumentRequest.signers = [signer1]; sendDocumentRequest.brandId = brandId; sendDocumentRequest.message = 'Please sign this document'; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); const createdDocumentId = sendDocumentResponse.documentId; expect(sendDocumentResponse.documentId).toBeDefined(); } catch (error) { console.error('Error occurred while sending document for signing:', error); expect(error).toBeUndefined(); } }, 20000); test('Test4: should send a document for signing successfully', async () => { try { const signer1 = new DocumentSigner(); signer1.name = 'Test Signer'; signer1.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer1.signerOrder = 1; signer1.signerType = DocumentSigner.SignerTypeEnum.Signer; signer1.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer1.authenticationCode = '123456'; signer1.authenticationSettings = { authenticationFrequency: AuthenticationSettings.AuthenticationFrequencyEnum.OncePerDocument }; const formField1 = new FormField(); formField1.name = 'Sign'; formField1.fieldType = FormField.FieldTypeEnum.Signature; formField1.font = FormField.FontEnum.Helvetica; formField1.pageNumber = 1; formField1.isRequired = true; formField1.bounds = new Rectangle(); signer1.formFields = [formField1]; signer1.privateMessage = 'This is private message for signer'; const signer2 = new DocumentSigner(); signer2.name = 'Test Reviewer'; signer2.emailAddress = 'mohammedmushraf.abuthakir+5@syncfusion.com'; signer2.signerOrder = 2; signer2.signerType = DocumentSigner.SignerTypeEnum.Reviewer; signer2.authenticationType = DocumentSigner.AuthenticationTypeEnum.EmailOtp; signer2.privateMessage = 'This is private message for Reviewer'; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.files = [ fs.createReadStream('tests/documents/agreement.pdf'), ]; sendDocumentRequest.enablePrintAndSign = true; sendDocumentRequest.signers = [signer1, signer2]; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); createdDocumentId = sendDocumentResponse.documentId; console.log('Created Document ID:', createdDocumentId); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeUndefined(); } },20000); test('Test5: should send a document for signing successfully with inperson signer', async () => { try { console.log("Sender email fetched:", senderEmail ); const signer1 = new DocumentSigner(); signer1.name = 'Test Signer'; signer1.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer1.signerOrder = 1; signer1.signerType = DocumentSigner.SignerTypeEnum.Signer; signer1.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer1.authenticationCode = '123456'; signer1.authenticationSettings = { authenticationFrequency: AuthenticationSettings.AuthenticationFrequencyEnum.UntilSignCompleted }; const formField1 = new FormField(); formField1.name = 'Sign'; formField1.fieldType = FormField.FieldTypeEnum.Signature; formField1.font = FormField.FontEnum.Helvetica; formField1.pageNumber = 1; formField1.isRequired = true; formField1.bounds = new Rectangle(); signer1.formFields = [formField1]; signer1.privateMessage = 'This is private message for signer'; signer1.recipientNotificationSettings = { signatureRequest: true, declined: true, revoked: true, signed: true, completed: true, expired: true, reassigned: true, deleted: true, reminders: true, editRecipient: true }; const signer2 = new DocumentSigner(); signer2.name = 'Test Reviewer'; signer2.emailAddress = 'mohammedmushraf.abuthakir+5@syncfusion.com'; signer2.signerOrder = 2; signer2.signerType = DocumentSigner.SignerTypeEnum.Reviewer; signer2.authenticationType = DocumentSigner.AuthenticationTypeEnum.EmailOtp; signer2.authenticationSettings = { authenticationFrequency: AuthenticationSettings.AuthenticationFrequencyEnum.None }; signer2.privateMessage = 'This is private message for Reviewer'; signer2.phoneNumber = { countryCode: '+91', number: '6381261236' }; signer2.deliveryMode = DocumentSigner.DeliveryModeEnum.EmailAndSms; const signer3 = new DocumentSigner(); signer3.name = 'Test In-Person Signer'; signer3.emailAddress = 'mohammedmushraf.abuthakir+4@syncfusion.com'; signer3.signerOrder = 3; signer3.signerType = DocumentSigner.SignerTypeEnum.InPersonSigner; signer3.hostEmail = senderEmail; signer3.authenticationType = DocumentSigner.AuthenticationTypeEnum.EmailOtp; const formField2 = new FormField(); formField2.name = 'Sign'; formField2.fieldType = FormField.FieldTypeEnum.Signature; formField2.font = FormField.FontEnum.Helvetica; formField2.pageNumber = 1; formField2.isRequired = true; formField2.bounds = new Rectangle(); signer3.formFields = [formField2]; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.files = [fs.createReadStream('tests/documents/agreement.pdf')]; sendDocumentRequest.enablePrintAndSign = true; sendDocumentRequest.hideDocumentId = true; sendDocumentRequest.enableReassign = false; sendDocumentRequest.signers = [signer1, signer2, signer3]; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); const createdDocumentId = sendDocumentResponse.documentId; console.log('Created Document ID:', createdDocumentId); } catch (error) { console.error('Error occurred while sending document for signing:', error); expect(error).toBeUndefined(); } }, 20000); test('Test6: should send a document with multiple CCs successfully', async () => { try { const files = [ fs.createReadStream('tests/documents/agreement.pdf'), ]; const formFields: FormField[] = []; const signatureField = new FormField(); signatureField.pageNumber = 1; signatureField.bounds = new Rectangle(); signatureField.bounds.x = 100; signatureField.bounds.y = 100; signatureField.bounds.width = 100; signatureField.bounds.height = 50; formFields.push(signatureField); const signers: DocumentSigner[] = []; const signer1 = new DocumentSigner(); signer1.name = 'Mohammed'; signer1.emailAddress = 'mohammedmushraf.abuthakir+88@syncfusion.com'; signer1.signerRole = 'SIGNER'; signer1.formFields = formFields; signers.push(signer1); const signer2 = new DocumentSigner(); signer2.name = 'Mohammed'; signer2.emailAddress = 'mohammedmushraf.abuthakir+80@syncfusion.com'; signer2.signerRole = 'SIGNER'; signer2.formFields = formFields; signers.push(signer2); const ccList: DocumentCC[] = []; for (let i = 1; i <= 20; i++) { const cc = new DocumentCC(); cc.emailAddress = `mohammedmushraf.abuthakir+${i + 2}@syncfusion.com`; ccList.push(cc); } const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Agreement Document'; sendDocumentRequest.files = files; sendDocumentRequest.signers = signers; sendDocumentRequest.cc = ccList; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); const hasSyncfusionCC = ccList.some(cc => cc.emailAddress.includes('@syncfusion.com')); const createdDocumentId = sendDocumentResponse.documentId; console.log('Document sent successfully with document ID:', createdDocumentId); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeUndefined(); } }, 20000); test('Test7: should send a document with multiple files for signing successfully', async () => { try { const files = [ fs.createReadStream('tests/documents/agreement.pdf'), fs.createReadStream('tests/documents/agreement.pdf'), fs.createReadStream('tests/documents/agreement.pdf'), fs.createReadStream('tests/documents/agreement.pdf'), ]; const formFields: FormField[] = []; const signatureField = new FormField(); signatureField.pageNumber = 1; signatureField.bounds = new Rectangle(); signatureField.bounds.x = 100; signatureField.bounds.y = 100; signatureField.bounds.width = 100; signatureField.bounds.height = 50; formFields.push(signatureField); const signers: DocumentSigner[] = []; const signer1 = new DocumentSigner(); signer1.name = 'Signer1'; signer1.emailAddress = 'mohammedmushraf.abuthakir+5@syncfusion.com'; signer1.formFields = formFields; signers.push(signer1); const signer2 = new DocumentSigner(); signer2.name = 'Signer2'; signer2.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer2.formFields = formFields; signers.push(signer2); const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Agreement with Multiple Files'; sendDocumentRequest.files = files; sendDocumentRequest.signers = signers; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); const createdDocumentId = sendDocumentResponse.documentId; console.log('Created Document ID:', createdDocumentId); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeUndefined(); } },20000); test('Test8: should send a document with many signers successfully', async () => { try { const files = [ fs.createReadStream('tests/documents/agreement.pdf'), ]; const formFields: FormField[] = []; const signatureField = new FormField(); signatureField.pageNumber = 1; signatureField.bounds = new Rectangle(); signatureField.bounds.x = 100; signatureField.bounds.y = 100; signatureField.bounds.width = 100; signatureField.bounds.height = 50; formFields.push(signatureField); const signers: DocumentSigner[] = []; for (let i = 0; i < 15; i++) { const signer = new DocumentSigner(); signer.name = `Signer${i}`; signer.emailAddress = `mohammedmushraf.abuthakir+${i}@syncfusion.com`; signer.formFields = formFields; signers.push(signer); } const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Agreement'; sendDocumentRequest.files = files; sendDocumentRequest.signers = signers; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); console.log('Created Document ID:', sendDocumentResponse.documentId); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeUndefined(); } },20000); test('Test9: should fail to create document with no signers', async () => { try { const sendForSign = { title: 'Agreement', files: [ fs.createReadStream('tests/documents/agreement.pdf'), ], signers: [], }; const response = await documentApi.sendDocument(sendForSign); console.error('Expected error for missing signers, but document was created:', response); } catch (error:any) { console.error('Error occurred while creating document:', error.message); expect(error.message).toBeDefined(); } },20000); test('Test10: should fail to send a document for signing with an empty email address', async () => { try { const signer1 = new DocumentSigner(); signer1.name = 'Test Signer'; signer1.emailAddress = ''; signer1.signerOrder = 1; signer1.signerType = DocumentSigner.SignerTypeEnum.Signer; signer1.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer1.authenticationCode = '123456'; const formField1 = new FormField(); formField1.name = 'Sign'; formField1.fieldType = FormField.FieldTypeEnum.Signature; formField1.font = FormField.FontEnum.Helvetica; formField1.pageNumber = 1; formField1.isRequired = true; formField1.bounds = new Rectangle(); signer1.formFields = [formField1]; signer1.privateMessage = 'This is private message for signer'; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.files = [ fs.createReadStream('tests/documents/agreement.pdf'), ]; sendDocumentRequest.enablePrintAndSign = true; sendDocumentRequest.signers = [signer1]; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); console.log('Created Document ID:', createdDocumentId); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeDefined(); } },20000); test('Test11: should fail to send a document for signing with an invalid email address', async () => { try { const signer1 = new DocumentSigner(); signer1.name = 'Signer'; signer1.emailAddress = 'invalid-email.com'; signer1.signerType = DocumentSigner.SignerTypeEnum.Signer; const signer2 = new DocumentSigner(); signer2.name = 'Signer1'; signer2.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer2.signerOrder = 2; signer2.signerType = DocumentSigner.SignerTypeEnum.Signer; const formField1 = new FormField(); formField1.name = 'Sign'; formField1.fieldType = FormField.FieldTypeEnum.Signature; formField1.font = FormField.FontEnum.Helvetica; formField1.pageNumber = 1; formField1.isRequired = true; formField1.bounds = new Rectangle(); signer1.formFields = [formField1]; signer2.formFields = [formField1]; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Agreement'; sendDocumentRequest.files = [ fs.createReadStream('tests/documents/agreement.pdf'), ]; sendDocumentRequest.enablePrintAndSign = true; sendDocumentRequest.signers = [signer1, signer2]; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse).toBeUndefined(); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeDefined(); } },20000); test('Test12: should retrieve embedded sign link successfully', async () => { try { const documentId = createdDocumentId; const signerEmail = "mohammedmushraf.abuthakir+6@syncfusion.com"; const countryCode = "+91"; const phoneNumber = ""; const signLinkValidTill = new Date("2025-03-03T00:00:00+00:00"); const redirectUrl = "https://www.syncfusion.com/"; const response = await documentApi.getEmbeddedSignLink( documentId, signerEmail, countryCode, phoneNumber, signLinkValidTill, redirectUrl ); expect(response.signLink).toBeDefined(); } catch (error:any) { console.error('Error occurred while getting the embedded signing link:', error.message); expect(error.message).toBeUndefined(); } },20000); test('Test13: should fail to retrieve embedded sign link with invalid document id', async () => { try { const signerEmail = "divya.boopathy+30@syncfusion.com"; const countryCode = "+91"; const phoneNumber = ""; const signLinkValidTill = new Date("2023-01-01T00:00:00+00:00"); const redirectUrl = "https://www.syncfusion.com/"; const invalidDocumentId = "invalid-document-id"; const response = await documentApi.getEmbeddedSignLink( invalidDocumentId, signerEmail, countryCode, phoneNumber, signLinkValidTill, redirectUrl ); console.error('Test failed: Response should not have succeeded with invalid document ID'); expect(response).toBeUndefined(); } catch (error:any) { console.error('Error occurred while getting the embedded signing link:', error.message); expect(error.message).toBeDefined(); } },20000); test('Test14: should fail to retrieve embedded sign link with invalid email id', async () => { try { const documentId =createdDocumentId; const invalidSignerEmail = "invalid-emailid"; const countryCode = "+91"; const phoneNumber = ""; const signLinkValidTill = new Date("2025-03-03T00:00:00+00:00"); const redirectUrl = "https://www.syncfusion.com/"; const response = await documentApi.getEmbeddedSignLink( documentId, invalidSignerEmail, countryCode, phoneNumber, signLinkValidTill, redirectUrl ); console.error('Test failed: Response should not have succeeded with invalid email ID'); } catch (error:any) { console.error('Error occurred while getting the embedded signing link:', error.message); expect(error.message).toBeDefined(); } },20000); test('Test15: should throw an error for list document invalid page number and page size', async () => { const page = -1; const invalidPageSize = 250; try { await documentApi.listDocuments(page,undefined,undefined,undefined,undefined,invalidPageSize,undefined,undefined,undefined,undefined,undefined,undefined,undefined); throw new Error("Expected an ApiException to be thrown due to invalid page number or page size."); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test16:should fetch behalf documents successfully', async () => { const page = 1; try { const behalfDocumentResponse = await documentApi.behalfDocuments(page); console.log("Behalf Documents fetched successfully:", behalfDocumentResponse); expect(behalfDocumentResponse.result).toBeDefined; } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test17:should fail to fetch behalf documents due to invalid page number', async () => { const invalidPage = -1; try { const behalfDocumentResponse = await documentApi.behalfDocuments(invalidPage); console.error("Expected an error, but the response was:", behalfDocumentResponse); throw new Error("Expected an error, but got a response."); } catch (error:any) { console.log("Error occurred while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test18:should fetch team documents successfully', async () => { const page = 1; try { const teamDocumentResponse = await documentApi.teamDocuments(page); console.log("Team Documents fetched successfully:", teamDocumentResponse); expect(teamDocumentResponse.result).toBeDefined; } catch (error:any) { console.error("Error occurred while fetching team documents:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test19:should fail to fetch team documents with invalid page number', async () => { const invalidPage = -1; try { const teamDocumentResponse = await documentApi.teamDocuments(invalidPage); throw new Error("Expected API call to fail but it succeeded"); } catch (error:any) { console.error("Error occurred while fetching team documents:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test20:should remove authentication successfully from the document', async () => { const documentId = createdDocumentId; const emailId = "mohammedmushraf.abuthakir+5@syncfusion.com"; const removeAuthentication = new RemoveAuthentication(); removeAuthentication.emailId = emailId; try { const response = await documentApi.removeAuthentication(documentId, removeAuthentication); console.log("Authentication removed successfully:", response); } catch (error:any) { console.error("Error occurred while removing authentication:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test21:should fail to remove authentication from the document with invalid data', async () => { const documentId = "invalid-document-id"; const emailId = "mohammedmushraf.abuthakir+5@syncfusion.com"; const removeAuthentication = new RemoveAuthentication(); removeAuthentication.emailId = emailId; try { const response = await documentApi.removeAuthentication(documentId, removeAuthentication); console.error("Authentication was unexpectedly removed:", response); } catch (error:any) { console.error("Expected error occurred while removing authentication:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test22:should add authentication to document successfully', async () => { const documentId = createdDocumentId; const accessCodeDetail = new AccessCodeDetail(); accessCodeDetail.authenticationType = AccessCodeDetail.AuthenticationTypeEnum.EmailOtp; accessCodeDetail.authenticationSettings = { authenticationFrequency: AuthenticationSettings.AuthenticationFrequencyEnum.EveryAccess }; accessCodeDetail.emailId = "mohammedmushraf.abuthakir+5@syncfusion.com"; try { const response = await documentApi.addAuthentication(documentId, accessCodeDetail); console.log("Authentication added successfully:", response); } catch (error:any) { console.error("Error occurred while adding authentication:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test23:should fail to add authentication to document due to invalid documentId', async () => { const invalidDocumentId = "invalid-document-id"; const accessCodeDetail = new AccessCodeDetail(); accessCodeDetail.authenticationType = AccessCodeDetail.AuthenticationTypeEnum.EmailOtp; accessCodeDetail.emailId = "mohammedmushraf.abuthakir+5@syncfusion.com"; try { const response = await documentApi.addAuthentication(invalidDocumentId, accessCodeDetail); } catch (error:any) { console.error("Expected error occurred while adding authentication:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test24:should fetch document properties', async () => { try { const response = await documentApi.getProperties(createdDocumentId); expect(response.documentId).toBeDefined(); } catch (error:any) { console.error("Error occurred while fetching document properties:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test25:should fail to fetch document properties with invalid document ID', async () => { const invalidDocumentId = "invalid-document-id"; try { const response = await documentApi.getProperties(invalidDocumentId); } catch (error:any) { console.error("Expected error occurred while fetching document properties:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test26:should fail to fetch document properties with invalid document ID', async () => { const invalidDocumentId = ""; try { const response = await documentApi.getProperties(invalidDocumentId); } catch (error:any) { console.error("Expected error occurred while fetching document properties:", error); expect(error).toBeDefined(); expect(error.response.status).toBe(400); expect(error.response.statusText).toBe('Bad Request'); } },20000); test('Test27:should extend document expiry successfully', async () => { try { const currentDate = new Date(); const newExpiryDate = new Date(currentDate.setMonth(currentDate.getMonth() + 3)); const newExpiryDateStr = newExpiryDate.toISOString().split('T')[0]; const extendExpiry = new ExtendExpiry(); extendExpiry.newExpiryValue = newExpiryDateStr; const response = await documentApi.extendExpiry(createdDocumentId, extendExpiry); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test28:should fail to extend document expiry due to invalid document ID', async () => { try { const currentDate = new Date(); const newExpiryDate = new Date(currentDate.setMonth(currentDate.getMonth() + 3)); const newExpiryDateStr = newExpiryDate.toISOString().split('T')[0]; const extendExpiry = new ExtendExpiry(); extendExpiry.newExpiryValue = newExpiryDateStr; const invalidDocumentId = "invalid-document-id"; await documentApi.extendExpiry(invalidDocumentId, extendExpiry); } catch (error:any) { console.log("Error occurred as expected:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test29: should send a reminder successfully with valid document ID', async () => { const reminderMessage = new ReminderMessage(); reminderMessage.message = "Please sign this soon"; const documentId = createdDocumentId; const receiverEmails = ["mohammedmushraf.abuthakir+5@syncfusion.com"]; try { const response = await documentApi.remindDocument(documentId, receiverEmails, reminderMessage); console.log("Reminder sent successfully:", response); } catch (error:any) { console.error("Error occurred while sending the reminder:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test30: should throw an error for invalid document ID while sending reminder', async () => { const reminderMessage = new ReminderMessage(); reminderMessage.message = "Please sign this soon"; const documentId = "invalid-document-id"; const receiverEmails = ["mohammedmushraf.abuthakir+5@syncfusion.com"]; try { await documentApi.remindDocument(documentId, receiverEmails, reminderMessage); } catch (error:any) { console.error("Error occurred while sending the reminder:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test31: should download document successfully', async () => { try { const documentId = createdDocumentId; const onBehalfOf = "mohammedmushraf.abuthakir+6@syncfusion.com"; const response = await documentApi.downloadDocument(documentId, onBehalfOf); console.log("Document downloaded successfully!"); } catch (error:any) { console.error("Error occurred while downloading the document:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test32:should fail to download document with invalid document ID', async () => { const invalidDocumentId = "invalid-document-id"; const onBehalfOf = "mohammedmushraf.abuthakir+6@syncfusion.com"; try { const response = await documentApi.downloadDocument(invalidDocumentId, onBehalfOf); } catch (error:any) { console.error("Error occurred while downloading the document:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test33:should change document access code successfully', async () => { const accessCodeDetails = new AccessCodeDetails(); accessCodeDetails.accessCode = "12345"; const documentId = createdDocumentId; const email = "mohammedmushraf.abuthakir+6@syncfusion.com"; try { const response = await documentApi.changeAccessCode(documentId, accessCodeDetails, email); console.log("Access code changed successfully:", response); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test34:should not change document access code due to invalid data', async () => { const accessCodeDetails = new AccessCodeDetails(); accessCodeDetails.accessCode = "123457"; const documentId = "invalidDocumentId"; const email = "mohammedmushraf.abuthakir+6@syncfusion.com"; try { const response = await documentApi.changeAccessCode(documentId, accessCodeDetails, email); } catch (error:any) { console.error("Expected error occurred while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test35:should successfully add tags to the document', async () => { const documentTags = new DocumentTags(); documentTags.documentId = createdDocumentId; documentTags.tags = ["test", "api"]; try { const response = await documentApi.addTag(documentTags); console.log("Tags added successfully!", response); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test36:should fail to add tags to the document due to invalid data', async () => { const documentTags = new DocumentTags(); documentTags.documentId = 'invalidDocumentId'; documentTags.tags = ["test", "api"]; try { const response = await documentApi.addTag(documentTags); } catch (error:any) { console.log("Error occurred as expected while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test37: should fail to add tags with an empty tag array', async () => { const documentTags = new DocumentTags(); documentTags.documentId = createdDocumentId; documentTags.tags = ["",""]; try { const response = await documentApi.addTag(documentTags); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test38:should successfully delete tags from the document', async function() { const documentTags = new DocumentTags(); documentTags.documentId = createdDocumentId; documentTags.tags = ["test", "api"]; try { const response = await documentApi.deleteTag(documentTags); console.log("Tags deleted successfully!"); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test39:should fail to delete tags from the document due to invalid document ID', async function() { const documentTags = new DocumentTags(); documentTags.documentId = "invalid-document-id"; documentTags.tags = ["test", "api"]; try { const response = await documentApi.deleteTag(documentTags); } catch (error:any) { console.log("Error occurred as expected:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test40: should fail to delete tags with an empty tag array', async function() { const documentTags = new DocumentTags(); documentTags.documentId = createdDocumentId; documentTags.tags = ["",""]; try { const response = await documentApi.deleteTag(documentTags); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test41: should change the recipient successfully', async () => { try { const oldSignerEmail = "mohammedmushraf.abuthakir+6@syncfusion.com"; const reason = "Wrongly sent"; const newSignerName = "Test Signer"; const newSignerEmail = "mohammedmushraf.abuthakir+15@syncfusion.com"; const changeRecipient = { oldSignerEmail: oldSignerEmail, reason: reason, newSignerName: newSignerName, newSignerEmail: newSignerEmail }; const response = await documentApi.changeRecipient(createdDocumentId, changeRecipient); console.log("Recipient change succeeded."); } catch (error:any) { console.error('Error occurred while changing the recipient:', error.message); expect(error.message).toBeUndefined(); } },20000); test('Test42: should fail to change the recipient with invalid document ID', async () => { try { const oldSignerEmail = "mohammedmushraf.abuthakir+6@syncfusion.com"; const reason = "Wrongly sent"; const newSignerName = "Test Signer"; const newSignerEmail = "mohammedmushraf.abuthakir+15@syncfusion.com"; const changeRecipient = { oldSignerEmail: oldSignerEmail, reason: reason, newSignerName: newSignerName, newSignerEmail: newSignerEmail }; const invalidDocumentId = "invalid-document-id"; const response = await documentApi.changeRecipient(invalidDocumentId, changeRecipient); } catch (error:any) { console.error('Error occurred while changing the recipient:', error.message); expect(error.message).toBeDefined(); } },20000); test('Test43:should revoke document successfully', async () => { const revokeDocumentRequest = new RevokeDocument(); revokeDocumentRequest.message = "This is document revoke message"; const documentId = createdDocumentId; try { const response = await documentApi.revokeDocument(documentId, revokeDocumentRequest); console.log("Document revoked successfully:", response); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test44:should fail to revoke document due to invalid document ID', async () => { const revokeDocumentRequest = new RevokeDocument(); revokeDocumentRequest.message = "This is document revoke message"; const invalidDocumentId = 'invalidDocumentId'; try { const response = await documentApi.revokeDocument(invalidDocumentId, revokeDocumentRequest); } catch (error:any) { console.log("Error occurred as expected while calling the API:", error.message); expect(error.message).toBeDefined(); } },20000); test('Test45:should delete document successfully', async () => { const validDocumentId = createdDocumentId; const deletePermanently = false; try { const response = await documentApi.deleteDocument(validDocumentId, deletePermanently); console.log("Document deleted successfully:", response); } catch (error:any) { console.error("Error occurred while calling the API:", error.message); expect(error.message).toBeUndefined(); } },20000); test('Test46:should fail to delete document due to invalid document ID', async () => { const invalidDocumentId = 'invalidDocumentId'; const deletePermanently = false; try { const response = await documentApi.deleteDocument(invalidDocumentId, deletePermanently); } catch (error:any) { console.log("Error occurred as expected while calling the API", error.message); expect(error.message).toBeDefined(); } },20000); test('Test47: should send a document with an image field successfully', async () => { try { const imagePath = 'tests/documents/logo.jpg'; const base64Image = imageToBase64(imagePath); const imageField = new FormField(); imageField.name = 'image_Test'; imageField.fieldType = FormField.FieldTypeEnum.Image; imageField.font = FormField.FontEnum.Helvetica; imageField.pageNumber = 1; imageField.isRequired = true; imageField.value = base64Image; imageField.imageInfo = { title: 'Image Test', allowedFileExtensions: '.jpg', description: 'Image for testing' }; imageField.bounds = new Rectangle(); imageField.bounds.x = 50; imageField.bounds.y = 50; imageField.bounds.width = 100; imageField.bounds.height = 150; const signer = new DocumentSigner(); signer.name = 'Test Signer'; signer.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer.signerOrder = 1; signer.signerType = DocumentSigner.SignerTypeEnum.Signer; signer.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer.authenticationCode = '123456'; signer.formFields = [imageField]; signer.privateMessage = 'This is private message for signer'; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.files = [ fs.createReadStream('tests/documents/agreement.pdf') ]; sendDocumentRequest.signers = [signer]; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); expect(sendDocumentResponse.documentId).toBeDefined(); } catch (error:any) { console.error('Error occurred while sending document with image field:', error.message); expect(error.message).toBeUndefined(); } },20000); test('Test48:should successfully send a document with a read-only checkbox field checked', async () => { try { const bounds = new Rectangle(); bounds.x = 50; bounds.y = 50; bounds.width = 100; bounds.height = 150; const checkboxField = new FormField(); checkboxField.id = 'CheckBox'; checkboxField.name = 'CheckBox'; checkboxField.fieldType = FormField.FieldTypeEnum.CheckBox; checkboxField.font = FormField.FontEnum.Helvetica; checkboxField.value = 'on'; checkboxField.pageNumber = 1; checkboxField.isReadOnly = true; checkboxField.bounds = bounds; const documentSigner = new DocumentSigner(); documentSigner.name = 'Test Signer'; documentSigner.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusuion.com'; documentSigner.signerOrder = 1; documentSigner.signerType = DocumentSigner.SignerTypeEnum.Signer; documentSigner.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; documentSigner.authenticationCode = '123456'; documentSigner.formFields = [checkboxField]; const sendForSign = new SendForSign(); sendForSign.title = 'Document SDK API'; sendForSign.signers = [documentSigner]; const files = fs.createReadStream('tests/documents/agreement.pdf'); sendForSign.files = [files]; const sendDocumentResponse = await documentApi.sendDocument(sendForSign); expect(sendDocumentResponse.documentId).toBeDefined(); console.log('Document sent successfully:', sendDocumentResponse.documentId); } catch (error:any) { console.error('Error occurred while calling the API:', error.message); expect(error.message).toBeUndefined(); } }, 20000); test('Test49:should send document with multiple grouped checkboxes', async () => { try { const checkBox1 = new FormField(); checkBox1.id = 'CheckBox1'; checkBox1.name = 'CheckBox1'; checkBox1.fieldType = FormField.FieldTypeEnum.CheckBox; checkBox1.font = FormField.FontEnum.Helvetica; checkBox1.pageNumber = 1; checkBox1.isRequired = true; checkBox1.bounds = new Rectangle(); checkBox1.bounds.x = 50; checkBox1.bounds.y = 50; checkBox1.bounds.width = 100; checkBox1.bounds.height = 50; const checkBox2 = new FormField(); checkBox2.id = 'CheckBox2'; checkBox2.name = 'CheckBox2'; checkBox2.fieldType = FormField.FieldTypeEnum.CheckBox; checkBox2.font = FormField.FontEnum.Helvetica; checkBox2.pageNumber = 1; checkBox2.isRequired = true; checkBox2.bounds = new Rectangle(); checkBox2.bounds.x = 50; checkBox2.bounds.y = 150; checkBox2.bounds.width = 100; checkBox2.bounds.height = 50; const checkBox3 = new FormField(); checkBox3.id = 'CheckBox3'; checkBox3.name = 'CheckBox3'; checkBox3.fieldType = FormField.FieldTypeEnum.CheckBox; checkBox3.font = FormField.FontEnum.Helvetica; checkBox3.pageNumber = 1; checkBox3.isRequired = true; checkBox3.bounds = new Rectangle(); checkBox3.bounds.x = 50; checkBox3.bounds.y = 250; checkBox3.bounds.width = 100; checkBox3.bounds.height = 50; const checkBox4 = new FormField(); checkBox4.id = 'CheckBox4'; checkBox4.name = 'CheckBox4'; checkBox4.fieldType = FormField.FieldTypeEnum.CheckBox; checkBox4.font = FormField.FontEnum.Helvetica; checkBox4.pageNumber = 1; checkBox4.isRequired = true; checkBox4.bounds = new Rectangle(); checkBox4.bounds.x = 50; checkBox4.bounds.y = 350; checkBox4.bounds.width = 100; checkBox4.bounds.height = 50; const signer = new DocumentSigner(); signer.name = 'Mohammed'; signer.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer.signerOrder = 1; signer.signerType = DocumentSigner.SignerTypeEnum.Signer; signer.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer.authenticationCode = '123456'; signer.formFields = [checkBox1, checkBox2, checkBox3, checkBox4]; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.signers = [signer]; const files = fs.createReadStream('tests/documents/agreement.pdf'); sendDocumentRequest.files = [files]; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); const createdDocumentId = sendDocumentResponse.documentId; console.log('Created Document ID:', createdDocumentId); expect(sendDocumentResponse.documentId).toBeDefined(); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeUndefined(); } }, 20000); test('Test50:should replace fillable fields in a document', async () => { try { const signField = new FormField(); signField.name = 'Sign'; signField.fieldType = FormField.FieldTypeEnum.Signature; signField.font = FormField.FontEnum.Helvetica; signField.pageNumber = 1; signField.isRequired = true; signField.bounds = new Rectangle(); signField.bounds.x = 50; signField.bounds.y = 50; signField.bounds.width = 100; signField.bounds.height = 50; const signer = new DocumentSigner(); signer.name = 'Test Signer'; signer.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer.signerOrder = 1; signer.signerType = DocumentSigner.SignerTypeEnum.Signer; signer.authenticationType = DocumentSigner.AuthenticationTypeEnum.AccessCode; signer.authenticationCode = '123456'; signer.formFields = [signField]; signer.privateMessage = 'This is private message for signer'; const files = [fs.createReadStream('tests/documents/agreement.pdf')]; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sendDocumentRequest.files = files; sendDocumentRequest.signers = [signer]; sendDocumentRequest.autoDetectFields = true; const sendDocumentResponse = await documentApi.sendDocument(sendDocumentRequest); const createdDocumentId = sendDocumentResponse.documentId; console.log('Created Document ID:', createdDocumentId); expect(sendDocumentResponse.documentId).toBeDefined(); } catch (error:any) { console.error('Error occurred while sending document for signing:', error.message); expect(error.message).toBeUndefined(); } }, 20000); test('Tes51:should send document with text field', async () => { try { const textField = new FormField(); textField.id = 'textValue'; textField.fieldType = FormField.FieldTypeEnum.TextBox; textField.font = FormField.FontEnum.Helvetica; textField.pageNumber = 1; textField.isReadOnly = true; textField.validationType = FormField.ValidationTypeEnum.NumbersOnly; textField.bounds = new Rectangle(); textField.bounds.x = 50; textField.bounds.y = 50; textField.bounds.width = 200; textField.bounds.height = 50; const signer = new DocumentSigner(); signer.name = 'Test Signer'; signer.emailAddress = 'mohammedmushraf.abuthakir+6@syncfusion.com'; signer.signerOrder = 1; signer.signerType = DocumentSigner.SignerTypeEnum.Signer; signer.formFields = [textField]; const files = [fs.createReadStream('tests/documents/agreement.pdf')]; const sendDocumentRequest = new SendForSign(); sendDocumentRequest.title = 'Document SDK API'; sen