@@ -243,6 +243,51 @@ def test_multiple_rows_na_as_null(self):
243243 self .assertEqual (result [0 ], {"name" : "A" , "phone" : None })
244244 self .assertEqual (result [1 ], {"name" : None , "phone" : "555-0200" })
245245
246+ def test_empty_string_preserved (self ):
247+ """Empty string is kept in output, not treated as missing."""
248+ df = pd .DataFrame ([{"name" : "" }])
249+ result = dataframe_to_records (df )
250+ self .assertIn ("name" , result [0 ])
251+ self .assertEqual (result [0 ]["name" ], "" )
252+
253+ def test_zero_and_false_preserved (self ):
254+ """Zero and False are kept in output, not treated as missing."""
255+ df = pd .DataFrame ([{"count" : 0 , "score" : 0.0 , "active" : False }])
256+ result = dataframe_to_records (df )
257+ self .assertEqual (result [0 ]["count" ], 0 )
258+ self .assertEqual (result [0 ]["score" ], 0.0 )
259+ self .assertIs (result [0 ]["active" ], False )
260+
261+ def test_pd_na_nullable_int (self ):
262+ """pd.NA in nullable Int64 column is dropped by default."""
263+ df = pd .DataFrame ({"val" : pd .array ([1 , pd .NA ], dtype = "Int64" )})
264+ result = dataframe_to_records (df )
265+ self .assertEqual (result [0 ]["val" ], 1 )
266+ self .assertNotIn ("val" , result [1 ])
267+
268+ def test_pd_na_nullable_int_as_null (self ):
269+ """pd.NA in nullable Int64 column becomes None with na_as_null=True."""
270+ df = pd .DataFrame ({"val" : pd .array ([1 , pd .NA ], dtype = "Int64" )})
271+ result = dataframe_to_records (df , na_as_null = True )
272+ self .assertEqual (result [0 ]["val" ], 1 )
273+ self .assertIsNone (result [1 ]["val" ])
274+
275+ def test_datetime_in_dataframe (self ):
276+ """datetime.datetime values in a DataFrame are converted to ISO strings."""
277+ import datetime
278+
279+ dt = datetime .datetime (2024 , 6 , 15 , 10 , 30 )
280+ df = pd .DataFrame ([{"createdon" : dt }])
281+ result = dataframe_to_records (df )
282+ self .assertIsInstance (result [0 ]["createdon" ], str )
283+ self .assertIn ("2024-06-15" , result [0 ]["createdon" ])
284+
285+ def test_literal_nan_string (self ):
286+ """Literal string 'NaN' is preserved, not treated as missing."""
287+ df = pd .DataFrame ([{"name" : "NaN" }])
288+ result = dataframe_to_records (df )
289+ self .assertEqual (result [0 ]["name" ], "NaN" )
290+
246291
247292if __name__ == "__main__" :
248293 unittest .main ()
0 commit comments