48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from app.ml.feature_store import FeatureStore, FeatureVector
|
|
from app.ml.training import TrainingPipeline, TrainedArtifact
|
|
|
|
|
|
def _vector(sensor_id: str, temperature: float, label: str | None = None) -> FeatureVector:
|
|
return FeatureVector(sensor_id=sensor_id, values={"temperature": temperature}, label=label)
|
|
|
|
|
|
def store_with_data() -> TrainingPipeline:
|
|
store = FeatureStore()
|
|
store.add_batch(
|
|
[
|
|
_vector("sensor.kitchen", 19.0),
|
|
_vector("sensor.kitchen", 20.0),
|
|
_vector("sensor.bedroom", 18.5),
|
|
]
|
|
)
|
|
return TrainingPipeline(store)
|
|
|
|
|
|
def test_run_returns_trained_artifact() -> None:
|
|
pipeline = store_with_data()
|
|
artifact = pipeline.run("artifact_v1")
|
|
assert artifact.artifact_id == "artifact_v1"
|
|
assert artifact.supported_sensors == ("sensor.bedroom", "sensor.kitchen")
|
|
|
|
|
|
def test_run_without_data_raises_value_error() -> None:
|
|
pipeline = TrainingPipeline(FeatureStore())
|
|
with pytest.raises(ValueError):
|
|
pipeline.run("artifact_v1")
|
|
|
|
|
|
def test_export_returns_registered_artifact() -> None:
|
|
pipeline = store_with_data()
|
|
pipeline.run("artifact_v1")
|
|
exported = pipeline.export("artifact_v1")
|
|
assert exported == pipeline.export("artifact_v1")
|
|
|
|
|
|
def test_export_missing_artifact_raises_key_error() -> None:
|
|
pipeline = store_with_data()
|
|
with pytest.raises(KeyError):
|
|
pipeline.export("artifact_v1") |