@@ -2792,19 +2792,17 @@ public function testBuildLoadCsvSql(): void
27922792    {
27932793        $ dialectself ::$ dbconnection ->getDialect ();
27942794
2795-         // Create temp file for testing  
2795+         // Test 1: Basic CSV  
27962796        $ tempFiletempnam (sys_get_temp_dir (), 'csv_ ' );
27972797        file_put_contents ($ tempFile"id,name \n1,John \n" );
27982798
2799-         // SQLite uses INSERT fallback 
28002799        $ sql$ dialectbuildLoadCsvSql ('users ' , $ tempFile
28012800
28022801        $ this assertNotEmpty ($ sql
2803-         // SQLite fallback uses INSERT statements 
28042802        $ this assertStringContainsString ('INSERT ' , $ sql
28052803        $ this assertStringContainsString ('users ' , $ sql
28062804
2807-         // Test with options 
2805+         // Test 2: CSV  with options (fieldChar, linesToIgnore)  
28082806        $ tempFile2tempnam (sys_get_temp_dir (), 'csv_ ' );
28092807        file_put_contents ($ tempFile2"id;name;price \n1;Product;99.99 \n" );
28102808
@@ -2816,32 +2814,127 @@ public function testBuildLoadCsvSql(): void
28162814
28172815        $ this assertStringContainsString ('INSERT ' , $ sql2
28182816
2817+         // Test 3: CSV with empty values (treated as empty strings by CSV parser) 
2818+         $ tempFile3tempnam (sys_get_temp_dir (), 'csv_ ' );
2819+         file_put_contents ($ tempFile3"id,name,value \n1,Test, \n2,,100 \n" );
2820+         
2821+         $ sql3$ dialectbuildLoadCsvSql ('test_table ' , $ tempFile3
2822+             'fields '  => ['id ' , 'name ' , 'value ' ]
2823+         ]);
2824+         
2825+         $ this assertStringContainsString ('INSERT ' , $ sql3
2826+         // Empty CSV cells are treated as empty strings, not NULL 
2827+         $ this assertStringContainsString ("'' " , $ sql3
2828+         
2829+         // Test 4: CSV with more columns than expected 
2830+         $ tempFile4tempnam (sys_get_temp_dir (), 'csv_ ' );
2831+         file_put_contents ($ tempFile4"id,name,extra1,extra2 \n1,John,X,Y \n" );
2832+         
2833+         $ sql4$ dialectbuildLoadCsvSql ('users ' , $ tempFile4
2834+             'fields '  => ['id ' , 'name ' ]
2835+         ]);
2836+         
2837+         $ this assertStringContainsString ('INSERT ' , $ sql4
2838+         
2839+         // Test 5: CSV with less columns than expected 
2840+         $ tempFile5tempnam (sys_get_temp_dir (), 'csv_ ' );
2841+         file_put_contents ($ tempFile5"id \n1 \n" );
2842+         
2843+         $ sql5$ dialectbuildLoadCsvSql ('users ' , $ tempFile5
2844+             'fields '  => ['id ' , 'name ' , 'age ' ]
2845+         ]);
2846+         
2847+         $ this assertStringContainsString ('INSERT ' , $ sql5
2848+         
2849+         // Test 6: Empty CSV file (returns empty string) 
2850+         $ tempFile6tempnam (sys_get_temp_dir (), 'csv_ ' );
2851+         file_put_contents ($ tempFile6"" );
2852+         
2853+         $ sql6$ dialectbuildLoadCsvSql ('users ' , $ tempFile6
2854+             'fields '  => ['id ' , 'name ' ]
2855+         ]);
2856+         
2857+         $ this assertEquals ('' , $ sql6
2858+         
2859+         // Test 7: CSV with only blank lines 
2860+         $ tempFile7tempnam (sys_get_temp_dir (), 'csv_ ' );
2861+         file_put_contents ($ tempFile7"\n\n\n" );
2862+         
2863+         $ sql7$ dialectbuildLoadCsvSql ('users ' , $ tempFile7
2864+             'fields '  => ['id ' , 'name ' ]
2865+         ]);
2866+         
2867+         $ this assertEquals ('' , $ sql7
2868+         
28192869        // Cleanup 
28202870        unlink ($ tempFile
28212871        unlink ($ tempFile2
2872+         unlink ($ tempFile3
2873+         unlink ($ tempFile4
2874+         unlink ($ tempFile5
2875+         unlink ($ tempFile6
2876+         unlink ($ tempFile7
28222877    }
28232878
28242879    public  function  testBuildLoadXmlSql (): void 
28252880    {
28262881        $ dialectself ::$ dbconnection ->getDialect ();
28272882
2828-         // Create temp XML file for testing  
2883+         // Test 1: Basic XML  
28292884        $ tempFiletempnam (sys_get_temp_dir (), 'xml_ ' );
28302885        file_put_contents ($ tempFile"<users><user><id>1</id><name>John</name></user></users> " );
28312886
2832-         // SQLite uses INSERT fallback for XML 
28332887        $ sql$ dialectbuildLoadXML ('users ' , $ tempFile
28342888            'rowTag '  => '<user> ' ,
28352889            'linesToIgnore '  => 0 
28362890        ]);
28372891
28382892        $ this assertNotEmpty ($ sql
2839-         // SQLite fallback uses INSERT statements 
28402893        $ this assertStringContainsString ('INSERT ' , $ sql
28412894        $ this assertStringContainsString ('users ' , $ sql
28422895
2843-         // Cleanup 
2844-         unlink ($ tempFile
2896+         // Test 2: XML with attributes 
2897+         $ tempFile2tempnam (sys_get_temp_dir (), 'xml_ ' );
2898+         file_put_contents ($ tempFile2'<users><user id="1" name="Alice"><age>30</age></user></users> ' );
2899+         
2900+         $ sql2$ dialectbuildLoadXML ('users ' , $ tempFile2
2901+             'rowTag '  => '<user> ' 
2902+         ]);
2903+         
2904+         $ this assertNotEmpty ($ sql2
2905+         $ this assertStringContainsString ('INSERT ' , $ sql2
2906+         
2907+         // Test 3: XML with empty elements 
2908+         $ tempFile3tempnam (sys_get_temp_dir (), 'xml_ ' );
2909+         file_put_contents ($ tempFile3'<users><user><id>1</id><name></name></user></users> ' );
2910+         
2911+         $ sql3$ dialectbuildLoadXML ('users ' , $ tempFile3
2912+             'rowTag '  => '<user> ' 
2913+         ]);
2914+         
2915+         $ this assertNotEmpty ($ sql3
2916+         
2917+         // Test 4: Empty XML file 
2918+         $ tempFile4tempnam (sys_get_temp_dir (), 'xml_ ' );
2919+         file_put_contents ($ tempFile4'<?xml version="1.0"?><users></users> ' );
2920+         
2921+         $ sql4$ dialectbuildLoadXML ('users ' , $ tempFile4
2922+             'rowTag '  => '<user> ' 
2923+         ]);
2924+         
2925+         $ this assertEquals ('' , $ sql4
2926+         
2927+         // Test 5: Unreadable file 
2928+         $ this expectException (\InvalidArgumentException::class);
2929+         $ this expectExceptionMessage ('not readable ' );
2930+         
2931+         $ dialectbuildLoadXML ('users ' , '/nonexistent/path/file.xml ' , []);
2932+         
2933+         // Cleanup (after exception, these won't run, but PHPUnit handles it) 
2934+         @unlink ($ tempFile
2935+         @unlink ($ tempFile2
2936+         @unlink ($ tempFile3
2937+         @unlink ($ tempFile4
28452938    }
28462939
28472940    public  function  testFormatSelectOptions (): void 
0 commit comments