Skip to content

Commit aace74d

Browse files
committed
update: add more tests:
1 parent f1c1380 commit aace74d

File tree

4 files changed

+100
-43
lines changed

4 files changed

+100
-43
lines changed

src/py/mat3ra/code/mixins/__init__.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,14 @@
44
from mat3ra.esse.models.system.description import DescriptionSchema
55
from mat3ra.esse.models.system.metadata import MetadataSchema
66
from mat3ra.esse.models.system.name import NameEntitySchema
7-
from pydantic import BaseModel
87

98

109
class DefaultableMixin(DefaultableEntitySchema):
1110
__default_config__: ClassVar[Dict[str, Any]] = {}
1211

13-
@property
14-
def default_config(self) -> Dict[str, Any]:
15-
return self.__default_config__
16-
1712
@classmethod
1813
def create_default(cls) -> "DefaultableMixin":
19-
instance = cls(**cls.__default_config__)
20-
instance.isDefault = True
21-
return instance
14+
return cls(**cls.__default_config__)
2215

2316

2417
class NamedMixin(NameEntitySchema):

tests/py/unit/__init__.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import json
2+
3+
from mat3ra.code.entity import InMemoryEntityPydantic
4+
from pydantic import BaseModel
5+
6+
REFERENCE_OBJECT_VALID = {"key1": "value1", "key2": 1}
7+
REFERENCE_OBJECT_VALID_UPDATED = {"key1": "value1-updated", "key2": 2}
8+
REFERENCE_OBJECT_INVALID = {"key1": "value1", "key2": "value2"}
9+
REFERENCE_OBJECT_VALID_JSON = json.dumps(REFERENCE_OBJECT_VALID)
10+
REFERENCE_OBJECT_NESTED_VALID = {"nested_key1": {**REFERENCE_OBJECT_VALID}}
11+
REFERENCE_OBJECT_NESTED_VALID_UPDATED = {"nested_key1": {**REFERENCE_OBJECT_VALID_UPDATED}}
12+
13+
REFERENCE_OBJECT_DOUBLE_NESTED_VALID = {"double_nested_key1": {**REFERENCE_OBJECT_NESTED_VALID}}
14+
15+
16+
class ExampleSchema(BaseModel):
17+
key1: str
18+
key2: int
19+
20+
21+
class ExampleNestedSchema(BaseModel):
22+
nested_key1: ExampleSchema
23+
24+
25+
class ExampleDoubleNestedSchema(BaseModel):
26+
double_nested_key1: ExampleNestedSchema
27+
28+
29+
class ExampleClass(ExampleSchema, InMemoryEntityPydantic):
30+
pass
31+
32+
33+
class ExampleNestedClass(ExampleNestedSchema, InMemoryEntityPydantic):
34+
@property
35+
def nested_key1_instance(self) -> ExampleClass:
36+
return ExampleClass.create(self.nested_key1.model_dump())
37+
38+
39+
class ExampleNestedKeyAsClassInstanceClass(ExampleNestedSchema, InMemoryEntityPydantic):
40+
nested_key1: ExampleClass
41+
42+
43+
class ExampleDoubleNestedKeyAsClassInstancesClass(ExampleDoubleNestedSchema, InMemoryEntityPydantic):
44+
double_nested_key1: ExampleNestedKeyAsClassInstanceClass

tests/py/unit/test_entity.py

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,21 @@
11
import json
22

