feat: initialize data-layer project skeleton
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
from datetime import UTC, datetime
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from lmpm.domain.experiment import ExperimentRecord, ProcessingParams, QualityMetrics
|
||||
from lmpm.domain.material import MaterialProperty
|
||||
|
||||
|
||||
def material_property():
|
||||
return MaterialProperty(
|
||||
material_id="acrylic-001",
|
||||
name="Clear Acrylic",
|
||||
category="polymer",
|
||||
reflectivity=0.08,
|
||||
absorptivity=0.92,
|
||||
melting_point_c=160.0,
|
||||
thermal_conductivity_w_m_k=0.19,
|
||||
density_g_cm3=1.18,
|
||||
roughness_um=1.2,
|
||||
)
|
||||
|
||||
|
||||
def test_material_property_accepts_valid_values():
|
||||
material = material_property()
|
||||
|
||||
assert material.material_id == "acrylic-001"
|
||||
assert material.absorptivity == pytest.approx(0.92)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("field", "value"),
|
||||
[("reflectivity", -0.1), ("absorptivity", 1.1), ("density_g_cm3", 0)],
|
||||
)
|
||||
def test_material_property_rejects_out_of_range_values(field, value):
|
||||
data = material_property().model_dump()
|
||||
data[field] = value
|
||||
|
||||
with pytest.raises(ValidationError):
|
||||
MaterialProperty.model_validate(data)
|
||||
|
||||
|
||||
def test_experiment_record_round_trips_nested_models():
|
||||
experiment = ExperimentRecord(
|
||||
experiment_id=1,
|
||||
material_id="acrylic-001",
|
||||
params=ProcessingParams(
|
||||
power_percent=45,
|
||||
scan_speed_mm_s=80,
|
||||
pulse_frequency_hz=20,
|
||||
),
|
||||
metrics=QualityMetrics(kerf_width_mm=0.18),
|
||||
recorded_at=datetime.now(UTC),
|
||||
)
|
||||
|
||||
dumped = experiment.model_dump()
|
||||
restored = ExperimentRecord.model_validate(dumped)
|
||||
|
||||
assert restored == experiment
|
||||
@@ -0,0 +1,57 @@
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from lmpm.data.store import add_experiment, add_material, init_db, list_experiments
|
||||
from lmpm.domain.experiment import ExperimentRecord, ProcessingParams, QualityMetrics
|
||||
from lmpm.domain.material import MaterialProperty
|
||||
|
||||
|
||||
def material_property():
|
||||
return MaterialProperty(
|
||||
material_id="acrylic-001",
|
||||
name="Clear Acrylic",
|
||||
category="polymer",
|
||||
reflectivity=0.08,
|
||||
absorptivity=0.92,
|
||||
melting_point_c=160.0,
|
||||
thermal_conductivity_w_m_k=0.19,
|
||||
density_g_cm3=1.18,
|
||||
roughness_um=1.2,
|
||||
)
|
||||
|
||||
|
||||
def prepare_database(tmp_path):
|
||||
database_path = tmp_path / "lemdb.db"
|
||||
material = material_property()
|
||||
init_db(database_path)
|
||||
add_material(database_path, material)
|
||||
return database_path, material
|
||||
|
||||
|
||||
def test_init_db_creates_readable_tables(tmp_path):
|
||||
database_path, _ = prepare_database(tmp_path)
|
||||
|
||||
assert database_path.exists()
|
||||
|
||||
|
||||
def test_experiment_round_trip_through_sqlite(tmp_path):
|
||||
database_path, _ = prepare_database(tmp_path)
|
||||
experiment = ExperimentRecord(
|
||||
experiment_id=None,
|
||||
material_id="acrylic-001",
|
||||
params=ProcessingParams(
|
||||
power_percent=45,
|
||||
scan_speed_mm_s=80,
|
||||
pulse_frequency_hz=20,
|
||||
),
|
||||
metrics=QualityMetrics(kerf_width_mm=0.18),
|
||||
recorded_at=datetime.now(UTC),
|
||||
)
|
||||
|
||||
experiment_id = add_experiment(database_path, experiment)
|
||||
stored = list_experiments(database_path)
|
||||
|
||||
assert experiment_id == 1
|
||||
assert len(stored) == 1
|
||||
assert stored[0].material_id == "acrylic-001"
|
||||
assert stored[0].params == experiment.params
|
||||
assert stored[0].metrics == experiment.metrics
|
||||
Reference in New Issue
Block a user