from dataclasses import dataclass import pytest from megasniff import SchemaDeflatorGenerator from megasniff.exceptions import FieldValidationException def test_global_explicit_casts_basic(): class A: a: int def __init__(self, a): self.a = a defl = SchemaDeflatorGenerator(explicit_casts=True) fn = defl.schema_to_deflator(A) a = fn(A(42)) assert a['a'] == 42 a = fn(A(42.0)) assert a['a'] == 42 a = fn(A('42')) assert a['a'] == 42 with pytest.raises(TypeError): fn(A(['42'])) def test_global_explicit_casts_basic_override(): class A: a: int def __init__(self, a): self.a = a defl = SchemaDeflatorGenerator(explicit_casts=False) fn = defl.schema_to_deflator(A, explicit_casts_override=True) a = fn(A(42)) assert a['a'] == 42 a = fn(A(42.0)) assert a['a'] == 42 a = fn(A('42')) assert a['a'] == 42 with pytest.raises(TypeError): fn(A(['42'])) def test_global_explicit_casts_list(): @dataclass class A: a: list[int] defl = SchemaDeflatorGenerator(explicit_casts=True) fn = defl.schema_to_deflator(A) a = fn(A([42])) assert a['a'] == [42] a = fn(A([42.0, 42])) assert len(a['a']) == 2 assert a['a'][0] == 42 assert a['a'][1] == 42 def test_global_explicit_casts_circular(): @dataclass class A: a: list[int] @dataclass class B: b: list[A | int] defl = SchemaDeflatorGenerator(explicit_casts=True) fn = defl.schema_to_deflator(B) b = fn(B([A([]), 42])) assert len(b['b']) == 2 assert isinstance(b['b'][0], dict) assert len(b['b'][0]['a']) == 0 assert isinstance(b['b'][1], int) b = fn(B([42.0])) assert b['b'][0] == 42 b = fn(B([A([1.1])])) assert b['b'][0]['a'][0] == 1