from __future__ import annotations import numpy as np, h5py from sfm.database import SeismoDb from sfm.waveform_store import WaveformStore from scripts.backfill_event_shape import backfill_shape from minimateplus.models import Event def _h5(path, long): with h5py.File(path, "w") as f: g = f.create_group("samples") for k in ("Tran", "Vert"): g.create_dataset(k, data=np.zeros(1024, "float32")) g.create_dataset("Long", data=np.asarray(long, "float32")) def test_backfill_updates_shape_and_is_idempotent(tmp_path): db = SeismoDb(tmp_path / "s.db") store = WaveformStore(tmp_path / "waveforms") ev = Event(index=0) ev._waveform_key = bytes.fromhex("0111abcd") db.insert_events([ev], serial="BE1", waveform_records={ev._waveform_key.hex(): {"filename": "F.CE0W", "filesize": 10}}) # place the .h5 where store.paths_for expects it long = np.zeros(1024); long[100] = 0.48 _h5(store.hdf5_path_for("BE1", "F.CE0W"), long) c1 = backfill_shape(db, store) assert c1["updated"] == 1 row = db.query_events(serial="BE1")[0] assert row["shape_axis"] == "Long" and row["shape_near_peak_count"] <= 3 c2 = backfill_shape(db, store) # idempotent: re-run overwrites same values assert db.query_events(serial="BE1")[0]["shape_crest_factor"] == row["shape_crest_factor"]