mirror of
				https://github.com/fastapi/sqlmodel.git
				synced 2025-11-04 22:56:21 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from decimal import Decimal
 | 
						|
from typing import Optional, Union
 | 
						|
 | 
						|
import pytest
 | 
						|
from pydantic import ValidationError
 | 
						|
from sqlmodel import Field, SQLModel
 | 
						|
from typing_extensions import Literal
 | 
						|
 | 
						|
 | 
						|
def test_decimal():
 | 
						|
    class Model(SQLModel):
 | 
						|
        dec: Decimal = Field(max_digits=4, decimal_places=2)
 | 
						|
 | 
						|
    Model(dec=Decimal("3.14"))
 | 
						|
    Model(dec=Decimal("69.42"))
 | 
						|
 | 
						|
    with pytest.raises(ValidationError):
 | 
						|
        Model(dec=Decimal("3.142"))
 | 
						|
    with pytest.raises(ValidationError):
 | 
						|
        Model(dec=Decimal("0.069"))
 | 
						|
    with pytest.raises(ValidationError):
 | 
						|
        Model(dec=Decimal("420"))
 | 
						|
 | 
						|
 | 
						|
def test_discriminator():
 | 
						|
    # Example adapted from
 | 
						|
    # [Pydantic docs](https://pydantic-docs.helpmanual.io/usage/types/#discriminated-unions-aka-tagged-unions):
 | 
						|
 | 
						|
    class Cat(SQLModel):
 | 
						|
        pet_type: Literal["cat"]
 | 
						|
        meows: int
 | 
						|
 | 
						|
    class Dog(SQLModel):
 | 
						|
        pet_type: Literal["dog"]
 | 
						|
        barks: float
 | 
						|
 | 
						|
    class Lizard(SQLModel):
 | 
						|
        pet_type: Literal["reptile", "lizard"]
 | 
						|
        scales: bool
 | 
						|
 | 
						|
    class Model(SQLModel):
 | 
						|
        pet: Union[Cat, Dog, Lizard] = Field(..., discriminator="pet_type")
 | 
						|
        n: int
 | 
						|
 | 
						|
    Model(pet={"pet_type": "dog", "barks": 3.14}, n=1)  # type: ignore[arg-type]
 | 
						|
 | 
						|
    with pytest.raises(ValidationError):
 | 
						|
        Model(pet={"pet_type": "dog"}, n=1)  # type: ignore[arg-type]
 | 
						|
 | 
						|
 | 
						|
def test_repr():
 | 
						|
    class Model(SQLModel):
 | 
						|
        id: Optional[int] = Field(primary_key=True)
 | 
						|
        foo: str = Field(repr=False)
 | 
						|
 | 
						|
    instance = Model(id=123, foo="bar")
 | 
						|
    assert "foo=" not in repr(instance)
 |