From d3dff44918850fd1e35078662a13e7d09aa1ec04 Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Wed, 16 Feb 2022 17:13:00 +0300 Subject: [PATCH 1/3] fix(special-missings): fix convertToCSV format object --- src/file/generateFileUploadForm.ts | 3 +++ src/utils/convertToCsv.ts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/file/generateFileUploadForm.ts b/src/file/generateFileUploadForm.ts index 5e2cdcc..e358c08 100644 --- a/src/file/generateFileUploadForm.ts +++ b/src/file/generateFileUploadForm.ts @@ -5,8 +5,11 @@ export const generateFileUploadForm = ( data: any ): FormData => { for (const tableName in data) { + if (!Array.isArray(data[tableName])) continue + const name = tableName const csv = convertToCSV(data[tableName]) + if (csv === 'ERROR: LARGE STRING LENGTH') { throw new Error( 'The max length of a string value in SASjs is 32765 characters.' diff --git a/src/utils/convertToCsv.ts b/src/utils/convertToCsv.ts index 9cc5565..8ff5f97 100644 --- a/src/utils/convertToCsv.ts +++ b/src/utils/convertToCsv.ts @@ -3,7 +3,7 @@ * @param data - the array of JSON objects to convert. */ export const convertToCSV = ( - data: any, + data: Array, sasFormats?: { formats: { [key: string]: string } } ) => { let formats = sasFormats?.formats @@ -76,7 +76,7 @@ export const convertToCSV = ( return byteSize } }) - .sort((a: number, b: number) => b - a)[0] + .sort((a: any, b: any) => b - a)[0] if (longestValueForField && longestValueForField > 32765) { invalidString = true From 9b239abda0638402a5708c7865d345d36f458a12 Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Thu, 17 Feb 2022 13:34:13 +0300 Subject: [PATCH 2/3] test(generateFileUploadForm): add unit test --- sasjs-tests/src/testSuites/SpecialCases.ts | 2 +- src/file/spec/generateFileUploadForm.spec.ts | 44 ++++++++++++++++++++ src/utils/convertToCsv.ts | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/file/spec/generateFileUploadForm.spec.ts diff --git a/sasjs-tests/src/testSuites/SpecialCases.ts b/sasjs-tests/src/testSuites/SpecialCases.ts index 636c9c3..2bf9c88 100644 --- a/sasjs-tests/src/testSuites/SpecialCases.ts +++ b/sasjs-tests/src/testSuites/SpecialCases.ts @@ -80,7 +80,7 @@ const errorAndCsrfData: any = { } const testTable = 'sometable' -const testTableWithNullVars: { [key: string]: any } = { +export const testTableWithNullVars: { [key: string]: any } = { [testTable]: [ { var1: 'string', var2: 232, nullvar: 'A' }, { var1: 'string', var2: 232, nullvar: 'B' }, diff --git a/src/file/spec/generateFileUploadForm.spec.ts b/src/file/spec/generateFileUploadForm.spec.ts new file mode 100644 index 0000000..fa3a806 --- /dev/null +++ b/src/file/spec/generateFileUploadForm.spec.ts @@ -0,0 +1,44 @@ +import { generateFileUploadForm } from '../generateFileUploadForm' +import { testTableWithNullVars } from '../../../sasjs-tests/src/testSuites/SpecialCases' + +describe('generateFileUploadForm', () => { + beforeAll(() => { + function FormDataMock(this: any) { + this.append = () => {} + } + + const BlobMock = jest.fn() + + ;(global as any).FormData = FormDataMock + ;(global as any).Blob = BlobMock + }) + + it('should generate file upload form from data', () => { + const formData = new FormData() + const tableName = Object.keys(testTableWithNullVars).filter((key: string) => + Array.isArray(testTableWithNullVars[key]) + )[0] + + jest.spyOn(formData, 'append').mockImplementation(() => {}) + + generateFileUploadForm(formData, testTableWithNullVars) + + expect(formData.append).toHaveBeenCalledOnce() + expect(formData.append).toHaveBeenCalledWith( + tableName, + {}, + `${tableName}.csv` + ) + }) + + it('should throw an error if too large string was provided', () => { + const formData = new FormData() + const data = { testTable: [{ var1: 'z'.repeat(32765 + 1) }] } + + expect(() => generateFileUploadForm(formData, data)).toThrow( + new Error( + 'The max length of a string value in SASjs is 32765 characters.' + ) + ) + }) +}) diff --git a/src/utils/convertToCsv.ts b/src/utils/convertToCsv.ts index 8ff5f97..73af3ba 100644 --- a/src/utils/convertToCsv.ts +++ b/src/utils/convertToCsv.ts @@ -3,7 +3,7 @@ * @param data - the array of JSON objects to convert. */ export const convertToCSV = ( - data: Array, + data: any[], sasFormats?: { formats: { [key: string]: string } } ) => { let formats = sasFormats?.formats From fbca91144d2754430af0fee181d2b8c44a2a6535 Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Thu, 17 Feb 2022 13:49:21 +0300 Subject: [PATCH 3/3] test(generateFileUploadForm): add test data --- src/file/spec/generateFileUploadForm.spec.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/file/spec/generateFileUploadForm.spec.ts b/src/file/spec/generateFileUploadForm.spec.ts index fa3a806..59fdc99 100644 --- a/src/file/spec/generateFileUploadForm.spec.ts +++ b/src/file/spec/generateFileUploadForm.spec.ts @@ -1,5 +1,4 @@ import { generateFileUploadForm } from '../generateFileUploadForm' -import { testTableWithNullVars } from '../../../sasjs-tests/src/testSuites/SpecialCases' describe('generateFileUploadForm', () => { beforeAll(() => { @@ -15,6 +14,18 @@ describe('generateFileUploadForm', () => { it('should generate file upload form from data', () => { const formData = new FormData() + const testTable = 'sometable' + const testTableWithNullVars: { [key: string]: any } = { + [testTable]: [ + { var1: 'string', var2: 232, nullvar: 'A' }, + { var1: 'string', var2: 232, nullvar: 'B' }, + { var1: 'string', var2: 232, nullvar: '_' }, + { var1: 'string', var2: 232, nullvar: 0 }, + { var1: 'string', var2: 232, nullvar: 'z' }, + { var1: 'string', var2: 232, nullvar: null } + ], + [`$${testTable}`]: { formats: { var1: '$char12.', nullvar: 'best.' } } + } const tableName = Object.keys(testTableWithNullVars).filter((key: string) => Array.isArray(testTableWithNullVars[key]) )[0]