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/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/file/spec/generateFileUploadForm.spec.ts b/src/file/spec/generateFileUploadForm.spec.ts new file mode 100644 index 0000000..59fdc99 --- /dev/null +++ b/src/file/spec/generateFileUploadForm.spec.ts @@ -0,0 +1,55 @@ +import { generateFileUploadForm } from '../generateFileUploadForm' + +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 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] + + 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 9cc5565..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: any, + data: any[], 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