1+ <?php
2+
3+ use NaimSolong \DataExtractor \Builder \CsvBuilder ;
4+
5+ it ('can build CSV output with headers ' , function () {
6+ $ builder = new CsvBuilder ();
7+ $ builder ->setSchemaName ('test_table ' );
8+ $ builder ->setColumns (['id ' , 'name ' , 'email ' ]);
9+ $ builder ->setData ([
10+ 'id ' => 1 ,
11+ 'name ' => 'John Doe ' ,
12+ 'email ' => 'john@example.com ' ,
13+ ]);
14+
15+ $ result = $ builder ->build ();
16+
17+ expect ($ result )->toBeString ();
18+ expect ($ result )->toBe ("id,name,email \n1, \"John Doe \", \"john@example.com \"\n" );
19+ });
20+
21+ it ('can handle single row data ' , function () {
22+ $ builder = new CsvBuilder ();
23+ $ builder ->setSchemaName ('users ' );
24+ $ builder ->setColumns (['id ' , 'name ' ]);
25+ $ builder ->setData ([
26+ 'id ' => 1 ,
27+ 'name ' => 'User 1 ' ,
28+ ]);
29+
30+ $ result = $ builder ->build ();
31+
32+ expect ($ result )->toBeString ();
33+ expect ($ result )->toBe ("id,name \n1, \"User 1 \"\n" );
34+ });
35+
36+ it ('can handle values with commas ' , function () {
37+ $ builder = new CsvBuilder ();
38+ $ builder ->setSchemaName ('test_table ' );
39+ $ builder ->setColumns (['id ' , 'description ' ]);
40+ $ builder ->setData ([
41+ 'id ' => 1 ,
42+ 'description ' => 'This is a description, with commas ' ,
43+ ]);
44+
45+ $ result = $ builder ->build ();
46+
47+ expect ($ result )->toContain ('"This is a description, with commas" ' );
48+ });
49+
50+ it ('can handle values with quotes ' , function () {
51+ $ builder = new CsvBuilder ();
52+ $ builder ->setSchemaName ('test_table ' );
53+ $ builder ->setColumns (['id ' , 'quote_test ' ]);
54+ $ builder ->setData ([
55+ 'id ' => 1 ,
56+ 'quote_test ' => 'He said "Hello World" ' ,
57+ ]);
58+
59+ $ result = $ builder ->build ();
60+
61+ expect ($ result )->toContain ('"He said ""Hello World""" ' );
62+ });
63+
64+ it ('can handle NULL values ' , function () {
65+ $ builder = new CsvBuilder ();
66+ $ builder ->setSchemaName ('test_table ' );
67+ $ builder ->setColumns (['id ' , 'name ' , 'bio ' ]);
68+ $ builder ->setData ([
69+ 'id ' => 1 ,
70+ 'name ' => 'John Doe ' ,
71+ 'bio ' => null ,
72+ ]);
73+
74+ $ result = $ builder ->build ();
75+
76+ expect ($ result )->toContain ('"John Doe","" ' );
77+ });
78+
79+ it ('can handle boolean values ' , function () {
80+ $ builder = new CsvBuilder ();
81+ $ builder ->setSchemaName ('test_table ' );
82+ $ builder ->setColumns (['id ' , 'is_active ' , 'is_admin ' ]);
83+ $ builder ->setData ([
84+ 'id ' => 1 ,
85+ 'is_active ' => true ,
86+ 'is_admin ' => false ,
87+ ]);
88+
89+ $ result = $ builder ->build ();
90+
91+ expect ($ result )->toContain ('1, \'1 \', \'0 \'' );
92+ });
93+
94+ it ('can handle array values as JSON strings ' , function () {
95+ $ builder = new CsvBuilder ();
96+ $ builder ->setSchemaName ('test_table ' );
97+ $ builder ->setColumns (['id ' , 'metadata ' ]);
98+ $ builder ->setData ([
99+ 'id ' => 1 ,
100+ 'metadata ' => ['key ' => 'value ' , 'count ' => 5 ],
101+ ]);
102+
103+ $ result = $ builder ->build ();
104+
105+ expect ($ result )->toContain ('{"key":"value","count":5} ' );
106+ });
107+
108+ it ('can handle missing columns ' , function () {
109+ $ builder = new CsvBuilder ();
110+ $ builder ->setSchemaName ('test_table ' );
111+ $ builder ->setColumns (['id ' , 'name ' , 'email ' ]);
112+ $ builder ->setData ([
113+ 'id ' => 1 ,
114+ 'name ' => 'John Doe ' ,
115+ // email is missing
116+ ]);
117+
118+ $ result = $ builder ->build ();
119+
120+ expect ($ result )->toContain ("'*****' " );
121+ });
122+
123+ it ('can handle empty data array ' , function () {
124+ $ builder = new CsvBuilder ();
125+ $ builder ->setSchemaName ('test_table ' );
126+ $ builder ->setColumns (['id ' , 'name ' , 'email ' ]);
127+ $ builder ->setData ([]);
128+
129+ $ result = $ builder ->build ();
130+
131+ expect ($ result )->toBe ("id,name,email \n'*****','*****','*****' \n" );
132+ });
133+
134+ it ('can handle DateTime objects ' , function () {
135+ $ builder = new CsvBuilder ();
136+ $ builder ->setSchemaName ('test_table ' );
137+ $ builder ->setColumns (['id ' , 'created_at ' ]);
138+ $ builder ->setData ([
139+ 'id ' => 1 ,
140+ 'created_at ' => new DateTime ('2023-01-01 12:00:00 ' ),
141+ ]);
142+
143+ $ result = $ builder ->build ();
144+
145+ expect ($ result )->toContain ('2023-01-01 12:00:00 ' );
146+ });
0 commit comments