diff --git a/src/assertical/fake/generator.py b/src/assertical/fake/generator.py index c017451..37bb3a7 100644 --- a/src/assertical/fake/generator.py +++ b/src/assertical/fake/generator.py @@ -487,6 +487,14 @@ def generate_class_instance( # noqa: C901 f"Type {t} has property {member.name} with type {member.declared_type} that cannot be generated" ) + if member.collection_type in (CollectionType.REQUIRED_DICT, CollectionType.OPTIONAL_DICT): + if member.second_type_to_generate is None and not ( + optional_is_none and member.collection_type == CollectionType.OPTIONAL_DICT + ): + raise Exception( + f"Type {t} has property {member.name} with type {member.declared_type} that cannot be generated" + ) + generated_value: Any = None empty_collection: bool = False collection_type: Optional[CollectionType] = member.collection_type diff --git a/tests/fake/test_generator_dataclass.py b/tests/fake/test_generator_dataclass.py index 4da035c..55e6477 100644 --- a/tests/fake/test_generator_dataclass.py +++ b/tests/fake/test_generator_dataclass.py @@ -3,7 +3,7 @@ import sys from dataclasses import dataclass, field from datetime import datetime, time -from typing import Generator, Optional +from typing import Any, Generator, Optional from pathlib import Path import pytest @@ -104,6 +104,25 @@ class DataclassWithUngeneratableType: generate_class_instance(DataclassWithUngeneratableType, optional_is_none=True) +def test_dataclass_with_ungeneratable_dict_value_type(): + """dict[str, Any] has an unresolvable value type - should raise a clear error, not crash cryptically.""" + + @dataclass + class DataclassWithUngeneratableDict: + d: dict[str, Any] + + with pytest.raises(Exception, match="cannot be generated"): + generate_class_instance(DataclassWithUngeneratableDict, generate_relationships=True) + + # Optional dict with optional_is_none=True should be bypassed (set to None) without raising + @dataclass + class DataclassWithOptionalUngeneratableDict: + d: Optional[dict[str, Any]] + + result = generate_class_instance(DataclassWithOptionalUngeneratableDict, optional_is_none=True) + assert result.d is None + + def test_collections_dataclass(): _ = generate_class_instance(CollectionsDataclass, seed=1, generate_relationships=True)