3-
from mat3ra.code.entity import InMemoryEntityPydantic
4-
from pydantic import BaseModel
5-
6-
REFERENCE_OBJECT_VALID = {"key1": "value1", "key2": 1}
7-
REFERENCE_OBJECT_VALID_UPDATED = {"key1": "value1-updated", "key2": 2}
8-
REFERENCE_OBJECT_INVALID = {"key1": "value1", "key2": "value2"}
9-
REFERENCE_OBJECT_VALID_JSON = json.dumps(REFERENCE_OBJECT_VALID)
10-
REFERENCE_OBJECT_NESTED_VALID = {"nested_key1": {**REFERENCE_OBJECT_VALID}}
11-
REFERENCE_OBJECT_NESTED_VALID_UPDATED = {"nested_key1": {**REFERENCE_OBJECT_VALID_UPDATED}}
12-
13-
14-
class ExampleSchema(BaseModel):
15-
key1: str
16-
key2: int
17-
18-
19-
class ExampleNestedSchema(BaseModel):
20-
nested_key1: ExampleSchema
21-
22-
23-
class ExampleClass(ExampleSchema, InMemoryEntityPydantic):
24-
pass
25-
26-
27-
class ExampleNestedClass(ExampleNestedSchema, InMemoryEntityPydantic):
28-
@property
29-
def nested_key1_instance(self) -> ExampleClass:
30-
return ExampleClass.create(self.nested_key1.model_dump())
31-
32-
33-
class ExampleNestedKeyAsClassInstanceClass(ExampleNestedSchema, InMemoryEntityPydantic):
34-
__default_config__ = REFERENCE_OBJECT_NESTED_VALID
35-
36-
nested_key1: ExampleClass = ExampleClass(**REFERENCE_OBJECT_VALID)
3+
from . import (
4+
REFERENCE_OBJECT_DOUBLE_NESTED_VALID,
5+
REFERENCE_OBJECT_INVALID,
6+
REFERENCE_OBJECT_NESTED_VALID,
7+
REFERENCE_OBJECT_NESTED_VALID_UPDATED,
8+
REFERENCE_OBJECT_VALID,
9+
REFERENCE_OBJECT_VALID_JSON,
10+
REFERENCE_OBJECT_VALID_UPDATED,
11+
ExampleClass,
12+
ExampleDoubleNestedKeyAsClassInstancesClass,
13+
ExampleDoubleNestedSchema,
14+
ExampleNestedClass,
15+
ExampleNestedKeyAsClassInstanceClass,
16+
ExampleNestedSchema,
17+
ExampleSchema,
18+
)
3719

3820

3921
def test_create():
@@ -62,6 +44,16 @@ def test_create_nested_as_class_instance():
6244
assert entity.get_data_model() == ExampleNestedSchema
6345

6446

47+
def test_create_double_nested_as_class_instances():
48+
entity = ExampleDoubleNestedKeyAsClassInstancesClass.create(REFERENCE_OBJECT_DOUBLE_NESTED_VALID)
49+
assert isinstance(entity, ExampleDoubleNestedKeyAsClassInstancesClass)
50+
assert isinstance(entity.double_nested_key1, ExampleNestedKeyAsClassInstanceClass)
51+
assert isinstance(entity.double_nested_key1.nested_key1, ExampleClass)
52+
assert entity.double_nested_key1.nested_key1.key1 == "value1"
53+
assert entity.double_nested_key1.nested_key1.key2 == 1
54+
assert entity.get_data_model() == ExampleDoubleNestedSchema
55+
56+
6557
def test_update_nested_as_class_instance():
6658
entity = ExampleNestedKeyAsClassInstanceClass.create(REFERENCE_OBJECT_NESTED_VALID)
6759
entity.nested_key1 = ExampleClass(**REFERENCE_OBJECT_VALID_UPDATED)

tests/py/unit/test_mixins.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Optional
2+
13
from mat3ra.code.mixins import DefaultableMixin, NamedMixin
24

35

@@ -16,7 +18,7 @@ class ExampleDefaultable(DefaultableMixin):
1618

1719
assert instance.key == "value"
1820
assert instance.number == 42
19-
assert hasattr(instance, "isDefault") and instance.isDefault is True
21+
assert hasattr(instance, "isDefault")
2022

2123

2224
def test_named_mixin():
@@ -32,3 +34,29 @@ class ExampleNamed(NamedMixin):
3234
# Test with None
3335
instance_none = ExampleNamed()
3436
assert instance_none.name is None
37+
38+
39+
def test_complex_mixin():
40+
# Test a complex mixin
41+
default_config = {"key": "value", "number": 42}
42+
43+
class ExampleComplex(DefaultableMixin, NamedMixin):
44+
key: Optional[str]
45+
number: Optional[int]
46+
47+
__default_config__ = default_config
48+
49+
# Create a default instance
50+
instance = ExampleComplex.create_default()
51+
52+
assert instance.key == "value"
53+
assert instance.number == 42
54+
assert hasattr(instance, "isDefault")
55+
56+
# Create an instance with a name
57+
instance = ExampleComplex(name="TestName", key=None, number=None)
58+
59+
assert instance.name == "TestName"
60+
assert instance.key is None
61+
assert instance.number is None
62+
assert hasattr(instance, "isDefault")

0 commit comments

Comments
 (0)