Add measurement_logging/tests/test_core.py
This commit is contained in:
parent
78111432a8
commit
9246676a95
1 changed files with 110 additions and 0 deletions
110
measurement_logging/tests/test_core.py
Normal file
110
measurement_logging/tests/test_core.py
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
import csv
|
||||||
|
import tempfile
|
||||||
|
from pathlib import Path
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
# Da tested_module null ist, importiere direkt aus dem Paketnamen
|
||||||
|
from measurement_logging import core
|
||||||
|
|
||||||
|
|
||||||
|
def test_log_measurement_creates_csv_with_correct_columns():
|
||||||
|
headers = ["time", "temperature", "humidity", "iso", "exposure", "rms_noise"]
|
||||||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
|
csv_path = Path(tmpdir) / "measurements.csv"
|
||||||
|
|
||||||
|
# Aufruf der Funktion mit Dummy-Werten
|
||||||
|
core.log_measurement(
|
||||||
|
time="22:30:00",
|
||||||
|
temperature=12.5,
|
||||||
|
humidity=80.2,
|
||||||
|
iso=1600,
|
||||||
|
exposure=1.25,
|
||||||
|
rms_noise=0.003
|
||||||
|
)
|
||||||
|
|
||||||
|
# Im vorgesehenen Pfad überprüft die Funktion, ob Datei existiert
|
||||||
|
# Test simuliert durch Schreiben in tmpdir
|
||||||
|
core.log_measurement(
|
||||||
|
time="22:30:00",
|
||||||
|
temperature=12.5,
|
||||||
|
humidity=80.2,
|
||||||
|
iso=1600,
|
||||||
|
exposure=1.25,
|
||||||
|
rms_noise=0.003
|
||||||
|
)
|
||||||
|
|
||||||
|
# Nun manuelles Schreiben in csv_path, da Datei intern fest definiert sein könnte
|
||||||
|
# Wir prüfen Struktur und Inhalt
|
||||||
|
core.log_measurement(
|
||||||
|
time="22:31:00",
|
||||||
|
temperature=13.2,
|
||||||
|
humidity=79.5,
|
||||||
|
iso=1600,
|
||||||
|
exposure=1.0,
|
||||||
|
rms_noise=0.004
|
||||||
|
)
|
||||||
|
|
||||||
|
# Statt reale Datei, testen wir die Funktion separat mit lokaler CSV
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w+', newline='', suffix='.csv') as tmp:
|
||||||
|
tmp_path = Path(tmp.name)
|
||||||
|
# Erstelle CSV über interne Funktion
|
||||||
|
core.csv_output_path = tmp_path # Falls Funktion dynamisch Pfad nutzt
|
||||||
|
core.log_measurement(
|
||||||
|
time="23:00:00",
|
||||||
|
temperature=10.0,
|
||||||
|
humidity=75.0,
|
||||||
|
iso=800,
|
||||||
|
exposure=2.0,
|
||||||
|
rms_noise=0.001
|
||||||
|
)
|
||||||
|
tmp.seek(0)
|
||||||
|
reader = csv.reader(tmp)
|
||||||
|
rows = list(reader)
|
||||||
|
|
||||||
|
assert rows[0] == headers, "CSV sollte Header mit korrekten Spaltennamen enthalten."
|
||||||
|
assert len(rows) == 2, "CSV sollte eine Kopfzeile und eine Datenzeile enthalten."
|
||||||
|
|
||||||
|
|
||||||
|
def test_log_measurement_appends_rows():
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w+', newline='', suffix='.csv', delete=False) as tmp:
|
||||||
|
tmp_path = Path(tmp.name)
|
||||||
|
try:
|
||||||
|
# Erste Messung schreiben
|
||||||
|
core.log_measurement(
|
||||||
|
time="00:00:00",
|
||||||
|
temperature=5.0,
|
||||||
|
humidity=60.0,
|
||||||
|
iso=400,
|
||||||
|
exposure=1.2,
|
||||||
|
rms_noise=0.002
|
||||||
|
)
|
||||||
|
|
||||||
|
# Zweite Messung schreiben
|
||||||
|
core.log_measurement(
|
||||||
|
time="00:10:00",
|
||||||
|
temperature=6.0,
|
||||||
|
humidity=61.0,
|
||||||
|
iso=400,
|
||||||
|
exposure=1.1,
|
||||||
|
rms_noise=0.0018
|
||||||
|
)
|
||||||
|
|
||||||
|
# Lesen und prüfen
|
||||||
|
with open(tmp_path, newline='') as f:
|
||||||
|
reader = list(csv.reader(f))
|
||||||
|
# Header und zwei Datenzeilen erwartet
|
||||||
|
assert len(reader) >= 3, "Es sollten mindestens 2 Messzeilen plus Header geschrieben werden."
|
||||||
|
finally:
|
||||||
|
tmp_path.unlink(missing_ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
def test_log_measurement_rejects_invalid_types():
|
||||||
|
with pytest.raises((TypeError, ValueError)):
|
||||||
|
core.log_measurement(
|
||||||
|
time=12345, # Sollte str sein
|
||||||
|
temperature="warm", # Sollte float sein
|
||||||
|
humidity=50.0,
|
||||||
|
iso=800,
|
||||||
|
exposure=1.0,
|
||||||
|
rms_noise=0.001
|
||||||
|
)
|
||||||
Loading…
Reference in a new issue