Skip to content

Commit f3d758d

Browse files
committed
Small refactoring of metadata tests
1 parent 43aeb20 commit f3d758d

4 files changed

Lines changed: 57 additions & 122 deletions

File tree

tests/hypothesis_strategies/parameters.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ def substance_parameters(draw: st.DrawFn):
175175
encodings.remove(SubstanceEncoding.RDKIT)
176176
encoding = draw(st.sampled_from(encodings))
177177

178-
# Optionally generate metadata
179178
param_metadata = draw(measurable_metadata())
180179

181180
return SubstanceParameter(

tests/hypothesis_strategies/targets.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ def numerical_targets(
3838
)
3939
bounds = draw(bounds_strategy)
4040

41-
# Optionally generate metadata
4241
target_metadata = draw(measurable_metadata())
4342

4443
return NumericalTarget(
@@ -62,7 +61,6 @@ def binary_targets(draw: st.DrawFn):
6261
name = draw(target_name)
6362
choices = draw(st.lists(choice_values, min_size=2, max_size=2, unique=True))
6463

65-
# Optionally generate metadata
6664
target_metadata = draw(measurable_metadata())
6765

6866
return BinaryTarget(

tests/integration/test_metadata_integration.py

Lines changed: 33 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from baybe.objectives.single import SingleTargetObjective
66
from baybe.parameters.numerical import NumericalDiscreteParameter
7-
from baybe.targets.enum import TargetMode, TargetTransformation
7+
from baybe.targets.enum import TargetMode
88
from baybe.targets.numerical import NumericalTarget
99
from baybe.utils.metadata import MeasurableMetadata, Metadata
1010

@@ -65,32 +65,30 @@ def test_parameter_metadata_always_non_none(self):
6565
class TestTargetMetadataIntegration:
6666
"""Tests for metadata integration with Target class."""
6767

68+
def _create_target(self, **kwargs) -> NumericalTarget:
69+
"""Create a standard NumericalTarget for testing."""
70+
return NumericalTarget(
71+
name="yield",
72+
mode=TargetMode.MAX,
73+
transformation=None,
74+
**kwargs,
75+
)
76+
6877
@pytest.mark.parametrize("as_dict", [True, False])
6978
def test_target_with_metadata(self, as_dict: bool):
7079
"""Targets accept, ingest, and surface metadata."""
7180
meta = MeasurableMetadata(
7281
description="test target", unit="kg", misc={"priority": "high"}
7382
)
74-
target = NumericalTarget(
75-
name="yield",
76-
bounds=(0, 100),
77-
mode=TargetMode.MAX,
78-
transformation=TargetTransformation.LINEAR,
79-
metadata=meta.to_dict() if as_dict else meta,
80-
)
83+
target = self._create_target(metadata=meta.to_dict() if as_dict else meta)
8184
assert target.description == "test target"
8285
assert target.unit == "kg"
8386
assert target.metadata is not None
8487
assert target.metadata.misc == {"priority": "high"}
8588

8689
def test_target_without_metadata(self):
8790
"""Targets without metadata have ``None`` properties."""
88-
target = NumericalTarget(
89-
name="yield",
90-
bounds=(0, 100),
91-
mode=TargetMode.MAX,
92-
transformation=TargetTransformation.LINEAR,
93-
)
91+
target = self._create_target()
9492
assert target.metadata is not None
9593
assert target.metadata.is_empty
9694
assert target.description is None
@@ -99,37 +97,22 @@ def test_target_without_metadata(self):
9997
def test_target_metadata_always_non_none(self):
10098
"""Test that target metadata is always non-None."""
10199
# Test target without explicit metadata
102-
target1 = NumericalTarget(
103-
name="yield",
104-
bounds=(0, 100),
105-
mode=TargetMode.MAX,
106-
transformation=TargetTransformation.LINEAR,
107-
)
100+
target1 = self._create_target()
108101
assert target1.metadata is not None
109102
assert target1.metadata.is_empty
110103
assert target1.description is None
111104
assert target1.unit is None
112105

113106
# Test target with empty dict metadata
114-
target2 = NumericalTarget(
115-
name="yield",
116-
bounds=(0, 100),
117-
mode=TargetMode.MAX,
118-
transformation=TargetTransformation.LINEAR,
119-
metadata={},
120-
)
107+
target2 = self._create_target(metadata={})
121108
assert target2.metadata is not None
122109
assert target2.metadata.is_empty
123110
assert target2.description is None
124111
assert target2.unit is None
125112

126113
# Test target with actual metadata
127-
target3 = NumericalTarget(
128-
name="yield",
129-
bounds=(0, 100),
130-
mode=TargetMode.MAX,
131-
transformation=TargetTransformation.LINEAR,
132-
metadata={"description": "Chemical yield", "unit": "%"},
114+
target3 = self._create_target(
115+
metadata={"description": "Chemical yield", "unit": "%"}
133116
)
134117
assert target3.metadata is not None
135118
assert not target3.metadata.is_empty
@@ -138,12 +121,8 @@ def test_target_metadata_always_non_none(self):
138121

139122
def test_target_metadata_serialization(self):
140123
"""Target metadata survives serialization roundtrip."""
141-
target = NumericalTarget(
142-
name="yield",
143-
bounds=(0, 100),
144-
mode=TargetMode.MAX,
145-
transformation=TargetTransformation.LINEAR,
146-
metadata={"description": "Chemical yield", "unit": "%", "method": "HPLC"},
124+
target = self._create_target(
125+
metadata={"description": "Chemical yield", "unit": "%", "method": "HPLC"}
147126
)
148127

149128
# Serialize and deserialize
@@ -160,6 +139,15 @@ def test_target_metadata_serialization(self):
160139
class TestObjectiveMetadataIntegration:
161140
"""Tests for metadata integration with Objective class."""
162141

142+
def _create_target(self, **kwargs) -> NumericalTarget:
143+
"""Create a standard NumericalTarget for testing."""
144+
return NumericalTarget(
145+
name="yield",
146+
mode=TargetMode.MAX,
147+
transformation=None,
148+
**kwargs,
149+
)
150+
163151
@pytest.mark.parametrize("as_dict", [True, False])
164152
def test_objective_with_metadata(self, as_dict: bool):
165153
"""Objectives accept, ingest, and surface metadata."""
@@ -168,12 +156,7 @@ def test_objective_with_metadata(self, as_dict: bool):
168156
)
169157

170158
# Create a target first
171-
target = NumericalTarget(
172-
name="yield",
173-
bounds=(0, 100),
174-
mode=TargetMode.MAX,
175-
transformation=TargetTransformation.LINEAR,
176-
)
159+
target = self._create_target()
177160

178161
objective = SingleTargetObjective(
179162
target=target,
@@ -185,12 +168,7 @@ def test_objective_with_metadata(self, as_dict: bool):
185168

186169
def test_objective_without_metadata(self):
187170
"""Objectives without metadata have ``None`` properties."""
188-
target = NumericalTarget(
189-
name="yield",
190-
bounds=(0, 100),
191-
mode=TargetMode.MAX,
192-
transformation=TargetTransformation.LINEAR,
193-
)
171+
target = self._create_target()
194172

195173
objective = SingleTargetObjective(target=target)
196174
assert objective.metadata is not None
@@ -199,12 +177,7 @@ def test_objective_without_metadata(self):
199177

200178
def test_objective_metadata_serialization(self):
201179
"""Objective metadata survives serialization roundtrip."""
202-
target = NumericalTarget(
203-
name="yield",
204-
bounds=(0, 100),
205-
mode=TargetMode.MAX,
206-
transformation=TargetTransformation.LINEAR,
207-
)
180+
target = self._create_target()
208181

209182
objective = SingleTargetObjective(
210183
target=target,
@@ -222,12 +195,8 @@ def test_objective_metadata_serialization(self):
222195

223196
def test_combined_target_objective_metadata(self):
224197
"""Both target and objective can have independent metadata."""
225-
target = NumericalTarget(
226-
name="yield",
227-
bounds=(0, 100),
228-
mode=TargetMode.MAX,
229-
transformation=TargetTransformation.LINEAR,
230-
metadata={"description": "Chemical yield", "unit": "%"},
198+
target = self._create_target(
199+
metadata={"description": "Chemical yield", "unit": "%"}
231200
)
232201

233202
objective = SingleTargetObjective(
@@ -250,12 +219,7 @@ def test_combined_target_objective_metadata(self):
250219

251220
def test_objective_metadata_always_non_none(self):
252221
"""Test that objective metadata is always non-None."""
253-
target = NumericalTarget(
254-
name="yield",
255-
bounds=(0, 100),
256-
mode=TargetMode.MAX,
257-
transformation=TargetTransformation.LINEAR,
258-
)
222+
target = self._create_target()
259223

260224
# Test objective without explicit metadata
261225
objective1 = SingleTargetObjective(target=target)

tests/validation/test_metadata_validation.py

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pytest import param
55

66
from baybe.objectives.single import SingleTargetObjective
7-
from baybe.targets.enum import TargetMode, TargetTransformation
7+
from baybe.targets.enum import TargetMode
88
from baybe.targets.numerical import NumericalTarget
99
from baybe.utils.metadata import MeasurableMetadata, Metadata, to_metadata
1010

@@ -39,25 +39,7 @@ def test_invalid_arguments_for_metadata(description, misc, error, match):
3939
@pytest.mark.parametrize(
4040
("description", "unit", "misc", "error", "match"),
4141
[
42-
param(0, None, {}, TypeError, "must be <class 'str'>", id="desc-non-str"),
4342
param(None, 0, {}, TypeError, "must be <class 'str'>", id="unit-non-str"),
44-
param(None, None, 0, TypeError, "must be <class 'dict'>", id="misc-non-dict"),
45-
param(
46-
None,
47-
None,
48-
{0: 0},
49-
TypeError,
50-
"must be <class 'str'>",
51-
id="misc-non-str-keys",
52-
),
53-
param(
54-
None,
55-
None,
56-
{"description": 0},
57-
ValueError,
58-
"fields: {'description'}",
59-
id="desc_in_misc",
60-
),
6143
param(
6244
None, None, {"unit": 0}, ValueError, "fields: {'unit'}", id="unit_in_misc"
6345
),
@@ -91,39 +73,32 @@ def test_invalid_input_conversion(invalid_input):
9173
class TestTargetMetadataValidation:
9274
"""Validation tests for target metadata."""
9375

76+
def _create_target(self, **kwargs) -> NumericalTarget:
77+
"""Create a standard NumericalTarget for testing."""
78+
return NumericalTarget(
79+
name="test",
80+
mode=TargetMode.MAX,
81+
transformation=None,
82+
**kwargs,
83+
)
84+
9485
def test_target_invalid_metadata_type(self):
9586
"""Creating target with invalid metadata type raises error."""
9687
with pytest.raises(
9788
TypeError, match="must be a dictionary or a 'MeasurableMetadata' instance"
9889
):
99-
NumericalTarget(
100-
name="test",
101-
bounds=(0, 1),
102-
mode=TargetMode.MAX,
103-
transformation=TargetTransformation.LINEAR,
104-
metadata="invalid_string",
105-
)
90+
self._create_target(metadata="invalid_string")
10691

10792
def test_target_metadata_with_invalid_unit(self):
10893
"""Target metadata with invalid unit type raises error."""
10994
with pytest.raises(TypeError, match="must be <class 'str'>"):
110-
NumericalTarget(
111-
name="test",
112-
bounds=(0, 1),
113-
mode=TargetMode.MAX,
114-
transformation=TargetTransformation.LINEAR,
115-
metadata={"unit": 123}, # Invalid unit type
116-
)
95+
self._create_target(metadata={"unit": 123}) # Invalid unit type
11796

11897
def test_target_metadata_with_unit_field_separation(self):
11998
"""Target metadata should automatically separate unit from misc."""
12099
# This test shows that unit is automatically separated from misc
121-
target = NumericalTarget(
122-
name="test",
123-
bounds=(0, 1),
124-
mode=TargetMode.MAX,
125-
transformation=TargetTransformation.LINEAR,
126-
metadata={"description": "test", "unit": "kg", "extra": "value"},
100+
target = self._create_target(
101+
metadata={"description": "test", "unit": "kg", "extra": "value"}
127102
)
128103
# The unit should be extracted to the unit field
129104
assert target.unit == "kg"
@@ -141,28 +116,27 @@ def test_target_direct_metadata_with_unit_in_misc(self):
141116
class TestObjectiveMetadataValidation:
142117
"""Validation tests for objective metadata."""
143118

144-
def test_objective_invalid_metadata_type(self):
145-
"""Creating objective with invalid metadata type raises error."""
146-
target = NumericalTarget(
119+
def _create_target(self, **kwargs) -> NumericalTarget:
120+
"""Create a standard NumericalTarget for testing."""
121+
return NumericalTarget(
147122
name="test",
148-
bounds=(0, 1),
149123
mode=TargetMode.MAX,
150-
transformation=TargetTransformation.LINEAR,
124+
transformation=None,
125+
**kwargs,
151126
)
152127

128+
def test_objective_invalid_metadata_type(self):
129+
"""Creating objective with invalid metadata type raises error."""
130+
target = self._create_target()
131+
153132
with pytest.raises(
154133
TypeError, match="must be a dictionary or a 'Metadata' instance"
155134
):
156135
SingleTargetObjective(target=target, metadata=["invalid_list"])
157136

158137
def test_objective_metadata_field_separation(self):
159138
"""Objective metadata should automatically separate description from misc."""
160-
target = NumericalTarget(
161-
name="test",
162-
bounds=(0, 1),
163-
mode=TargetMode.MAX,
164-
transformation=TargetTransformation.LINEAR,
165-
)
139+
target = self._create_target()
166140

167141
# Test that description is automatically separated from other fields
168142
objective = SingleTargetObjective(

0 commit comments

Comments
 (0)