63 lines
1.1 KiB
Python
63 lines
1.1 KiB
Python
from __future__ import annotations
|
|
from dataclasses import dataclass
|
|
from typing import Optional
|
|
|
|
from src.megasniff import SchemaInflatorGenerator
|
|
|
|
|
|
def test_basic_constructor():
|
|
class A:
|
|
def __init__(self, a: int):
|
|
self.a = a
|
|
|
|
infl = SchemaInflatorGenerator()
|
|
fn = infl.schema_to_inflator(A)
|
|
a = fn({'a': 42})
|
|
|
|
assert a.a == 42
|
|
|
|
|
|
def test_unions():
|
|
@dataclass
|
|
class A:
|
|
a: int | str
|
|
|
|
infl = SchemaInflatorGenerator()
|
|
fn = infl.schema_to_inflator(A)
|
|
|
|
a = fn({'a': 42})
|
|
assert a.a == 42
|
|
a = fn({'a': '42'})
|
|
assert a.a == 42
|
|
a = fn({'a': '42a'})
|
|
assert a.a == '42a'
|
|
|
|
|
|
@dataclass
|
|
class CircA:
|
|
b: CircB
|
|
|
|
|
|
@dataclass
|
|
class CircB:
|
|
a: CircA | None
|
|
|
|
|
|
def test_circular():
|
|
infl = SchemaInflatorGenerator()
|
|
fn = infl.schema_to_inflator(CircA)
|
|
a = fn({'b': {'a': None}})
|
|
|
|
assert isinstance(a.b, CircB)
|
|
|
|
|
|
def test_optional():
|
|
@dataclass
|
|
class C:
|
|
a: Optional[int] = None
|
|
|
|
infl = SchemaInflatorGenerator()
|
|
fn = infl.schema_to_inflator(C)
|
|
c = fn({})
|
|
assert c.a is None
|