11'use strict' ;
22
33const assert = require ( 'assert' ) ;
4+ const fs = require ( 'fs' ) ;
5+ const path = require ( 'path' ) ;
46const csvToJsonAsync = require ( '../src/csvToJsonAsync' ) ;
57const index = require ( '../index' ) ;
68
@@ -42,6 +44,27 @@ describe('Async API testing', () => {
4244 assert . ok ( err && ( err . code === 'ENOENT' || err . message . includes ( 'ENOENT' ) ) ) ;
4345 } ) ;
4446 } ) ;
47+
48+ it ( 'should handle UTF-16LE encoded CSV files in async processing' , async ( ) => {
49+ const testDir = path . join ( __dirname , 'temp' ) ;
50+ if ( ! fs . existsSync ( testDir ) ) fs . mkdirSync ( testDir ) ;
51+ const encodingFile = path . join ( testDir , 'utf16le.csv' ) ;
52+ const csvContent = 'firstName;lastName\nJohn;Doe' ;
53+
54+ // Write content as UTF-16LE
55+ const buffer = Buffer . from ( csvContent , 'utf16le' ) ;
56+ await fs . promises . writeFile ( encodingFile , buffer ) ;
57+
58+ try {
59+ const result = await csvToJsonAsync . encoding ( 'utf16le' ) . fieldDelimiter ( ';' ) . getJsonFromCsvAsync ( encodingFile ) ;
60+ assert . ok ( Array . isArray ( result ) ) ;
61+ assert . strictEqual ( result . length , 1 ) ;
62+ assert . strictEqual ( result [ 0 ] . firstName , 'John' ) ;
63+ assert . strictEqual ( result [ 0 ] . lastName , 'Doe' ) ;
64+ } finally {
65+ if ( fs . existsSync ( encodingFile ) ) await fs . promises . unlink ( encodingFile ) ;
66+ }
67+ } ) ;
4568 } ) ;
4669
4770 describe ( 'getJsonFromCsvAsync() with raw CSV strings' , ( ) => {
@@ -103,4 +126,86 @@ describe('Async API testing', () => {
103126 ] ) ;
104127 } ) ;
105128 } ) ;
129+
130+ describe ( 'Batch processing multiple files (async)' , ( ) => {
131+ const testDir = path . join ( __dirname , 'temp' ) ;
132+
133+ beforeAll ( ( ) => {
134+ if ( ! fs . existsSync ( testDir ) ) fs . mkdirSync ( testDir ) ;
135+ } ) ;
136+
137+ afterAll ( ( ) => {
138+ if ( fs . existsSync ( testDir ) ) {
139+ fs . rmSync ( testDir , { recursive : true , force : true } ) ;
140+ }
141+ } ) ;
142+
143+ it ( 'should process multiple CSV files concurrently and return correct results' , async ( ) => {
144+ const fileA = path . join ( testDir , 'batchA.csv' ) ;
145+ const fileB = path . join ( testDir , 'batchB.csv' ) ;
146+
147+ const csvA = 'firstName;lastName\nAlice;Arden' ;
148+ const csvB = 'firstName;lastName\nBob;Baker' ;
149+
150+ await fs . promises . writeFile ( fileA , csvA , 'utf8' ) ;
151+ await fs . promises . writeFile ( fileB , csvB , 'utf8' ) ;
152+
153+ try {
154+ // ensure encoding and delimiter are set to defaults for these test files
155+ csvToJsonAsync . encoding ( 'utf8' ) . fieldDelimiter ( ';' ) ;
156+
157+ const [ resA , resB ] = await Promise . all ( [
158+ csvToJsonAsync . getJsonFromCsvAsync ( fileA ) ,
159+ csvToJsonAsync . getJsonFromCsvAsync ( fileB )
160+ ] ) ;
161+
162+ assert . ok ( Array . isArray ( resA ) ) ;
163+ assert . ok ( Array . isArray ( resB ) ) ;
164+ assert . strictEqual ( resA . length , 1 ) ;
165+ assert . strictEqual ( resB . length , 1 ) ;
166+ assert . strictEqual ( resA [ 0 ] . firstName , 'Alice' ) ;
167+ assert . strictEqual ( resA [ 0 ] . lastName , 'Arden' ) ;
168+ assert . strictEqual ( resB [ 0 ] . firstName , 'Bob' ) ;
169+ assert . strictEqual ( resB [ 0 ] . lastName , 'Baker' ) ;
170+ } finally {
171+ if ( fs . existsSync ( fileA ) ) await fs . promises . unlink ( fileA ) ;
172+ if ( fs . existsSync ( fileB ) ) await fs . promises . unlink ( fileB ) ;
173+ }
174+ } ) ;
175+
176+ it ( 'should generate JSON files for multiple inputs concurrently' , async ( ) => {
177+ const file1 = path . join ( testDir , 'input1.csv' ) ;
178+ const file2 = path . join ( testDir , 'input2.csv' ) ;
179+ const out1 = path . join ( testDir , 'out1.json' ) ;
180+ const out2 = path . join ( testDir , 'out2.json' ) ;
181+
182+ const csv1 = 'name;age\nCharlie;40' ;
183+ const csv2 = 'name;age\nDana;35' ;
184+
185+ await fs . promises . writeFile ( file1 , csv1 , 'utf8' ) ;
186+ await fs . promises . writeFile ( file2 , csv2 , 'utf8' ) ;
187+
188+ try {
189+ csvToJsonAsync . encoding ( 'utf8' ) . fieldDelimiter ( ';' ) ;
190+
191+ await Promise . all ( [
192+ csvToJsonAsync . generateJsonFileFromCsv ( file1 , out1 ) ,
193+ csvToJsonAsync . generateJsonFileFromCsv ( file2 , out2 )
194+ ] ) ;
195+
196+ // read and validate outputs
197+ const outContent1 = JSON . parse ( fs . readFileSync ( out1 , 'utf8' ) ) ;
198+ const outContent2 = JSON . parse ( fs . readFileSync ( out2 , 'utf8' ) ) ;
199+
200+ assert . ok ( Array . isArray ( outContent1 ) ) ;
201+ assert . ok ( Array . isArray ( outContent2 ) ) ;
202+ assert . strictEqual ( outContent1 [ 0 ] . name , 'Charlie' ) ;
203+ assert . strictEqual ( String ( outContent1 [ 0 ] . age ) , '40' ) ;
204+ assert . strictEqual ( outContent2 [ 0 ] . name , 'Dana' ) ;
205+ assert . strictEqual ( String ( outContent2 [ 0 ] . age ) , '35' ) ;
206+ } finally {
207+ [ file1 , file2 , out1 , out2 ] . forEach ( f => { if ( fs . existsSync ( f ) ) fs . unlinkSync ( f ) ; } ) ;
208+ }
209+ } ) ;
210+ } ) ;
106211} ) ;
0 commit comments