Add python_sensor_logger/tests/test_core.py
This commit is contained in:
parent
5991b59eb8
commit
a0ad800ec1
1 changed files with 94 additions and 0 deletions
94
python_sensor_logger/tests/test_core.py
Normal file
94
python_sensor_logger/tests/test_core.py
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
import json
|
||||
import os
|
||||
import time
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
|
||||
import src.python_sensor_logger.core as core
|
||||
|
||||
|
||||
def test_read_temperature_returns_float(monkeypatch):
|
||||
mock_value = 23.456
|
||||
with mock.patch('src.python_sensor_logger.core.read_temperature', return_value=mock_value):
|
||||
result = core.read_temperature()
|
||||
assert isinstance(result, float), 'Rückgabewert sollte float sein'
|
||||
assert result == pytest.approx(mock_value)
|
||||
|
||||
|
||||
def test_log_temperature_creates_valid_json(tmp_path):
|
||||
file_path = tmp_path / 'temperature_log.json'
|
||||
|
||||
timestamp = time.time()
|
||||
temperature = 22.5
|
||||
|
||||
# Sicherstellen, dass Datei noch nicht existiert
|
||||
if file_path.exists():
|
||||
file_path.unlink()
|
||||
|
||||
# Funktion aufrufen
|
||||
with mock.patch('src.python_sensor_logger.core.os.path.exists', return_value=False):
|
||||
core.log_temperature(timestamp, temperature)
|
||||
|
||||
# Wenn Datei nicht vom Mock erstellt, selbst prüfen
|
||||
if not file_path.exists():
|
||||
# Versuch, Standardpfad zu prüfen
|
||||
default_path = Path('output/temperature_log.json')
|
||||
if default_path.exists():
|
||||
file_path = default_path
|
||||
|
||||
assert file_path.exists(), 'JSON-Datei sollte nach log_temperature existieren'
|
||||
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Je nach Implementation: Liste oder einzelner Eintrag
|
||||
if isinstance(data, list):
|
||||
entry = data[-1]
|
||||
else:
|
||||
entry = data
|
||||
|
||||
assert 'timestamp' in entry, 'timestamp-Feld fehlt'
|
||||
assert 'temperature' in entry, 'temperature-Feld fehlt'
|
||||
|
||||
# Validate value types
|
||||
assert isinstance(entry['timestamp'], float)
|
||||
assert isinstance(entry['temperature'], float)
|
||||
assert entry['temperature'] == pytest.approx(temperature)
|
||||
|
||||
|
||||
def test_log_temperature_appends_data(tmp_path):
|
||||
file_path = tmp_path / 'temp_log.json'
|
||||
|
||||
# Erstes Logging
|
||||
first_ts = time.time()
|
||||
first_temp = 20.0
|
||||
core.log_temperature(first_ts, first_temp)
|
||||
|
||||
assert os.path.exists('output/temperature_log.json') or file_path.exists()
|
||||
|
||||
# Zweites Logging
|
||||
second_ts = time.time() + 5
|
||||
second_temp = 21.0
|
||||
core.log_temperature(second_ts, second_temp)
|
||||
|
||||
# Datei überprüfen
|
||||
path_to_check = Path('output/temperature_log.json') if Path('output/temperature_log.json').exists() else file_path
|
||||
with open(path_to_check, 'r', encoding='utf-8') as f:
|
||||
records = json.load(f)
|
||||
|
||||
assert isinstance(records, list), 'JSON sollte eine Liste sein'
|
||||
timestamps = [r['timestamp'] for r in records]
|
||||
temps = [r['temperature'] for r in records]
|
||||
|
||||
assert first_ts in timestamps or pytest.approx(first_ts) in timestamps
|
||||
assert any(pytest.approx(second_temp, rel=1e-3) == t for t in temps)
|
||||
|
||||
|
||||
def test_temperature_validation():
|
||||
invalid_inputs = [None, 'NaN', [], {}]
|
||||
for invalid_temp in invalid_inputs:
|
||||
with pytest.raises((TypeError, AssertionError)):
|
||||
core.log_temperature(time.time(), invalid_temp)
|
||||
Loading…
Reference in a new issue