Skip to content

Commit 7781d3e

Browse files
author
Saurabh Badenkal
committed
Add edge case tests: empty string, zero/False, pd.NA, literal NaN string, datetime in DataFrame
1 parent 1cde7e8 commit 7781d3e

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

tests/unit/test_pandas_helpers.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

247292
if __name__ == "__main__":
248293
unittest.main()

0 commit comments

Comments
 (0)