1+ import { describe , expect , it } from "vitest" ;
2+ import createCsvPerLocaleLoader from "./csv-per-locale" ;
3+
4+ describe ( "csv-per-locale loader" , ( ) => {
5+ const sampleCsv = `id,name,description
6+ 35,Hello,Welcome
7+ 36,Bye,Farewell` ;
8+
9+ const sampleCsvWithDuplicates = `id,name,name,description
10+ 35,Hello,Hi,Welcome
11+ 36,Bye,Goodbye,Farewell` ;
12+
13+ it ( "pull should parse CSV to array of objects" , async ( ) => {
14+ const loader = createCsvPerLocaleLoader ( ) ;
15+ loader . setDefaultLocale ( "en" ) ;
16+
17+ const result = await loader . pull ( "en" , sampleCsv ) ;
18+
19+ expect ( Array . isArray ( result ) ) . toBe ( true ) ;
20+ expect ( result ) . toHaveLength ( 2 ) ;
21+ expect ( result [ 0 ] ) . toEqual ( {
22+ id : "35" ,
23+ name : "Hello" ,
24+ description : "Welcome" ,
25+ } ) ;
26+ expect ( result [ 1 ] ) . toEqual ( {
27+ id : "36" ,
28+ name : "Bye" ,
29+ description : "Farewell" ,
30+ } ) ;
31+ } ) ;
32+
33+ it ( "pull should handle duplicate headers by deduplicating" , async ( ) => {
34+ const loader = createCsvPerLocaleLoader ( ) ;
35+ loader . setDefaultLocale ( "en" ) ;
36+
37+ const result = await loader . pull ( "en" , sampleCsvWithDuplicates ) ;
38+
39+ expect ( Array . isArray ( result ) ) . toBe ( true ) ;
40+ expect ( result ) . toHaveLength ( 2 ) ;
41+ expect ( result [ 0 ] ) . toEqual ( {
42+ id : "35" ,
43+ name : "Hello" ,
44+ name__2 : "Hi" ,
45+ description : "Welcome" ,
46+ } ) ;
47+ expect ( result [ 1 ] ) . toEqual ( {
48+ id : "36" ,
49+ name : "Bye" ,
50+ name__2 : "Goodbye" ,
51+ description : "Farewell" ,
52+ } ) ;
53+ } ) ;
54+
55+ it ( "pull should return empty object for empty CSV" , async ( ) => {
56+ const loader = createCsvPerLocaleLoader ( ) ;
57+ loader . setDefaultLocale ( "en" ) ;
58+
59+ const result = await loader . pull ( "en" , "" ) ;
60+ expect ( result ) . toEqual ( { } ) ;
61+ } ) ;
62+
63+ it ( "push should serialize array back to CSV preserving original headers" , async ( ) => {
64+ const loader = createCsvPerLocaleLoader ( ) ;
65+ loader . setDefaultLocale ( "en" ) ;
66+ const originalInput = sampleCsv ;
67+ await loader . pull ( "en" , originalInput ) ;
68+
69+ const data = [
70+ { id : "35" , name : "Hello edited" , description : "Welcome edited" } ,
71+ { id : "36" , name : "Bye edited" , description : "Farewell edited" } ,
72+ ] ;
73+
74+ // @ts -expect-error - originalInput is used internally but not in public interface
75+ const csv = await loader . push ( "en" , data , originalInput ) ;
76+
77+ expect ( csv ) . toContain ( "id,name,description" ) ;
78+ expect ( csv ) . toContain ( "35,Hello edited,Welcome edited" ) ;
79+ expect ( csv ) . toContain ( "36,Bye edited,Farewell edited" ) ;
80+ } ) ;
81+
82+ it ( "push should preserve all columns from original CSV including duplicates" , async ( ) => {
83+ const loader = createCsvPerLocaleLoader ( ) ;
84+ loader . setDefaultLocale ( "en" ) ;
85+ const originalInput = sampleCsvWithDuplicates ;
86+ await loader . pull ( "en" , originalInput ) ;
87+
88+ const data = [
89+ { id : "35" , name : "Hola" , name__2 : "Hola2" , description : "Bienvenido" } ,
90+ { id : "36" , name : "Adiós" , name__2 : "Adiós2" , description : "Despedida" } ,
91+ ] ;
92+
93+ // @ts -expect-error - originalInput is used internally but not in public interface
94+ const csv = await loader . push ( "en" , data , originalInput ) ;
95+
96+ expect ( csv ) . toContain ( "id,name,name,description" ) ;
97+ expect ( csv ) . toContain ( "35,Hola,Hola2,Bienvenido" ) ;
98+ expect ( csv ) . toContain ( "36,Adiós,Adiós2,Despedida" ) ;
99+ } ) ;
100+
101+ it ( "push should handle object with numeric keys" , async ( ) => {
102+ const loader = createCsvPerLocaleLoader ( ) ;
103+ loader . setDefaultLocale ( "en" ) ;
104+ const originalInput = sampleCsv ;
105+ await loader . pull ( "en" , originalInput ) ;
106+
107+ const data = {
108+ 0 : { id : "35" , name : "Hola" , description : "Bienvenido" } ,
109+ 1 : { id : "36" , name : "Adiós" , description : "Despedida" } ,
110+ } ;
111+
112+ // @ts -expect-error - originalInput is used internally but not in public interface
113+ const csv = await loader . push ( "en" , data , originalInput ) ;
114+
115+ expect ( csv ) . toContain ( "id,name,description" ) ;
116+ expect ( csv ) . toContain ( "35,Hola,Bienvenido" ) ;
117+ expect ( csv ) . toContain ( "36,Adiós,Despedida" ) ;
118+ } ) ;
119+ } ) ;
0 commit comments