@@ -187,14 +187,12 @@ def test_create_empty_dataframe(self):
187187 self .assertIsInstance (ids , pd .Series )
188188 self .assertEqual (len (ids ), 0 )
189189
190- def test_create_drops_nan_values (self ):
191- """NaN values are stripped from the payload (field omitted, not sent as NaN)."""
192- df = pd .DataFrame (
193- [
194- {"name" : "Contoso" , "telephone1" : "555-0100" },
195- {"name" : "Fabrikam" , "telephone1" : None },
196- ]
197- )
190+ def test_create_converts_nan_to_none (self ):
191+ """NaN values are converted to None in the payload."""
192+ df = pd .DataFrame ([
193+ {"name" : "Contoso" , "telephone1" : "555-0100" },
194+ {"name" : "Fabrikam" , "telephone1" : None },
195+ ])
198196 self .client ._odata ._create_multiple .return_value = ["guid-1" , "guid-2" ]
199197 self .client ._odata ._entity_set_from_schema_name .return_value = "accounts"
200198
@@ -203,8 +201,7 @@ def test_create_drops_nan_values(self):
203201 call_args = self .client ._odata ._create_multiple .call_args
204202 records_arg = call_args [0 ][2 ]
205203 self .assertEqual (records_arg [0 ], {"name" : "Contoso" , "telephone1" : "555-0100" })
206- self .assertEqual (records_arg [1 ], {"name" : "Fabrikam" })
207- self .assertNotIn ("telephone1" , records_arg [1 ])
204+ self .assertEqual (records_arg [1 ], {"name" : "Fabrikam" , "telephone1" : None })
208205
209206 def test_create_converts_timestamps_to_iso (self ):
210207 """Timestamp values are converted to ISO 8601 strings."""
@@ -278,21 +275,19 @@ def test_update_multiple_change_columns(self):
278275 self .assertIn ("telephone1" , changes )
279276 self .assertNotIn ("accountid" , changes )
280277
281- def test_update_drops_nan_from_changes (self ):
282- """NaN values in change columns are stripped from the payload."""
283- df = pd .DataFrame (
284- [
285- {"accountid" : "guid-1" , "name" : "New Name" , "telephone1" : None },
286- {"accountid" : "guid-2" , "name" : None , "telephone1" : "555-0200" },
287- ]
288- )
278+ def test_update_preserves_none_for_clearing_fields (self ):
279+ """None values in update are kept as None to allow clearing fields in Dataverse."""
280+ df = pd .DataFrame ([
281+ {"accountid" : "guid-1" , "name" : "New Name" , "telephone1" : None },
282+ {"accountid" : "guid-2" , "name" : None , "telephone1" : "555-0200" },
283+ ])
289284
290285 self .client .update_dataframe ("account" , df , id_column = "accountid" )
291286
292287 call_args = self .client ._odata ._update_by_ids .call_args [0 ]
293288 changes = call_args [2 ]
294- self .assertEqual (changes [0 ], {"name" : "New Name" })
295- self .assertEqual (changes [1 ], {"telephone1" : "555-0200" })
289+ self .assertEqual (changes [0 ], {"name" : "New Name" , "telephone1" : None })
290+ self .assertEqual (changes [1 ], {"name" : None , " telephone1" : "555-0200" })
296291
297292
298293class TestDataFrameDelete (unittest .TestCase ):
0 commit comments