@@ -439,21 +439,32 @@ class Model(BaseModel):
439
439
assert model_json (model ) == expected_json
440
440
441
441
442
- def test_coerces_int () -> None :
442
+ def test_does_not_coerce_int () -> None :
443
443
class Model (BaseModel ):
444
444
bar : int
445
445
446
446
assert Model .construct (bar = 1 ).bar == 1
447
- assert Model .construct (bar = 10.9 ).bar == 10
448
- assert Model .construct (bar = "19" ).bar == 19
449
- assert Model .construct (bar = False ).bar == 0
447
+ assert Model .construct (bar = 10.9 ).bar == 10.9
448
+ assert Model .construct (bar = "19" ).bar == "19" # type: ignore[comparison-overlap]
449
+ assert Model .construct (bar = False ).bar is False
450
450
451
- # TODO: support this
452
- # assert Model.construct(bar="True").bar == 1
453
451
454
- # mismatched types are left as-is
455
- m = Model .construct (bar = {"foo" : "bar" })
456
- assert m .bar == {"foo" : "bar" } # type: ignore[comparison-overlap]
452
+ def test_int_to_float_safe_conversion () -> None :
453
+ class Model (BaseModel ):
454
+ float_field : float
455
+
456
+ m = Model .construct (float_field = 10 )
457
+ assert m .float_field == 10.0
458
+ assert isinstance (m .float_field , float )
459
+
460
+ m = Model .construct (float_field = 10.12 )
461
+ assert m .float_field == 10.12
462
+ assert isinstance (m .float_field , float )
463
+
464
+ # number too big
465
+ m = Model .construct (float_field = 2 ** 53 + 1 )
466
+ assert m .float_field == 2 ** 53 + 1
467
+ assert isinstance (m .float_field , int )
457
468
458
469
459
470
def test_deprecated_alias () -> None :
0 commit comments