Skip to content

Commit 8e19a19

Browse files
committed
Improve tests.
1 parent 299a6e8 commit 8e19a19

2 files changed

Lines changed: 67 additions & 2 deletions

File tree

benedict/utils/pydantic_util.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
PydanticModel = type["BaseModel"]
1414

1515

16-
def is_pydantic_model_class(obj: Any) -> bool:
16+
def _is_pydantic_model(obj: Any) -> bool:
1717
"""
1818
Check if an object is a Pydantic model class.
1919
"""
@@ -34,7 +34,7 @@ def validate_data(data: Any, *, schema: PydanticModel | None = None) -> Any:
3434

3535
require_validate(installed=pydantic_installed)
3636

37-
if not is_pydantic_model_class(schema):
37+
if not _is_pydantic_model(schema):
3838
raise ValueError("Invalid schema. Schema must be a Pydantic model class.")
3939

4040
validated = schema.model_validate(data)

tests/utils/test_pydantic_util.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import unittest
2+
from unittest.mock import patch
3+
4+
from pydantic import BaseModel, ValidationError
5+
6+
from benedict.exceptions import ExtrasRequireModuleNotFoundError
7+
from benedict.utils import pydantic_util
8+
9+
10+
class User(BaseModel):
11+
name: str
12+
age: int
13+
14+
15+
class TestPydanticUtil(unittest.TestCase):
16+
def setUp(self):
17+
self.valid_data = {"name": "John", "age": 30}
18+
self.invalid_data = {"name": "John", "age": "not_an_int"}
19+
20+
def test_validate_data_with_valid_data(self):
21+
# validation with valid data succeeds
22+
validated = pydantic_util.validate_data(self.valid_data, schema=User)
23+
self.assertEqual(validated["name"], "John")
24+
self.assertEqual(validated["age"], 30)
25+
26+
def test_validate_data_with_invalid_data(self):
27+
# validation with invalid data raises ValidationError
28+
with self.assertRaises(ValidationError):
29+
pydantic_util.validate_data(self.invalid_data, schema=User)
30+
31+
def test_validate_data_with_no_schema(self):
32+
# validation without schema returns original data
33+
data = {"any": "data"}
34+
validated = pydantic_util.validate_data(data, schema=None)
35+
self.assertEqual(validated, data)
36+
37+
def test_validate_data_with_invalid_schema(self):
38+
# validation with non-pydantic schema raises ValueError
39+
class NotAModel:
40+
pass
41+
42+
with self.assertRaises(ValueError) as cm:
43+
pydantic_util.validate_data(self.valid_data, schema=NotAModel)
44+
self.assertEqual(
45+
str(cm.exception), "Invalid schema. Schema must be a Pydantic model class."
46+
)
47+
48+
# validation with invalid schema type raises ValueError
49+
with self.assertRaises(ValueError) as cm:
50+
pydantic_util.validate_data(self.valid_data, schema="not_a_schema")
51+
self.assertEqual(
52+
str(cm.exception), "Invalid schema. Schema must be a Pydantic model class."
53+
)
54+
55+
@patch("benedict.utils.pydantic_util.pydantic_installed", False)
56+
@patch("benedict.utils.pydantic_util.BaseModel", None)
57+
def test_validate_data_when_pydantic_not_installed(self):
58+
# validation without schema still works when pydantic is not installed
59+
data = {"any": "data"}
60+
validated = pydantic_util.validate_data(data, schema=None)
61+
self.assertEqual(validated, data)
62+
63+
# validation with schema raises ExtrasRequireModuleNotFoundError
64+
with self.assertRaises(ExtrasRequireModuleNotFoundError):
65+
pydantic_util.validate_data(self.valid_data, schema=User)

0 commit comments

Comments
 (0)