|
1 | 1 | import dataclasses
|
2 | 2 | import json
|
3 | 3 | import re
|
| 4 | +import uuid |
| 5 | +from decimal import Decimal |
4 | 6 | from typing import Any, ClassVar, Union
|
5 | 7 |
|
6 | 8 | import pytest
|
@@ -510,3 +512,117 @@ class Item(BaseModel):
|
510 | 512 | )
|
511 | 513 |
|
512 | 514 | assert s.to_python([DBUser(name='John', password='secret')]) == [{'name': 'John'}]
|
| 515 | + |
| 516 | + |
| 517 | +EXAMPLE_UUID = uuid.uuid4() |
| 518 | + |
| 519 | + |
| 520 | +class IntSubclass(int): |
| 521 | + pass |
| 522 | + |
| 523 | + |
| 524 | +@pytest.mark.parametrize('reverse', [False, True]) |
| 525 | +@pytest.mark.parametrize( |
| 526 | + 'core_schema_left,core_schema_right,input_value,expected_value', |
| 527 | + [ |
| 528 | + (core_schema.int_schema(), core_schema.bool_schema(), True, True), |
| 529 | + (core_schema.int_schema(), core_schema.bool_schema(), 1, 1), |
| 530 | + (core_schema.str_schema(), core_schema.int_schema(), 1, 1), |
| 531 | + (core_schema.str_schema(), core_schema.int_schema(), '1', '1'), |
| 532 | + (core_schema.int_schema(), core_schema.bool_schema(), IntSubclass(1), 1), |
| 533 | + ( |
| 534 | + core_schema.decimal_schema(), |
| 535 | + core_schema.int_schema(), |
| 536 | + Decimal('1'), |
| 537 | + Decimal('1'), |
| 538 | + ), |
| 539 | + (core_schema.decimal_schema(), core_schema.int_schema(), 1, 1), |
| 540 | + ( |
| 541 | + core_schema.decimal_schema(), |
| 542 | + core_schema.float_schema(), |
| 543 | + Decimal('1.'), |
| 544 | + Decimal('1.'), |
| 545 | + ), |
| 546 | + ( |
| 547 | + core_schema.decimal_schema(), |
| 548 | + core_schema.str_schema(), |
| 549 | + Decimal('_1'), |
| 550 | + Decimal('_1'), |
| 551 | + ), |
| 552 | + ( |
| 553 | + core_schema.decimal_schema(), |
| 554 | + core_schema.str_schema(), |
| 555 | + '_1', |
| 556 | + '_1', |
| 557 | + ), |
| 558 | + ( |
| 559 | + core_schema.uuid_schema(), |
| 560 | + core_schema.str_schema(), |
| 561 | + EXAMPLE_UUID, |
| 562 | + EXAMPLE_UUID, |
| 563 | + ), |
| 564 | + ( |
| 565 | + core_schema.uuid_schema(), |
| 566 | + core_schema.str_schema(), |
| 567 | + str(EXAMPLE_UUID), |
| 568 | + str(EXAMPLE_UUID), |
| 569 | + ), |
| 570 | + ], |
| 571 | +) |
| 572 | +def test_union_serializer_picks_exact_type_over_subclass( |
| 573 | + core_schema_left, core_schema_right, input_value, expected_value, reverse |
| 574 | +): |
| 575 | + s = SchemaSerializer( |
| 576 | + core_schema.union_schema( |
| 577 | + [core_schema_right, core_schema_left] if reverse else [core_schema_left, core_schema_right] |
| 578 | + ) |
| 579 | + ) |
| 580 | + assert s.to_python(input_value) == expected_value |
| 581 | + |
| 582 | + |
| 583 | +@pytest.mark.parametrize('reverse', [False, True]) |
| 584 | +@pytest.mark.parametrize( |
| 585 | + 'core_schema_left,core_schema_right,input_value,expected_value', |
| 586 | + [ |
| 587 | + (core_schema.int_schema(), core_schema.bool_schema(), True, True), |
| 588 | + (core_schema.int_schema(), core_schema.bool_schema(), 1, 1), |
| 589 | + (core_schema.str_schema(), core_schema.int_schema(), 1, 1), |
| 590 | + (core_schema.str_schema(), core_schema.int_schema(), '1', '1'), |
| 591 | + (core_schema.int_schema(), core_schema.bool_schema(), IntSubclass(1), 1), |
| 592 | + ( |
| 593 | + core_schema.decimal_schema(), |
| 594 | + core_schema.int_schema(), |
| 595 | + Decimal('1'), |
| 596 | + '1', |
| 597 | + ), |
| 598 | + (core_schema.decimal_schema(), core_schema.int_schema(), 1, 1), |
| 599 | + ( |
| 600 | + core_schema.decimal_schema(), |
| 601 | + core_schema.float_schema(), |
| 602 | + Decimal('1.'), |
| 603 | + '1', |
| 604 | + ), |
| 605 | + ( |
| 606 | + core_schema.decimal_schema(), |
| 607 | + core_schema.str_schema(), |
| 608 | + Decimal('_1'), |
| 609 | + '1', |
| 610 | + ), |
| 611 | + ( |
| 612 | + core_schema.decimal_schema(), |
| 613 | + core_schema.str_schema(), |
| 614 | + '_1', |
| 615 | + '_1', |
| 616 | + ), |
| 617 | + ], |
| 618 | +) |
| 619 | +def test_union_serializer_picks_exact_type_over_subclass_json( |
| 620 | + core_schema_left, core_schema_right, input_value, expected_value, reverse |
| 621 | +): |
| 622 | + s = SchemaSerializer( |
| 623 | + core_schema.union_schema( |
| 624 | + [core_schema_right, core_schema_left] if reverse else [core_schema_left, core_schema_right] |
| 625 | + ) |
| 626 | + ) |
| 627 | + assert s.to_python(input_value, mode='json') == expected_value |
| 628 | + assert s.to_json(input_value) == json.dumps(expected_value).encode() |
0 commit comments